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 😮 ...ähm

    Also 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!


Anmelden zum Antworten