[C#] Tekenen rechthoek

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik ondervind het volgende probleem.

Onder een knop heb ik de volgende code staan:

C#:
1
2
3
4
5
6
mySelectRectangle = new SelectRectangle(pictureBox);
mySelectRectangle.setX(287);
mySelectRectangle.setY(86);
mySelectRectangle.setWidth(50);
mySelectRectangle.setHeight(150);
mySelectRectangle.drawShape();


In drawShape staat de volgende code:

C#:
1
2
3
4
Pen myPen = new Pen(System.Drawing.Color.Red, lineThickness);
g = pictureBox.CreateGraphics();
g.DrawRectangle(myPen, x, y, width, height);
g.Dispose();


Dit gaat perfect. Op de picturebox wordt een rechthoek met de gegeven dementies getekend.
Wanneer ik een negatieve waarde invoer voor de height en width (-50 en -150), dan wordt er niet getekend 8)7

Weet iemand hoe het wél mogelijk is om een rechthoek te tekenen met negatieve waarden.
Overigens gaat bovenstaande code goed voor het tekenen van een ellipse. Dus ook tekenen met negatieve waarden,..

Acties:
  • 0 Henk 'm!

  • Haijo
  • Registratie: Februari 2006
  • Laatst online: 21-09-2024
Ik zou de beschrijving van de aangeroepen methoden opzoeken want waarschijnlijk pakken die de negatieve getallen niet. Het zou op zich wel logisch zijn aangezien op een scherm een x en een y altijd hoger zijn dan 0. Wat wil je hier eigenlijk mee bereiken? Dat je 100 pixels links van de vorige plek gaat tekenen? Dan kan je natuurlijk ook als waarde meegeven: Huidige waarde-100.

Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 19-09 17:19
Een object kan natuurlijk niet een negatieve breedte of hoogte hebben (je kan niet zeggen dat een persoon -1,8m is bijvoorbeeld), als je het rechthoek de andere kant op wil tekenen, moet je van je x en y coördinaten de breedte cq hoogte van het rechthoek aftrekken.

[ Voor 12% gewijzigd door Invisible_man op 07-07-2009 12:52 ]


Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Dementies? Ja, heb ik ook last van. >:)

Hetzelfde effect kan je bereiken door (de positieve) hoogte en breedte af te trekken van de X en Y positie.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wel vreemd dat het met een ellipse wel gewoon werkt.
Het enige verschil is dat ipv g.DrawRectangle er dan g.DrawEllipse staat.
Zoals gezegd, het tekenen van een Ellipse met een negatieve height en width gaat wel goed.

Acties:
  • 0 Henk 'm!

Verwijderd

if X<0
{ width = width + X
X= 0
}

de C# noob heeft gesproken, /thread :P


edit: niet goed gelezen 8)7

[ Voor 16% gewijzigd door Verwijderd op 07-07-2009 14:48 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik kan niet direct in de documentatie vinden waarom er geen negatieve waarden aan de methode mee gegeven worden, maar ik vind het niet zo vreemd. Een rechthoek die -100 breed is kan je IMHO immers niet zien.

Maar het is toch heel eenvoudig.

C#:
1
2
3
4
5
6
7
8
9
10
if( width < 0 )
{
    x += width;
    width = -width;
}
if(heigth < 0)
{
    y+= heigth;
    heigth = -heigth;
}

Voor je draw call zetten en het gaat wel goed.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • BamSlam_
  • Registratie: Juni 2001
  • Niet online
Modbreak:Het is niet nodig om een flauwe off-topic reactie te plaatsen, en zeker niet als je verder niks aan het topic toe te voegen hebt.

[ Voor 76% gewijzigd door Woy op 07-07-2009 15:38 ]


Acties:
  • 0 Henk 'm!

  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
Oplossing is eenvoudig.

De 0,0 coordinaten van de betreffende control liggen linksboven. Met negatieve waarden teken je dus buiten de control om.

Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 19-09 17:19
EvilB2k schreef op dinsdag 07 juli 2009 @ 15:22:
Oplossing is eenvoudig.

De 0,0 coordinaten van de betreffende control liggen linksboven. Met negatieve waarden teken je dus buiten de control om.
Dat is niet wat hij bedoeld, hij bedoeld dat hij de breedte en hoogte van een rechthoek wil opgeven met negatieve waarden met het idee dat deze dan respectievelijk links en boven van het opgegeven locatiecoördinaat wordt getekend ipv daar rechts en onder van.

Acties:
  • 0 Henk 'm!

Verwijderd

picturebox groot genoeg?
refresh wordt aangeroepen? :)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 07 juli 2009 @ 16:14:
picturebox groot genoeg?
refresh wordt aangeroepen? :)
Hij geeft aan dat het met dezelfde waardes en een Ellipse wel goed gaat. Ik heb het ook even getest, en inderdaad kan een DrawRectangle niet omgaan met negatieve Width/Height ( Wat ik niet gek vind ) maar een DrawEllipse call wel. Het enige vreemde vind ik het verschil tussen DrawRectangle en DrawEllipse, maar de oplossing is erg eenvoudig en al in het topic genoemd.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Woy schreef op dinsdag 07 juli 2009 @ 15:10:
[...]
Maar het is toch heel eenvoudig.
[...]
Voor je draw call zetten en het gaat wel goed.
Niet geheel netjes in mijn mening. (maar dat is mijn mening)
C#:
1
2
3
4
5
6
7
8
int x=287; int y=86; int width=50; int height=150;

mySelectRectangle = new SelectRectangle(pictureBox); 
mySelectRectangle.setX(System.Math.Min(x,x+width)); 
mySelectRectangle.setY(System.Math.Min(y,y+height)); 
mySelectRectangle.setWidth(System.Math.Abs(width)); 
mySelectRectangle.setHeight(System.Math.Abs(height)); 
mySelectRectangle.drawShape();

Veel netter :P

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 00:16

Matis

Rubber Rocket

Klopt, alleen zou je theoretisch toch een negatieve breedte aan kunnen geven.

Wanneer de oorsprong van je rechthoek op 100,100 ligt en je tekent een -100,-100 rechthoek, dan zou je verwachten dat dat toch ook zou moeten werken ;)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
dusty schreef op dinsdag 07 juli 2009 @ 17:06:
[...]

Niet geheel netjes in mijn mening. (maar dat is mijn mening)
C#:
1
2
3
4
5
6
7
8
int x=287; int y=86; int width=50; int height=150;

mySelectRectangle = new SelectRectangle(pictureBox); 
mySelectRectangle.setX(System.Math.Min(x,x+width)); 
mySelectRectangle.setY(System.Math.Min(y,y+height)); 
mySelectRectangle.setWidth(System.Math.Abs(width)); 
mySelectRectangle.setHeight(System.Math.Abs(height)); 
mySelectRectangle.drawShape();

Veel netter :P
Dan zou ik het toch anders doen. ( Sowieso de setX en setY vervangen door X en Y properties )
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class SelectionRectangle
{
    public int X {
        get;
        set;
    }

    public int Y {
        get;
        set;
    }

    private int width;
    public int Width
    {
        get { return width; }
        set
        {
            width = Math.Abs(value);
            if (value < 0)
                X -= width;
        }
    }

    private int height;
    public int Height
    {
        get { return height; }
        set
        {
            height = Math.Abs(value);
            if (value < 0)
                Y -= height;
        }
    }
}

Maar opzich is het voor een selection-rectangle nog niet zo gek dat hij een negatieve width en height heeft, aangezien je dan met X,Y aan kunt geven waar de selection gestart is.

[ Voor 6% gewijzigd door Woy op 07-07-2009 17:19 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Probleem in je code is nu dat je wel eens de width of de height kunt setten voordat je de X of Y toekent :P

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
dusty schreef op dinsdag 07 juli 2009 @ 17:37:
Probleem in je code is nu dat je wel eens de width of de height kunt setten voordat je de X of Y toekent :P
:X oops, natuurlijk.

Maar als het niet wenselijk is om negatieve getallen toe te staan is het misschien beter om een exception te gooien.

Maar ik zou het denk gewoon in de Draw functie oplossen, want zoals ik in mijn vorige post zei, is het voor een SelectionRectangle nog niet zo vreemd dat je een negatieve width/height hebt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hier kan ik wel mee verder. Hij tekent nu wel een rechthoek naar links toe, alleen nog niet zoals ik wil. Maar daar zal ik mij verder op gooien. iig THNX voor de reacties!
Pagina: 1