Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #58 da revista programar. Faz já o download aqui!

LuisMiguelGT

Ajuda com Scroll

Mensagens Recomendadas

LuisMiguelGT    0
LuisMiguelGT

Bons dias a todos!

Estou com uma dúvida complicada e que já tentei resolver de diversas formas mas ainda não consegui.

Eu tenho um painel onde são desenhados rectângulos através de uma base de dados e de certas coordenadas, o que acontece é que grande parte das vezes o tamanho é maior que o ecrã e necessitava de ter uma scroll bar na vertical e outra na horizontal, ela pode ser controlada com o rato ou com o teclado, é indiferente. Eu nas opções do painel já ativei la o scroll mas para isso funcionar eu tenho que definir um certo tamanho do painel e isso não me serve porque o tamanho pode variar de acordo com o que o utlilizador necessitar.

Se alguem me conseguir ajuda ficarei muito agradecido.

Cumprimentos,

Luís Miguel

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

E não podes definir o tamanho confirme as coordenadas dos desenhos? Ves o maior X+largura e Y+altura e defines o tamanho do painel com base nisso

Editado por nelsonr

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

O panel so deve mostrar as barras de scroll se houver controls dentro deste que sejam maiores

Podes fazer assim:

Crias um painel geral (panel1), onde tem as scrollbars ligadas

Crias um painel dentro deste (panel2), com o mesmo tamanho

Fazes os desenhos no panel2.

Mudas o tamanho do panel2 de acordo com o tamanho do desenho (panel2.Width=... / panel2.Height=...)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuisMiguelGT    0
LuisMiguelGT

Ele agora não me desenha nada, será que fiz algo errado ?

