Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Verständnisfrage zu Pen und Brush (https://www.delphipraxis.net/187266-verstaendnisfrage-zu-pen-und-brush.html)

delphifan2004 12. Nov 2015 19:04

Verständnisfrage zu Pen und Brush
 
Hallo,

ich experimentiere gerade wieder mal mit native WIN API. Da tut sich folgendes Problem auf, das ich zunächst mit etwas Code zeigen will:

Code:
        RedBrush := CreateSolidBrush(RGB(255, 0, 0));
        RedBrushOld := SelectObject(WndDC, RedBrush);
        Rectangle(WndDC, 80, 10, 100, 90);
Nun seien im Programm mehrere Rechtecke mit unterschiedlichen Farben gefüllt worden nur nicht Rot.

Zum Beispiel:
Delphi-Quellcode:
        SelectObject(WndDC, GreenHatchBrushOld);
        DeleteObject(GreenHatchBrush);
Nun aber will ich wieder ein Rechteck mit roter Farbe füllen.

Delphi-Quellcode:
       SelectObject(WndDC, RedBrushOld);
       RoundRect(WndDC, 30, 220, 180, 350, 35, 35);
Dieses Füllen funktioniert aber nicht. Ich verwende ein Demo, bei dem ich nun die Farbe eines schon mal gezeichneten Rechteckes verändern will.

Was mache ich da falsch?

Mit SelectObject verwendet Widows zwar den gleichen Device-Context. Dies aber hat doch nicht etwa Auswirkungen auch bereits erzeugte Objekte?

mensch72 12. Nov 2015 19:24

AW: Verständnisfrage zu Pen und Brush
 
SelectObject(WndDC, RedBrushOld);
RoundRect(WndDC, 30, 220, 180, 350, 35, 35);

In "SelectObject" vor dem Zeichnen gehört immer das "neue" auszuwählende Object!
In "SelectObject" vor dem Freigeben gehört immer ein default(GetStockObject)/anderes/"altes"(..Old) Object!

//-----------------------------------------------------
OldBrush:=SelectObject(WndDC, GetStockObject(BLACK_BRUSH)); // DummySelect nur zum Abholen des vorherigen Brush
RedBrush := CreateSolidBrush(RGB(255, 0, 0));
BlueBrush := CreateSolidBrush(RGB(0,255, 0));
GreenBrush := CreateSolidBrush(RGB(0,0,255));
//-----------------------------------------------------

SelectObject(WndDC, RedBrush);
Rectangle(WndDC, 80, 10, 100, 90);

SelectObject(WndDC, BlueBrush);
Rectangle(WndDC, 180, 110, 200, 190);

SelectObject(WndDC, GreenBrush);
Rectangle(WndDC, 280, 210, 300, 290);

SelectObject(WndDC, RedBrush);
RoundRect(WndDC, 330, 320, 480, 350, 35, 35);

SelectObject(WndDC, BlueBush);
RoundRect(WndDC, 430, 420, 580, 450, 35, 35);

SelectObject(WndDC, GreenBrush);
RoundRect(WndDC, 530, 520, 680, 550, 35, 35);

//-----------------------------------------------------
SelectObject(WndDC, OldBrush);
DeleteObject(GreenBrush);
DeleteObject(BlueBrush);
DeleteObject(RedBrush);
//-----------------------------------------------------

Luckie 12. Nov 2015 19:36

AW: Verständnisfrage zu Pen und Brush
 
Prinzipielles Vorgehen:
1. Alten Brush merken (sichern)
2. Neuen Brush erstellen
3. Mit neuen Brush was machen, ist so lange gültig bis neuer Brush erstellt oder alter Brush wieder hergestellt wird
4. Alten Brush wieder zu weisen, wenn mit allen fertig.

Analogie Pinsel und Farbkasten. Ich merke mir welche Farbe ich vorher am Pinsel hatte. Tauchen den Pinsel in die neue Farbe. Male damit rum. jetzt bin ich damit fertig und machen den Pinsel im Wasser sauber (DeleteObject) und tauche ihn wieder in die gemerkte Farbe.

delphifan2004 12. Nov 2015 20:30

AW: Verständnisfrage zu Pen und Brush
 
Danke beiden. Wenn ich so vorgehe, funktioniert es. :) Ich werd jetzt erst mal ein wenig damit rumspielen um da sicher zu werden. :coder2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz