Location en Size veranderen

Status
Niet open voor verdere reacties.

Bramvr

Gebruiker
Lid geworden
25 nov 2012
Berichten
216
Beste

Ik ben bezig met een projectje waarbij veel pictureboxen worden gebruikt maar deze moeten mee verplaats en groter of kleiner worden wanneer de grote van de het form wijzigt. Ik weet hoe ik het gewoon met code kan schrijven maar is het mogelijk om gewoon een methode te schrijven waar bij ik gewoon de begin waardes mee geef en de rest in de methode wordt af gehandeld. Ik wil het zo kort mogelijk omdat het er nogal veel zijn :p

PS: Ik ben een leek op gebied van methodes.

Alvast bedankt
Bram
 
Ik denk dat wat je wilt is al ingebouwd, namelijk de 'anchor' property. Zoek deze maar eens in de properties.
Je kunt een control vastzetten aan een of meerdere kanten van het form. Deze worden groter/kleiner afhankelijk hoe je de anchor inzet.
 
Aa ok bedank daar had ik nog niet van gehoord maar er zit nog een klei probleempje bij. Ik heb in een picturebox een afbeelding staan van een grondplan van een machine park. Door middel van panels wil ik de machines kunnen inkleuren wanneer deze in werking zijn (de data wordt serieel binnen gezonden) maar het probleem is dat de afbeelding van het grondplan eerder lang is dan breed ik heb de sizemode op zoom staan omdat dit het grondplan het beste wordt weergegeven. Maar als je dan gebruik maakt van die anchor en je veranderd het formaat van het form dan komen de panels niet meer overeen met het grondplan.

Hoe kan ik dit oplossen?

Bram
 
Dan wordt het dus berekenen aan de hand van de begin afmetingen van de afbeelding en na elke size wijziging denk ik?

Kun je eens de afbeelding uploaden? Dan kan ik morgen wat proberen.

Of mischien de afbeelding in stukken knippen en per picturebox een gemarkeerde afbeelding switchen? Ik weet niet of het eenvoudig is met vierkantjes.
 
Inderdaad even lastig omdat bij zoom de afbeelding in het midden wordt gezet en gaat het alle kanten op. Ik probeer nog even verder.
 
Sorry voor de vertraging, niet veel tijd gehad om iets uit te vogelen.

Wat betreft een oplossing... ja en nee.... maar een probeersel dat 'werkt' alleen is het omslachtig en geen idee of het ongeveer is wat je zoekt, ik ben er nog niet tevreden mee :P

download projectje: http://www36.zippyshare.com/v/10612999/file.html

De panels sizen in ieder geval redelijk (waarschijnlijk iets met factor afronden naar int) mee.
De picturebox height sized afhankelijk van de width mee om de zoom te behouden en de afbeelding links boven te houden

icjnes.png



Ik weet niet of het een idee is om de hele hal te 'painten met code' in een panel in plaats van een afbeelding te gebruiken. Misschien dat ik daar nog een voorbeeldje van kan maken.
 
Dat is al in de goeie richting maar het zou precies in het vakje moeten zijn :p Is het dan niet mogelijk om en double te gebruiken?
 
Heb je het voorbeeld project niet kunnen gebruiken/aanpassen?

Ik kan nog wel dat voorbeeld maken hoe je de blokken volledig kunt 'painten' in een panel. Dan is het wel dus allemaal opbouwen met code (inc. wat nu de afbeelding is).




edit:

Dan krijg je zoiets als dit dus moet je de tekening van de hal zelf opbouwen. Dus als je niet perse de tekening hoeft te gebruiken lijkt me dit een oplossing omdat je precies in de code kunt aangeven wat je wilt, rand/opvulling/kleur (per machine etc)/naam
Hier is het opbouwen van x/y - w/h met beginpanel van 1000x500 dus met resizen is er wel iets van een factor te berekenen zoals in het vorige voorbeeld.


25014pe.png

35lsr4j.png
 
Laatst bewerkt:
Zou je dat projectje even online kunnen zetten? Liefst in C#2010

En bedankt voor de hulp!!!
 
Ik heb geen vs2010 meer, deze is in vs2013 gemaakt.

https://dl.dropboxusercontent.com/u/63676419/PaintedPanel.rar


Hier maak je dus de layout mee, heb factor toegevoegd om het panel te vergroten/verkleinen en knop rechts onder om de code van de geplaatste machines te exporteren (zodat je die daarna in de code kunt plakken en dan worden ze aangemaakt)
Alles is snel in elkaar gezet dus er is niets in classes gezet.

Je kunt vs2012/13 downloaden of het form namaken (met behulp van de designer file van het form) en de code kopiëren. Ik hoor wel of het is gelukt.

(de machine class heeft een bool property 'IsRunning' als deze true is dan zal de machine groen worden gepaint)
 
Ik denk dat ik jou 2 projecten ga combineren :p

Maar hiervoor had ik nog een vraag:
Hoe kan je de rand rond een panal dik maken nu heb ik maar een klein zwart randje
 
Er zit denk ik wel genoeg in de voorbeelden om te maken wat je nodig hebt.

Je kunt het panel in een groter panel zetten dat een zwarte achtergrond heeft of zoals de vierkantjes een rand tekenen in het paint event.

Je moet wel even volgorde in gedachte houden, code die het laatste komt wordt over alles heen gepaint. Zoals de DrawString komt nadat ik het vlak groen maak, anders is het niet zichtbaar. Zelfde als de opvulling en dan pas de rand.
 
Ik heb dit op het internet gevonden en het werkt perfect maar is het niet mogelijk om dit in een methode te gieten?

Code:
private void panel1_Paint(object sender, PaintEventArgs e){ 
  if(panel1.BorderStyle == BorderStyle.FixedSingle){
     int thickness = 3;//it's up to you
     int halfThickness = thickness/2;
     using(Pen p = new Pen(Color.Black,thickness)){
       e.Graphics.DrawRectangle(p, new Rectangle(halfThickness,
                                                 halfThickness,
                                                 panel1.ClientSize.Width-thickness,
                                                 panel1.ClientSize.Height-thickness));
     }
  }
}
 
Laatst bewerkt door een moderator:
Kan allemaal:

Stap 1:

[CPP]private void panel1_Paint(object sender, PaintEventArgs e)
{
PaintBorder();
}

private void PaintBorder()
{
if (panel1.BorderStyle == BorderStyle.FixedSingle)
{
int thickness = 3;//it's up to you
int halfThickness = thickness / 2;
using (Pen p = new Pen(Color.Black, thickness))
{
e.Graphics.DrawRectangle(p, new Rectangle(halfThickness,
halfThickness,
panel1.ClientSize.Width - thickness,
panel1.ClientSize.Height - thickness));
}
}
}[/CPP]
Methode maken, gehele code in de methode kopieren en kijken wat de foutmeldingen zijn. Nu zul je in de IDE zien dan de methode de 'e' variable niet kent, dus dan moet je deze aan de methode toevoegen. Zie Stap 2

Stap 2:

[CPP]private void panel1_Paint(object sender, PaintEventArgs e)
{
PaintBorder(e.Graphics);
}

private void PaintBorder(Graphics graphics)
{
if (panel1.BorderStyle == BorderStyle.FixedSingle)
{
int thickness = 3;//it's up to you
int halfThickness = thickness / 2;
using (Pen p = new Pen(Color.Black, thickness))
{
graphics.DrawRectangle(p, new Rectangle(halfThickness,
halfThickness,
panel1.ClientSize.Width - thickness,
panel1.ClientSize.Height - thickness));
}
}
}
[/CPP]
Nu zal het al werken, maar reference je nog wel 'panel1' in de method. Die kun je eruit halen en algemeen maken door in de method signature een panel toe te voegen zoals de graphics nu zijn toe gevoegd.

Stap 3:

[CPP]private void panel1_Paint(object sender, PaintEventArgs e)
{
PaintBorder(sender as Panel, e.Graphics);
}

private void PaintBorder(Panel panel, Graphics graphics)
{
if (panel.BorderStyle == BorderStyle.FixedSingle)
{
int thickness = 3;//it's up to you
int halfThickness = thickness / 2;
using (Pen p = new Pen(Color.Black, thickness))
{
graphics.DrawRectangle(p, new Rectangle(halfThickness,
halfThickness,
panel.ClientSize.Width - thickness,
panel.ClientSize.Height - thickness));
}
}
}
[/CPP]
Nu is alles los van het panel en kun je als je wilt optionele dingen eruit halen en als variable toevoegen aan de signature van de method. Zoals de dikte en kleur van de rand. Zie stap 4.

Stap 4:

[CPP]private void panel1_Paint(object sender, PaintEventArgs e)
{
PaintBorder(sender as Panel, e.Graphics, 3, Color.Black);
}

private void PaintBorder(Panel panel, Graphics graphics, int borderThickness, Color borderColor)
{
if (panel.BorderStyle == BorderStyle.FixedSingle)
{
int halfThickness = borderThickness / 2;

using (Pen pen = new Pen(borderColor, borderThickness))
{
graphics.DrawRectangle(
pen,
new Rectangle(
halfThickness,
halfThickness,
panel.ClientSize.Width - borderThickness,
panel.ClientSize.Height - borderThickness)
);
}
}
}
[/CPP]
Nu kun je alles instellen als je de method aanroept. Wat laatste wijzigingen om het compleet te maken en voila:

Stap 5:

[CPP]private void panel1_Paint(object sender, PaintEventArgs e)
{
var panel = (Panel)sender;

if (panel.BorderStyle == BorderStyle.FixedSingle)
{
PaintBorder(panel, e.Graphics, 3, Color.Black);
}
}

private void PaintBorder(Panel panel, Graphics graphics, int borderThickness, Color borderColor)
{
int halfThickness = borderThickness / 2;

using (Pen pen = new Pen(borderColor, borderThickness))
{
var rectangle = new Rectangle(
halfThickness,
halfThickness,
panel.ClientSize.Width - borderThickness,
panel.ClientSize.Height - borderThickness);

graphics.DrawRectangle(pen, rectangle);
}

}
[/CPP]
If statement eruit, die hoort daar niet thuis in dit geval. Losse 'rectangle' variable 'persoonlijk' leest het fijner. 'p' variable naar 'pen'

Hoop dat het maken van methodes nu een beetje duidelijker is.

Dan kun je dus zoiets als meerdere randen tekenen makkelijker doen :P

[CPP]private void panel1_Paint(object sender, PaintEventArgs e)
{
var panel = (Panel)sender;

if (panel.BorderStyle == BorderStyle.FixedSingle)
{
PaintBorder(panel, e.Graphics, 10, Color.Red);
PaintBorder(panel, e.Graphics, 8, Color.Yellow);
PaintBorder(panel, e.Graphics, 4, Color.Green);
PaintBorder(panel, e.Graphics, 2, Color.Blue);
PaintBorder(panel, e.Graphics, 1, Color.Black);
}
}[/CPP]
 
Bedankt voor de goede uitleg nu begin ik methodes te snappen :p
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan