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.