Ugly Function! Kann man das schöner machen?
-
Hi,
ich habe eine Funktion geschrieben die mir ein unausgefülltes Rechteck der größe 32x32 an einer X-Beliebigen X/Y Koordiante malt. Aber dieses viele MoveToEx und LineTo gefällt mir noch nicht so ganz. Gibt es da irgendwie andere Möglichkeiten den selben effekt zu erzielen mit weniger code?
void drawRect (HDC hdc, int x, int y) { HPEN pen = CreatePen (PS_SOLID,1, RGB(255,0,0)); SelectObject (hdc, pen); MoveToEx (hdc, x, y, NULL); LineTo (hdc, x+32, y); MoveToEx (hdc, x+32, y, NULL); LineTo (hdc, x+32, y+32); MoveToEx (hdc, x+32, y+32, NULL); LineTo (hdc, x, y+32); MoveToEx (hdc, x, y+32, NULL); LineTo (hdc, x, y); DeleteObject (pen); }
-
Ich glaube du programmierst noch nicht so lange mit WinAPI, ich finde das sieht noch gut aus. Ich habe schon schlimmere Konstruktionen gehabt ....
Nein ich denke da kannst du nichts mehr optimieren, das sind geometrische Zeichenanweisung hintereinader geschrieben. Das ist so, bzw ich wüsste nicht wie man das ändern soll...
-
flammenvogel schrieb:
Ich glaube du programmierst noch nicht so lange mit WinAPI, ich finde das sieht noch gut aus. Ich habe schon schlimmere Konstruktionen gehabt ....
Wie sähe denn eine bessere variante aus?

-
besser?
Das ist doch gut ...
-
flammenvogel schrieb:
Ich glaube du programmierst noch nicht so lange mit WinAPI
du sicher auch nicht.
--> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/linecurv_10bp.asp
-
Oh ne, jetzt geht das los ...
Doch ich progge schon zwei jahre mit WinApi. Zugegben die Lösung mit PolyLine ist natürlich kürzer. Ich halte es aber für besser den alten Code beizubehalten.
Begründung: Ich bin es auch von OpenGl gewohnt Linen wie oben im Code zu definieren (eher Dreiecke in OpenGL). Wie immer führen viele Wege nach Rom ...
Außerdem beschäftige ich mich auch nicht so sehr mit Code Optimierung. Die Ressourcen die heute zur Verfügung stehen sind so größzügig, das man das Optimieren dem Kompiler überlassen sollte.
-
Sind nicht zumindest die mittleren MoveToEx überflüssig:
If LineTo succeeds, the current position is set to the specified ending point.
Außerdem solltest du den alten Pen sichern und wieder herstellen, nachdem du deinen Pen ausgebraucht hast (man sollte in der Regel nie etwas löschen, was noch in einen DC selektiert ist)
Meine Lösung (wenn du LineTo beibehalten willst) sähe dann so aus:
void drawRect (HDC hdc, int x, int y) { HPEN hPen = CreatePen (PS_SOLID,1, RGB(255,0,0)); HPEN hOldPen = (HPEN) SelectObject (hdc, hPen); MoveToEx (hdc, x, y, NULL); LineTo (hdc, x+32, y); LineTo (hdc, x+32, y+32); LineTo (hdc, x, y+32); LineTo (hdc, x, y); SelectObject (hdc, hOldPen); DeleteObject (hPen); }
-
BOOL Draw32x32Rect(HDC hdc, int x, int y) { return Rectangle(hdc, x, y, x+32, y+32); }bzw. wenn das mit dem pen unbedingt da drinnen stehn soll:
BOOL Draw32x32Rect(HDC hdc, int x, int y) { HPEN pen = CreatePen (PS_SOLID, 1, RGB(255,0,0)); HGDIOBJ oldObj = SelectObject (hdc, pen); BOOL rc = Rectangle(hdc, x, y, x+32, y+32); DeleteObject(SelectObject(hdc,oldObj)); return rc; }
-
Jo, es ist allgemein nicht sehr sinnvoll eine so fest definierte Funktion zu schreiben. Ich meine was wird dann wenn du das nächste mal ein Rechteck der größe 64x64 brauchst? Hast du dann irgendwann:
Draw32x32Rect
Draw64x64Rect
...
Wie schon erwähnt wurde ist auch das erstellen des Pens in der funktion keine wirklich glanzvolle Idee, und wenn schon, dann musst man wenigstens eine Möglichkeit haben die Farbe mit an die Funktion zu übergeben, sonst kommen wir irgendwann zu:
Draw32x32RectInGreen
Draw32x32RectInBlue
Draw32x32RectInPurple
Draw64x64RectInGreen
Draw64x64RectInBlue
Draw64x64RectInPurple