Tens aqui o código se for necessário.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace PlanningProject
{
public partial class MainForm : Form
{
 private System.Drawing.Bitmap myBitMap;
    int areaX, areaY, fila_min, fila_max, linha_min, linha_max,altura_max, altura_total, largura_total, altura_quadrados;
    int largura_quadrados = 150;
    int altura_rectangulos = 30;
    int largura_rectangulos = 150;
    int posX = 40;
    int posY = 40;

 public MainForm()
 {
  InitializeComponent();
  myBitMap = new Bitmap(panel2.Width, panel2.Height);
	    panel2.Paint += Panel2Paint;
 }

 public void MainFormLoad(object sender, EventArgs e)
 {
 }

 void Button1Click(object sender, EventArgs e)
 {
  using (Graphics g = Graphics.FromImage(myBitMap))
  using (SqlConnection conn = new SqlConnection("Data Source=srvr-arsada000;Initial Catalog=ARSForma;User ID=sa;Password=nba"))
  {
   conn.Open();
   using (SqlCommand com = new SqlCommand("select * from dbo.Definicao_Areas where ID_area= '" + textBox1.Text + "'", conn))
   {
 {
  SqlDataReader reader = com.ExecuteReader();
  while (reader.Read())
  {
   fila_min = reader.GetInt32(3);
   fila_max = reader.GetInt32(4);
   linha_min = reader.GetInt32(5);
   linha_max = reader.GetInt32(6);
   altura_max = reader.GetInt32(7);
   altura_total = linha_max - linha_min;
   largura_total = fila_max - fila_min;
   altura_quadrados = altura_rectangulos * altura_max;

   areaY = altura_total * altura_quadrados;
   areaX = largura_total * largura_quadrados;

   Font f = new Font("Comic Sans MS", 7);
   Pen quadrados = new Pen(Color.Black, 2);
   Pen rectangulos = new Pen(Color.Black,1);
   Brush brush = new SolidBrush(Color.Black);
   Rectangle rec;

   for (int j = 0; (j + altura_quadrados) <= areaY; j = j + altura_quadrados)
   {
    for (int i = 0; (i + largura_quadrados) <= areaX; i = i + largura_quadrados)
				   {
	 rec = new Rectangle(posX + i, posY + j, largura_quadrados, altura_quadrados);
	 g.DrawRectangle(quadrados, rec);
    }
   }
   for (int h = 0; (h + altura_rectangulos) <= areaY; h = h + altura_rectangulos)
   {
    for (int u = 0; (u + largura_rectangulos) <= areaX; u = u + largura_rectangulos)
    {
	 rec = new Rectangle(posX + u, posY + h, largura_rectangulos, altura_rectangulos);
	 g.DrawRectangle(rectangulos, rec);
    }
   }
  }

 }
 panel2.Invalidate();
   }
  }
 }

 void Panel1Paint(object sender, PaintEventArgs e)
 {
 } // Form Panel1Paint

 void FecharToolStripMenuItemClick(object sender, EventArgs e)
 {
  this.Close();
 }

 void Panel2Paint(object sender, PaintEventArgs e)
 {
  e.Graphics.DrawImage(myBitMap, Point.Empty);
  panel2.Width = largura_total;
  panel2.Height = altura_total;
 }
}
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

Estás a atribuir a largura/altura do painel no evento de desenho do painel, podes fazer isso na função do botão, visto estes valores não mudarem.

Não me parece que a largura e altura máximas estejam a ser bem calculadas. Faz debug e vê o valor que está a ser atribuído.

Confirma que esse painel que está a ser desenhado está visivel dentro do outro

E já agora, confirma se o evento do paint está a ser chamado.

Um exemplo simples:

//
List<KeyValuePair<Point[], Color>> ListTriangulos = new List<KeyValuePair<Point[], Color>>();
//
private void button1_Click(object sender, EventArgs e)
{
Color[] colors = new Color[] { Color.Red, Color.Blue, Color.Green, Color.Yellow, Color.ForestGreen };
Random rnd = new Random();
const int MAX_TRIANGULOS = 5;

ListTriangulos.Clear();
for (int numTriangulo = 0; numTriangulo < MAX_TRIANGULOS; numTriangulo++)
{
	//
	Point[] points = new Point[]
	{
		new Point(rnd.Next(panel1.Width * 2), rnd.Next(panel1.Height * 2)),
		new Point(rnd.Next(panel1.Width * 2), rnd.Next(panel1.Height * 2)),
		new Point(rnd.Next(panel1.Width * 2), rnd.Next(panel1.Height * 2))
	};

	foreach (var point in points)
	{
		panel2.Width = Math.Max(point.X, panel2.Width);
		panel2.Height = Math.Max(point.Y, panel2.Height);
	}

	ListTriangulos.Add(new KeyValuePair<Point[], Color>(points, colors[rnd.Next(colors.Length)]));
}
panel2.Invalidate();
}

private void panel2_Paint(object sender, PaintEventArgs e)
{
using (Graphics g = panel2.CreateGraphics())
{
	foreach (var triangulo in ListTriangulos)
	{
		g.FillPolygon(new SolidBrush(triangulo.Value), triangulo.Key);
	}
}
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuisMiguelGT    0
LuisMiguelGT

Já consegui que ele desenhasse.

Eu ainda sou muito verde no c# e esse exemplo simples que dizes ai, para mim é complicado.

Preciso agora de definir o tamanho do Painel2 certo ?

EDIT

Sempre que defino as dimensões do Panel2, ele deixa de desenhar.

Editado por LuisMiguelGT

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

Colocas um breakpoint na linha que atribuis o valor à largura do painel (tecla F9).

Ao executares a aplicação, vai parar nessa linha.

Colocas o rato por cima da variavel que estás a atribuir e consegues ver o valor que lá está.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuisMiguelGT    0
LuisMiguelGT

Não estou a conseguir fazer isso, devo estar a fazer mal

Ele só me diz, "int MainForm.largura_total

Editado por LuisMiguelGT

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

Podes especificar o que não estás a conseguir fazer?

Colocas o cursor sobre a linha de código que estás a atribuir a variavel à largura do painel.

Carregas na tecla F9, que vai marcar a linha com vermelho.

Executas a aplicação normalmente.

Ao executar essa linha marcada, a aplicação vai ficar em pausa.

No visual studio, colocas o rato sobre a variavel que estás a atribuir à largura do painel.

Vês o que aparece na tooltip.

Se não parar nessa linha, confirma que estás a executar o código em modo de debug.

(deves ter na linha por baixo do menu no visual studio uma dropdown com Release ou Debug)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuisMiguelGT    0
LuisMiguelGT

È isso que estou a fazer.

Aparece isso que te mandei.

Sim, estou a executar em Debug.

Editado por LuisMiguelGT

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

Mas tens de ver isso quando o programa tiver a correr

Executas que ele para nessa linha, ficando em pausa.

Ai consegues ver o valor da variavel

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuisMiguelGT    0
LuisMiguelGT

Boas Novamente,

Desculpa só responder agora, é que tenho estado doente e só hoje é que voltei ao trabalho.

Já consegui que ele me dissesse os valores, ele apenas define o valor que eu pus para o tamanho dele, ou seja quando o criei, eu estiquei-o para ficar do tamanho do 1 que está por baixo e ele não aumenta desse tamanho, as scrollbars aparecem mas fica tudo em branco porque ele só desenha até aquele certo ponto que é o tamanho dele.

Sabes o que possa estar a fazer de errado ?

Eu estou a definir o tamanho bem acho eu.

panel2.Width = areaX;

panel2.Height = areaY;

E mais acima eu defini que:

areaY = altura_total * altura_quadrados;

areaX = largura_total * largura_quadrados;

Eu não estou mesmo a ver o que possa estar errado.

Cumprimentos,

Luis Miguel

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nelsonr    333
nelsonr

O objectivo é que o painel fique com o tamanho máximo. Dessa forma que tens fica sempre com o último tamanho atribuido às variaveis areaX e area Y.

Ou seja, antes de atribuires um novo valor ao areaX, verificas se o valor a ser atribuido é maior que o que está guardado.

É isso que no exemplo que mostrei faz com o Math.Max, em que retorna o valor máximo de dois valores passados.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
LuisMiguelGT    0
LuisMiguelGT

Sim é maior, o valor que está definido do X é 1919 e o que supostamente deveria aparecer era 29850, ele aparece na variável areaX mas depois nao passa para o Width do painel.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.