Avatar billede ahara Nybegynder
16. juli 2006 - 14:02 Der er 11 kommentarer

Tegne controls

Har lige et generelt spørgsmål til hvornår der tegnes i c#. Hvis jeg nu har et antal controls som jeg ønsker tegnet på min form og dette er placeret i en forløkke så benytter jeg følgende: 

this.panel2.Controls.Add(myList[i,j])

Ved at benytte ovenstående tegnes tingene løbende. Er der en metode til at tegne alt på en gang?

Tak
AHR
Avatar billede md_craig Nybegynder
16. juli 2006 - 18:56 #1
Double Buffering

http://msdn2.microsoft.com/en-us/library/4xew49b4.aspx

Den tegner det stadig slavisk, men den viser et skærmbillede (prerenderet), og tegner det næste til en buffer...
Avatar billede ahara Nybegynder
16. juli 2006 - 23:07 #2
Virker fint hvis jeg ligger det i form_load, men jeg har en tabControl og hvis jeg trykker på en af de andre faneblade så "flimrer" det også på de sider. Skal nedenstående placeres i hver funktion (det kan jeg heller ikke få ti lat virke) eller?

this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint , true);

Tak
AHR
Avatar billede md_craig Nybegynder
16. juli 2006 - 23:24 #3
Jeg smider det som regel i Constructoren... plejer at virke fint..
.NET 2.0 har en optimized buffer...

bruger selv denne linie:

this.SetStyle(
    ControlStyles.UserPaint |
    ControlStyles.AllPaintingInWmPaint |
    ControlStyles.OptimizedDoubleBuffer, true);

ControlStyles.UserPaint er i forbindelse med at man laver sine egne controls, så den undlader du hvis du arver fra form... så på Forms:

this.SetStyle(
    ControlStyles.AllPaintingInWmPaint |
    ControlStyles.OptimizedDoubleBuffer, true);

Ellers er der måske lidt mere at hente her... du kan fx se at

- DoubleBuffer
If true, drawing is performed in a buffer, and after it completes, the result is output to the screen. Double-buffering prevents flicker caused by the redrawing of the control. If you set DoubleBuffer to true, you should also set UserPaint and AllPaintingInWmPaint to true.

http://msdn2.microsoft.com/en-us/library/system.windows.forms.controlstyles.aspx

Men som sagt, jeg plejer bare at smide det i constructoren på min form, eller custom control hvis det er sådan en jeg laver...
Avatar billede ahara Nybegynder
17. juli 2006 - 19:12 #4
Har hentet følgende, men jeg kan ikke benytte OptimizedDoubleBuffer:

.NET Framework Version 2.0 Redistributable Package

Filen er hentet fra:

http://msdn.microsoft.com/netframework/downloads/updates/default.aspx

Jeg har nu også lagt den i constructoren, men når jeg vælger de forskellige faneblade i min tabControl har jeg stadig samme problem, hvor mine controls tegnes løbende.

Har du en ide til hvad jeg ellers kan gøre eller hvad jeg gør forkert :-)

Tak
AHR
Avatar billede md_craig Nybegynder
17. juli 2006 - 23:43 #5
Hvis du arbejder i VS2003 kan du ikke arbejde med .NET 2.0 så skal du bruge det andet...

Men ved ikke hvad mere du kan gøre... du kan evt. prøve at smide koden til hele formen eller noget? så kan jeg se om jeg kan kigge på det
Avatar billede ahara Nybegynder
18. juli 2006 - 10:19 #6
I consturctoren ligger nu DoubleBuffer:

public Form1()
{
    this.SetStyle(
        ControlStyles.UserPaint |
        ControlStyles.AllPaintingInWmPaint |
        ControlStyles.DoubleBuffer, true);
    InitializeComponent();
}

