GDI stürzt nach zu viel Text ab



  • Hallo,

    ich habe folgenden Code:

    if((p_uMsg==WM_PAINT)&&(p_hWnd==hw_win)){
        HDC static paint={0};
        PAINTSTRUCT static ps={};
    		paint=BeginPaint(p_hWnd,&ps);
    		SetBkMode(paint,TRANSPARENT);
    		SetTextColor(paint,0); // 0x000000
    		TextOut(paint,156,10,"Test",4);
    		SetBkMode(paint,OPAQUE);
    		if((AM_enable==false)){
    			SetBkColor(paint,30464); // 0x007700
    			SetTextColor(paint,119); // 0x000077
    			TextOut(paint,155,80,"Deaktiviert",11);
    		};
    		if((AM_enable==true)){
    			SetBkColor(paint,119); // 0x000077
    			SetTextColor(paint,30464); // 0x007700
    			TextOut(paint,155,80,"Aktiviert",9);
    		};
    		if((AM_win==0)){
    			SetBkColor(paint,119); // 0x000077
    			SetTextColor(paint,30464); // 0x007700
    			TextOut(paint,105,110,"Fenster nicht gefunden.",23);
    		};
    		if((AM_win!=0)){
    			SetBkColor(paint,119); // 0x000077
    			SetTextColor(paint,30464); // 0x007700
    			TextOut(paint,105,110,"Fenster gefunden.",17);
    		};
    		EndPaint(p_hWnd,&ps);
    		std::cout<<GetLastError();
    		std::cout<<'\n';
    		return 0;
    	};
    

    Hier bekomme ich den Fehler 1400 (ERROR_INVALID_WINDOW_HANDLE) zurück.
    Ändere ich den Code allerdings zu folgendem um:

    HDC static paint={0};
    PAINTSTRUCT static ps={};
        paint=BeginPaint(p_hWnd,&ps);
    		SetBkMode(paint,1); // TRANSPARENT
    		SetTextColor(paint,0); // 0x000000
    		TextOut(paint,156,10,"Test",4);
    		SetBkMode(paint,2); // OPAQUE
    		if((AM_enable==false)){
    			SetBkColor(paint,30464); // 0x007700
    			SetTextColor(paint,119); // 0x000077
    			TextOut(paint,155,80,"Deaktiviert",11);
    		};
    		if((AM_enable==true)){
    			SetBkColor(paint,119); // 0x000077
    			SetTextColor(paint,30464); // 0x007700
    			TextOut(paint,155,80,"Aktiviert",9);
    		};
       EndPaint(p_hWnd,&ps);
    

    dann funktioniert es. Also wenn zu viel Text ausgegeben wird, wird das Handle ungültig.
    Frage: Woran liegt das? 😕

    Danke im Voraus!

    MfG

    Seikuassi

    P.S.: Ich benutze übrigens nur GDI, weil es sich hier um eine Minianwendung handelt.



  • Hat keiner eine Antwort?

    Wenn Ihr keinen Fehler entdecken könnt, dann könnt Ihr mir ja vllt. eine GDI-ähnliche Grafikbibliothek empfehlen. Es ist wirklich für einfachste Anwendung gedacht (meist soll nur Text ausgegeben werden).

    Danke im Voraus!

    MfG

    Seikuassi



  • In welcher Zeile genau bekommst du den Fehler?

    Warum static??? Brauchst du ganz sicher nicht, ist evtl. auch problematisch. Warum doppelte Klammern? Warum geschweifte Klammern um Werte?

    Cairo wär so eine Bibliothek, aber da muss man sich einarbeiten.



  • Hallo Mechanics,

    ich bekomme den Fehler erst nach dem Aufruf von EndPaint:

    if((p_uMsg==WM_PAINT)&&(p_hWnd==hw_win)){
        HDC static paint={0};
        PAINTSTRUCT static ps={};
        paint=BeginPaint(p_hWnd,&ps);
        SetBkMode(paint,TRANSPARENT);
        SetTextColor(paint,0); // 0x000000
        TextOut(paint,156,10,"Test",4);
        std::cout<<GetLastError()<<std::endl;
        SetBkMode(paint,OPAQUE);
        if((AM_enable==false)){
            SetBkColor(paint,30464); // 0x007700
            SetTextColor(paint,119); // 0x000077
            TextOut(paint,155,80,"Deaktiviert",11);
        };
        if((AM_enable==true)){
            SetBkColor(paint,119); // 0x000077
            SetTextColor(paint,30464); // 0x007700
            TextOut(paint,155,80,"Aktiviert",9);
        };
        std::cout<<GetLastError()<<std::endl;
        if((AM_win==0)){
            SetBkColor(paint,119); // 0x000077
            SetTextColor(paint,30464); // 0x007700
            TextOut(paint,105,110,"Fenster nicht gefunden.",23);
        };
        if((AM_win!=0)){
            SetBkColor(paint,119); // 0x000077
            SetTextColor(paint,30464); // 0x007700
            TextOut(paint,105,110,"Fenster gefunden.",17);
        };
        std::cout<<GetLastError()<<std::endl;
        EndPaint(p_hWnd,&ps); // <-- hier bekomme ich einen Fehler (1400) zurück
        std::cout<<GetLastError()<<std::endl;
        return 0;
    };
    

    Ich sehe ja auch das gezeichnete Fenster, doch dann kommt eben die Problembehandlung von Windows.
    Wenn ich übrigens das "static" weglasse, bekomme ich beim letzten GetLastError() den Fehler 1400 (ERROR_INVALID_WINDOW_HANDLE) und dann noch zusätzlich beim vor- und vorvorletzten den Fehler 6 (ERROR_INVALID_HANDLE).

    Habt Ihr noch ne' Idee, woran das liegen kann?
    Danke nochmal für die Empfehlung für Cairo. Ich werde mich mal belesen.

    MfG

    Seikuassi



  • Hallo nochmal,

    ich habe einen einfacheren Code:

    HDC static h_wnd=0;
    PAINTSTRUCT static ps;
    if(p_uMsg==WM_PAINT){
            short int counter=0;
    		h_wnd=Functions::BeginPaint(p_hWnd,&ps);
    		std::cout<<counter++;
    		Functions::TextOut(h_wnd,10,10,"Test",4);
    		std::cout<<counter++;
    		Functions::TextOut(h_wnd,10,15,"Test",4);
    		std::cout<<counter++;
    		Functions::TextOut(h_wnd,10,20,"Test",4);
    		std::cout<<counter++;
    		Functions::TextOut(h_wnd,10,25,"Test",4);
    		std::cout<<counter++;
    		Functions::TextOut(h_wnd,10,30,"Test",4);
    		std::cout<<counter++;
    		Functions::TextOut(h_wnd,10,35,"Test",4);
    		std::cout<<counter++;
    		Functions::EndPaint(p_hWnd,&ps);
    		std::cout<<counter++;
    };
    

    Funktioniert das Programm auf eurem PC (virenfrei)?
    [url]
    http://www.file-upload.net/download-8240898/main.exe.html
    [/url]

    Würde mich mal interessieren.

    Danke im Voraus!

    MfG

    Seikuassi



  • Es startet eine Konsolen Anwendung die "01234567" ausgibt, dann kommt ein Fenster wo ein paar Texte sich scheinbar überqueren und dann stürzt das Programm ab.


Log in to reply