Warum wird nicht HOLLOW_BRUSH eingesetzt?
-
Hallo!
Ich schreibe mir gerade eine Klasse für grafische Funktionen. Ich will auch die Linieneigenschaften, sowohl auch die Farben des Bilds zu beeinflußen.
Ich bin mir fast sicher, dass mit "Pen"-s alles Ok ist. Aber... Diese HBRUSH will einfach nicht richtig funktionieren.
Hier ist ein Teil meiner C++ Code:class gdi_vision { HDC hdc_; HPEN hpen_; HBRUSH hbrush_; public: gdi_vision() :hdc_(0), hpen_(0), hbrush_(0) {} void init_gd(HDC h) { hdc_ = h; if(!hpen_) hpen_ = CreatePen(PS_SOLID, 1, BLACK); SelectObject(hdc_, hpen_); if(!hbrush_) SelectObject(hdc_, GetStockObject(HOLLOW_BRUSH)); //Am Anfang haben wir HOLLOW_BRUSH! else SelectObject(hdc_, hbrush_); } void release_gd() { DeleteObject(hpen_); hpen_ = 0; if(!hbrush_) // falls nicht HOLLOW, dann DELETE IT! DeleteObject(hbrush_); hbrush_ = 0; hdc_ = 0; } void set_pen(int style, int width, UINT color) { // das funzt OK :) hpen_ = CreatePen(style, width, color); DeleteObject(SelectObject(hdc_, hpen_)); } void set_solid_brush(UINT color) { // das ist nicht sicher :( HBRUSH h = CreateSolidBrush(color); if(!hbrush_) //wenn vorher HOLLOW, dann nix machen SelectObject(hdc_, h); else DeleteObject(SelectObject(hdc_, h)); // sonst loeshe vorherige Brush hbrush_ = h; } void set_hollow_brush() { //das will nicht ok funzen! if(!hbrush_) { DeleteObject(SelectObject(hdc_, GetStockObject(HOLLOW_BRUSH))); hbrush_ = 0; } } /*...*/ };Und hier die WndProc:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static gdi_vision gv; HDC hdc; PAINTSTRUCT ps; switch (message) { case WM_CREATE: return 0; case WM_SIZE: return 0; case WM_PAINT: { hdc = BeginPaint (hwnd, &ps); gv.init_gd(hdc); gv.set_pen(PS_SOLID, 1, Gui::BLACK); /*gv.rectangle(10,10,100,100); gv.set_pen(PS_SOLID, 4, Gui::CORAL); gv.rectangle(50,50,100,100); gv.set_pen(PS_DASH, 1, Gui::CHOCO); gv.rectangle(80,80,100,100); gv.set_pen(PS_DOT, 1, Gui::GREEN); gv.rectangle(80,10,100,100);*/ // das funktioniert! gv.set_hollow_brush(); // das aber will nicht :( gv.ellipse(100,100,600,600); gv.set_solid_brush(Gui::DARKBLUE); gv.ellipse(100,100,100,700); gv.set_solid_brush(Gui::INDIGO); gv.ellipse(510,50,300,600); gv.set_solid_brush(Gui::YELLOW); gv.ellipse(200,400,600,100); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: gv.release_gd(); // Pens und Brushes loeschen wir hier! PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } }
-
Hui, was ein Spagetthi-Code
...ähmAlso wenn ich das richtig überblicke...willst Du damit einfach nur unter allen Umstanden einen HOLLOW_BRUSH einsetzen...:
void set_hollow_brush() { //das will nicht ok funzen! if(!hbrush_) { DeleteObject(SelectObject(hdc_, GetStockObject(HOLLOW_BRUSH))); hbrush_ = 0; }...dann doch eher so:
void set_hollow_brush() { DeleteObject(SelectObject(hdc_, GetStockObject(HOLLOW_BRUSH))); hbrush_ = 0; }PS: Kennst Du RAII ? Dem Konzept folgst Du nicht...dabei verwendet man doch genau deswegen Klassen (C++, OOP...)...

-
Ruf mal "gv.release_gd ()" in "WM_PAINT" vor "EndPaint ()" auf und nicht in "WM_DESTROY".

-
Vielen Dank! Ich habe es mit lokaler Variable, Konstruktor und Destruktor innerhalb WM_PAINT gemacht. Es funzt!