HDC global... GetDC überschreibt alles?



  • Elektronix schrieb:

    Sorry- aber das wird ja immer !=besser...

    Wenn dass schlechter hießen soll, kannst du da bitte genauer werden, damit ich eine chance habe ein !(!=besser) draus zu machen 🤡 😉

    Genau das versuche ich hier, mein Guter. Aber es ist unmöglich, Dir in diesem Forum alle Feinheiten der WinAPI- z. b. den Unterschied zwischen einem Button und einem Static Control mit Notyfies- zu erklären. Deswegen, zum xten mal: Nimm Dir die Tutorials vor. Und lies ggf. den Petzold.



  • Petzold? Was ist das?

    Ich habe es nun hinbekommen, ich kann in WM_PAINT malen und alles bleibt erhalten.
    Eigentlich relativ einfach:

    struct paintHist
    {
    	POINT pointToPaint;
    	int cRed;
    	int cYellow;
    	int cBlue;
    	int width;
    	struct paintHist *next;
    };
    

    Da klappt zwar das mit der Breite noch nicht, und dass mit den Farben geht auch noch nicht, aber das wird schon noch erledigt, weiß schon wo der fehler liegt.

    Ich werde jetzt ein wenig umschreiben (der performance halber) damit ich nicht bei jedem durchlauf WM_PAINT aufrufe... ich werde einfach alles in der verketteten liste speichern,
    und bei WM_PAINT alles neu aufzeichnen. 😉

    Ist performant besser oder?!



  • lippoliv schrieb:

    Petzold? Was ist das?

    Charles Petzold: "Windows-Programmierung"
    http://www.amazon.de/Windows-Programmierung-Das-Entwicklerhandbuch-zur-WIN32-API/dp/3860631888
    ist sozusagen ein Standardwerk für WinAPI-Progger, auch wenn es schon etwas älter ist.

    Ich habe es nun hinbekommen, ich kann in WM_PAINT malen und alles bleibt erhalten.
    Eigentlich relativ einfach:

    struct paintHist
    {
    	POINT pointToPaint;
    	int cRed;
    	int cYellow;
    	int cBlue;
    	int width;
    	struct paintHist *next;
    };
    

    Da klappt zwar das mit der Breite noch nicht, und dass mit den Farben geht auch noch nicht, aber das wird schon noch erledigt, weiß schon wo der fehler liegt.

    I ch werde jetzt ein wenig umschreiben (der performance halber) damit ich nicht bei jedem durchlauf WM_PAINT aufrufe... ich werde einfach alles in der verketteten liste speichern,
    und bei WM_PAINT alles neu aufzeichnen. 😉

    Ist performant besser oder?!

    Na bitte, was lange gährt...:D



  • Danke.

    Problem:
    Wenn ich Weiß in Stärke 1, 3 und 5 px und Schwar in Stärke 1, 3 und 5 px im bild habe,
    ein wenig male... und dann paar mal -schneller- hintereinander RECHTSKLICK mache, also bild resetten, verschwinden die Formatiereungen.

    Meine Struktur

    struct paintHist
    {
    	POINT pointToPaint;
    	int cRed;
    	int cYellow;
    	int cBlue;
    	int width;
    	BOOL isBreak;
    	struct paintHist *next;
    };
    

    WndProc

    LRESULT CALLBACK WndProc( HWND myWnd, UINT givenMessage, WPARAM wParam, LPARAM lParam )
    /*
    	This function recieves the Messages, wich are given from MS-Windows to the program.
    	So the program can do message specific actions, if this message is incoming.
    */
    {
    	PAINTSTRUCT myPaint;
    	//Handle für Gerätekontext(gültiger Zeichenbereich)
    	BOOL visitMsg = FALSE;
    
    	static POINT myPoint,
    				 mousePointForPaint;
    
    	static RECT myRect,
    				parent;
    
    	static COORD mouseKoord;
    
    	HANDLE backUp;
    
    	char version[50];
    
    	struct paintHist *akt;
    
    	if( LOWORD(lParam) != 0 || HIWORD(lParam) != 0)
    	{
    		mouseKoord.X = LOWORD(lParam);	//took the mouse-coordinates into a COORD variable (perfomance)
    		mouseKoord.Y = HIWORD(lParam);
    	}
    
    	switch( givenMessage )
    	{
    		case WM_CREATE:
    			myPoint.x = -1;
    			myPoint.y = -1;
    
    			GetClientRect( myAppWnd, &parent );
    
    			bClose = CreateWindow( "BUTTON", "Close", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top, 50, 20, myWnd, (HMENU)CLOSE, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    			bBlack = CreateWindow( "BUTTON", "black", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+30, 50, 20, myWnd, (HMENU)cBLACK, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    			bWhite = CreateWindow( "BUTTON", "white", SS_NOTIFY | WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+50, 50, 20, myWnd, (HMENU)cWHITE, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    
    			strcpy( version, "Version: " );
    			strcat( version, VERSION );
    
    			versionWnd = CreateWindow( "STATIC", version, WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left+630, parent.bottom+555, 165, 20, myWnd, NULL, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    			bSmall = CreateWindow( "BUTTON", " 1px", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+75, 40, 22, myWnd, (HMENU)sSMALL, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    			bMiddle = CreateWindow( "BUTTON", " 3px", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+97, 40, 22, myWnd, (HMENU)sMIDDLE, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    			bBig = CreateWindow( "BUTTON", " 5px", WS_CHILD | WS_VISIBLE | WS_DLGFRAME , parent.left, parent.top+119, 40, 22, myWnd, (HMENU)sBIG, ((LPCREATESTRUCT)lParam)->hInstance, NULL );
    
    			visitMsg = TRUE;
    		break;
    		case WM_SIZE:
    			myRect.left = 0;
    			myRect.top = 0;
    			myRect.bottom = HIWORD( lParam );
    			myRect.right = LOWORD( lParam );
    
    			visitMsg = TRUE;
    		break;
    		case WM_PAINT:
    			myHdc = BeginPaint( myWnd, &myPaint );	//open device-context (paintplace)
    			{
    				backUp = SelectObject( myHdc, *aktPen );
    
    				akt = first;
    				while( NULL != akt->next )
    				{
    					if( akt->isBreak != TRUE )
    					{
    						DeleteObject( aktPen );
    						*aktPen = 	CreatePen(
    											PS_SOLID,
    											akt->width,
    											RGB( 
    												akt->cRed,
    												akt->cYellow,
    												akt->cBlue
    											)
    									);
    
    						SelectObject( myHdc, *aktPen );
    
    						MoveToEx(
    							myHdc,					//Zeichenfläche
    							akt->pointToPaint.x,	//X-Koordinate
    							akt->pointToPaint.y,	//Y-Koordinate
    							NULL					//old-Koordinate
    						);
    						LineTo(
    							myHdc,		//Zeichenfläche
    							akt->next->pointToPaint.x,	//X-Koordinate
    							akt->next->pointToPaint.y	//Y-Koordinate
    						);
    					}
    
    					akt = akt->next;
    				}
    				SelectObject( myHdc, backUp );
    			}
    			EndPaint( myWnd, &myPaint );
    			visitMsg = TRUE;
    		break;
    		case WM_MOUSEMOVE:
    			myHdc = GetDC( myWnd );			//open device-context (paintplace)
    			{
    				if( wParam == MK_LBUTTON )
    				{
    					if( myPoint.x != -1 )
    					{
    						myPoint.x = mouseKoord.X;	//set new coordinates
    						myPoint.y = mouseKoord.Y;
    
    						akt = last;
    						if( NULL == first->next )
    						{
    							akt = first;
    							akt->pointToPaint.x = myPoint.x;
    							akt->pointToPaint.y = myPoint.y;
    							akt->cRed = R;
    							akt->cYellow = G;
    							akt->cBlue = B;
    							akt->width = aktWidth;
    							akt->next = NULL;
    							last = akt;
    						}
    						if( NULL != ( akt->next = malloc( sizeof( struct paintHist ) ) ) )
    						{
    							if( last->isBreak != TRUE )
    							{
    								backUp = SelectObject( myHdc, *aktPen );
    								MoveToEx(
    									myHdc,					//Zeichenfläche
    									last->pointToPaint.x,	//X-Koordinate
    									last->pointToPaint.y,	//Y-Koordinate
    									NULL					//old-Koordinate
    								);
    								LineTo(
    									myHdc,		//Zeichenfläche
    									myPoint.x,	//X-Koordinate
    									myPoint.y	//Y-Koordinate
    								);
    								SelectObject( myHdc, backUp );
    							}
    							akt = akt->next;
    							akt->pointToPaint.x = myPoint.x;
    							akt->pointToPaint.y = myPoint.y;
    							akt->cRed = R;
    							akt->cYellow = G;
    							akt->cBlue = B;
    							akt->width = aktWidth;
    							akt->next = NULL;
    							last = akt;
    						}
    						//InvalidateRect( myWnd, NULL, TRUE);
    					}
    					else
    					{
    						myPoint.x = mouseKoord.X;//The first coordinates
    						myPoint.y = mouseKoord.Y;
    					}
    				}
    				visitMsg = TRUE;
    			}
    			ReleaseDC( myWnd, myHdc );
    		break;
    		case WM_LBUTTONUP:
    			akt = last;
    			if( NULL != ( akt->next = malloc( sizeof( struct paintHist ) ) ) )
    			{
    				akt = akt->next;
    				akt->pointToPaint.x = myPoint.x;
    				akt->pointToPaint.y = myPoint.y;
    				akt->cRed = R;
    				akt->cYellow = G;
    				akt->cBlue = B;
    				akt->width = aktWidth;
    				akt->next = NULL;
    				akt->isBreak = TRUE;
    				last = akt;
    			}
    
    			myPoint.y = -1;
    			myPoint.x = -1;
    
    			visitMsg = TRUE;
    		break;
    		case WM_RBUTTONDOWN:
    			DeleteObject( whitePen );
    			DeleteObject( blackPen );
    
    			setGlobalVars();
    
    			InvalidateRect(
    						myWnd,
    						NULL,
    						TRUE
    			);
    
    			visitMsg = TRUE;
    		break;
    		case WM_COMMAND:
    			switch( LOWORD(wParam) )
    			{
    				case CLOSE:
    					SendMessage( myAppWnd, WM_DESTROY, 0, 0 );
    
    					visitMsg = TRUE;
    				break;
    				case cWHITE:
    					aktPen = &whitePen;//slect white pen
    
    					R = 255;
    					G = 255;
    					B = 255;
    
    					visitMsg = TRUE;
    				break;
    				case cBLACK:
    					aktPen = &blackPen;//slect white pen
    
    					R = 0;
    					G = 0;
    					B = 0;
    
    					visitMsg = TRUE;
    				break;
    				case sSMALL:
    					DeleteObject( aktPen );
    					*aktPen = CreatePen( PS_SOLID, 1, RGB( R, G, B ) );
    					aktWidth = 1;
    
    					visitMsg = TRUE;
    				break;
    				case sMIDDLE:
    					DeleteObject( aktPen );
    					*aktPen = CreatePen( PS_SOLID, 3, RGB( R, G, B ) );
    					aktWidth = 3;
    
    					visitMsg = TRUE;
    				break;
    				case sBIG:
    					DeleteObject( aktPen );
    					*aktPen = CreatePen( PS_SOLID, 5, RGB( R, G, B ) );
    					aktWidth = 5;
    
    					visitMsg = TRUE;
    				break;
    				default:
    					;
    				break;
    			}
    		break;
    		case WM_DESTROY:
    			ShowWindow( myConsole, SW_SHOWNOACTIVATE );
    			//SendMessage( myConsole, WM_CLOSE, 0, 0 );
    			PostQuitMessage( 0 );
    		break;
    		default:
    		break;
    	}
    
    	if( visitMsg )
    		return 0;
    	else
    		return DefWindowProc( myWnd, givenMessage, wParam, lParam );
    }
    

    Globale Variablen:

    //Globale Variablen
    HINSTANCE myHandleInst;
    HWND myConsole,
    	 myAppWnd,
    	 bClose,
    	 bBlack,
    	 bWhite,
    	 versionWnd,
    	 bSmall,
    	 bMiddle,
    	 bBig;
    HPEN whitePen,
    	 blackPen;
    HPEN *aktPen;
    HDC myHdc;
    int R,
    	G,
    	B,
    	aktWidth;
    

    Ich verstehe dass nicht, aber eventuell Ihr...

    DANKe für alle bisherigen Posts und die Gedult.


Anmelden zum Antworten