Når jeg trykker på et faneblad på min tabControl benyttes nedenstående (

private void tabpageDown(object sender, System.EventArgs e)
{
    for(int i=0;i<gridSize;i++)
    {
        for(int j=0;j<gridSize;j++)
        {
            if(tabControl1.SelectedIndex == 0)
            {
                this.panel1.Controls.Add(pbList[i,j]);
                deleteGrid();
            }
            else if(tabControl1.SelectedIndex == 2)
            {
                this.panel2.Controls.Add(pbList[i,j]);
                deleteGrid();
            }
        }
    }
}

Det skal siges at jeg benyttes samme PictureBoxes som jeg tegner i to forskellige panels afhængigt af hvilket faneblad jeg befinder mig i. Kan det være det der er problemet?
Avatar billede md_craig Nybegynder
18. juli 2006 - 12:25 #7
Jeg forstår ikke helt hvorfor du vil adde den hver gang du skifter faneblad...
Hvorfor ikke bare lade dem ligge i henholdsvis Panel 1 og 2??
Tabcontrol sørger selv for at tegne de rigtige panels... eller direkte på tabpage?

this.tabPage1.Controls.Add(pbList[i,j]);

Når du sætter double buffer på så tegner den alt til en buffer før den viser det på skærmen... så at placere det i constructoren burde være nok... men hvis det at tegne formen bliver et for tungt arbejde... så bliver det desvære meget svært at gøre noget ved da den ikke kan producere billederne hurtigt nok til at den skal vise dem...

og det er det eneste jeg tror der kan være problemet her, da det at tegne et grid af pictureboxes ikke nødvendigvis er en let sag...

Men du kan forbedre den ved ikke at tilføre det arbejde det er at tilføje samtlige pictureboxes hver gang du skifter fane blad...

Du kan desuden kører en Foreach over din pbList istedet for 2 forløkker...
Avatar billede ahara Nybegynder
18. juli 2006 - 12:58 #8
Grunden til at jeg ikke tegner i begge panels skyldes at når det er de samme pictureBoxes jeg ønsker tegnet i flere panels så er det kun den sidst tilføjede der tegnes. I nedenstående er det kun i panel2 min pictureBoxes tegnes.

private void Form1_Load(object sender, System.EventArgs e)
{
    int panelHeight = panel1.Size.Height;
    int panelWidth = panel1.Size.Width;
    pbList = new PictureBox[gridSize,gridSize];

    Queue myQueue = new Queue();

    for(int i=0;i<gridSize;i++)
    {
        for(int j=0;j<gridSize;j++)
        {
            PictureBox pb = new PictureBox();                                pb.Height = panelHeight/gridSize;
            pb.Width = panelWidth/gridSize;
            pb.BorderStyle = BorderStyle.FixedSingle;
            pb.Location = new System.Drawing.Point(j*pb.Width, i*pb.Height);
            pb.BackColor = System.Drawing.Color.White;
            pb.MouseDown += new MouseEventHandler(this.mouseDown);
            pb.MouseUp += new MouseEventHandler(this.mouseUp);
            pb.MouseMove += new MouseEventHandler(this.mouseMove);
            pb.Click += new EventHandler(this.mouseClick);
   
            pbList[i,j] = pb;
            this.panel1.Controls.Add(pbList[i,j]);
                        this.panel2.Controls.Add(pbList[i,j]);
        }
    }
}
Avatar billede md_craig Nybegynder
18. juli 2006 - 15:38 #9
Jeg tror ikke du forstod det jeg sagde... Hvilket panel der tegnes hvornår sørger Panel klassen for... det skal du ikke bekymre dig om...

Men der er ingen grund til at du i din
private void tabpageDown(object sender, System.EventArgs e)

Gentagende gange tilføjer dine Picture Boxes til dine panels... de er allerede i panelsne..

Men du skal huske at du skal ligge dine picture boxes ind i din TabPages istedet, eller du skal pute dine Panels der ind... men da en tabPage allerede er en container... så er det ikke nødvendigt med et panel... det kan du gøre hvis det er et stort tabControl hvor du ønsker af grupere forskellige ting...

Men som jeg forstår det her... så er det kun et grid af pictureboxes... så behøver du slet ikke dine panels, men kan kaste dem direkte ind i dine TabPages...

Gør du det, så sørger dine tabs for at tegne dem i det markerede tab selv når du skifter tabs...
Avatar billede ahara Nybegynder
18. juli 2006 - 15:54 #10
Du har ret i at det ikke er nødvendigt at tilføje mine pictureBoxes i

private void tabpageDown(object sender, System.EventArgs e)

Men hvis jeg ikke gør det og kun benytter

this.panel1.Controls.Add(pbList[i,j]);
this.panel2.Controls.Add(pbList[i,j]);

i Form1_load så tegnes mine pictureBoxes kun i panel2.

Jeg har lagt panel1 i tabPage0 og panel2 i tabPage2

Selve problemet er at de kun tegnes i tabPage2 med brug af ovenstående kode.
Avatar billede md_craig Nybegynder
18. juli 2006 - 16:13 #11
Mja... Klon satanerne...

Lav en CloneablePictureBox : PictureBox, ICloneable klasse... og implementer clone metoden... brug så:

foreach(CloneablePictureBox cpb in pbList)
{
  this.panel1.Controls.Add(cpb.Clone() as CloneablePictureBox);
  this.panel2.Controls.Add(cpb.Clone() as CloneablePictureBox);
}

Men jeg vil sige du bør finde noget helt andet ... jeg tror det er det at tegne den mængde af pictureboxes der tager tid til at give din flicker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester