Jump to content
LuisMiguelGT

Ajuda com Scroll

Recommended Posts

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

Share this post


Link to post
Share on other sites
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

Edited by nelsonr

Share this post


Link to post
Share on other sites
LuisMiguelGT

Obirgado pela rápida resposta.

Se dá eu não sei fazer porque onde eu defino o tamanho é nas propriedades do Painel.

Share this post


Link to post
Share on other sites
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=...)

Share this post


Link to post
Share on other sites
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;
 }
}
}

Share this post


Link to post
Share on other sites
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);
	}
}
}

Share this post


Link to post
Share on other sites
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.

Edited by LuisMiguelGT

Share this post


Link to post
Share on other sites
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á.

Share this post


Link to post
Share on other sites
LuisMiguelGT

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

Ele só me diz, "int MainForm.largura_total

Edited by LuisMiguelGT

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites
LuisMiguelGT

È isso que estou a fazer.

Aparece isso que te mandei.

Sim, estou a executar em Debug.

Edited by LuisMiguelGT

Share this post


Link to post
Share on other sites
LuisMiguelGT

A mim aparece isto.

hGSzZzc.png

Está errado, certo?

Edited by LuisMiguelGT

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.