GDI+ - Löschen von gezeichnet Objekten



  • Euch ist aber schon klar, dass der letzte Parameter von InvalidateRect() TRUE sein muss, damit der Hintergrund gelöscht wird? Außerdem führt InvalidateRect() nicht direkt zum Neuzeichnen, sondern kennzeichnet den angegebenen Bereich nur als "Neuzeichnungsbedürftig". Mit einem nachfolgenden Sleep() blockiert Ihr die MessageLoop, so dass das Neuzeichnen vorerst nicht durchgeführt werden kann. In einem solchen Fall kann man das Neuzeichnen erzwingen mit UpdateWindow().



  • By the way: seine eigenen Maloperationen baut man üblicherweise in die Behandlung von WM_PAINT ein.



  • man muss kein true nehmen der hdc wird auch so gelöscht nur wird bei true der hdc wieder neu gezeichnet und bei false nicht:) und in der Consolenanwendung lässt sich nur mit viel Aufwand ein WM_PAINT reinquetschen:)



  • Lies die Dokumentation.



  • steht da so drin:

    Wenn bErase auf TRUE gesetzt wird, wird beim Aufruf von BeginPaint(...) der Fensterhintergrund neu gezeichnet.

    außerdem hat man an dem Bild dass er hochgeladen hat gesehen dass es dass gezeichnete löscht:) schonmal angesehen und dass war garnicht unser prob sonder will er dass auf nem Desktop oder Notepad bewerkstelligen



  • Sag ich doch: TRUE ...

    Natürlich kann es sein, dass eine Applikation in der WM_PAINT den Hintergrund immer löscht, egal ob es angefordert wurde oder nicht. Aber verlassen kannst Du Dich darauf nicht!



  • gut ok mein fehler:D



  • ok, ich werde es jetzt mal mit TRUE als Parameter und UpdateWindow() danach versuchen und euch das Ergebnis mitteilen.

    bg,
    andi01.



  • also: am desktop habe die Veränderungen leider gar nix gebracht,er reagiert weder auf InvalidateRect() noch auf UpdateWindow() noch auf eine Kombination aus beidem, egal ob das parentsprechende Parameter bei InvalidateRect() TRUE oder FALSE ist 😞 .

    In editor ist es mit InvalidateRect() genau wie in der Konsole.

    hier nochmal ein screen wie das in editor aussieht: http://rapidshare.de/files/48980071/fehler.bmp.html

    dadurch ergebn sich jetzt 2 grundlegendes Fragen:

    1.wie man anhand meines vorletzten Beitrags hoffentlich nachvollziehen kann sind die Koordinaten und die Positionen des 2. gezeichneten Rechteck und des Rechtecks, das an invalidateRect() übergeben wird genau gleich! warum wird also das gezeichnete Rechteck nicht vollständig gelöscht?

    muss/kann ich die Koordinaten dann irgendwie umrechnen?

    2.Da es am Desktop gar nicht geht:

    a)insofern der code nicht falsch ist, gibt es noch eine andere Möglichkeit einen Fensterteil neu zu zeichnen?
    b)oder kann ich den desktop irgendwie dazu bringen auf InvalidateRect zu reagieren (zB durch éinstellungen oder andere api-funktionen)?

    um die Möglichkeit auszuschließen, dass mein Code falsch ist, hier nochmal der (diesmal komplette) Code:

    // Rechteckrotation mit bzw ohne radius.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include <windows.h>  // für die GDI+ wird auch windows.h benötigt 
    #include <gdiplus.h>  // dieser Header ist für alle GDI+ Klassen, Funktionen usw. 
    #include<conio.h>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<sstream>
    #pragma comment(lib, "gdiplus.lib")
    #include<wchar.h>
    
    using namespace Gdiplus; // 01 
    using namespace std;
    
    HDC hdc=GetWindowDC(FindWindow(NULL, L"Unbenannt - Editor"));//=GetWindowDC(FindWindow(NULL, L"Unbenannt - Editor"));
    
    void rechteck(int x, int y, int width, int length)
    {
    	Graphics graphics(hdc);
    	Rect rect(x, y, width, length);
    	Pen pen(Color(255, 255, 0, 0), 1);
    	graphics.DrawRectangle(&pen, rect);
    }
    
    int main() 
    { 
    	for(;;)
    	{
    	system("cls");
       GdiplusStartupInput gdiplusStartupInput; 
       ULONG_PTR           gdiplusToken;   
       GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 02 
       //...
       system("PAUSE");
       cout<<"zeichne rechteck 1\n";
       rechteck(80, 80, 30, 30);
       Sleep(2000);
       rechteck(110, 110, 110, 110);
       cout<<"zeichne rechteck 2\n";
       Sleep(2000);
       RECT rect;//=new RECT();
       rect.left=110;
       rect.top=110;
       rect.right=220;
       rect.bottom=220;
       bool success=InvalidateRect(FindWindow(NULL, L"Unbenannt - Editor"), &rect /*NULL*/, TRUE);
       if(success==true)
       {
    	   cout<<"rect successfull invalidated\n";
       }
       if(success==false)
       {
    	   cout<<"error while trying to invalidate rect\n";
       }
       bool update_success=UpdateWindow(FindWindow(NULL, L"Unbenannt - Editor"));
       if(update_success==true)
       {
    	   cout<<"window successfull updated\n";
       }
       if(update_success==false)
       {
    	   cout<<"error while trying to update window\n";
       }
       Sleep(2000);
       // ... 
       GdiplusShutdown(gdiplusToken);  // 03 
    	}
    }
    

    edit: sowohl bei InvalidateRect() als auch bei UpdateWindow() kommt true als Rückgabewert.

    mfg,
    andi01.



  • klg71 schrieb:

    und in der Consolenanwendung lässt sich nur mit viel Aufwand ein WM_PAINT reinquetschen:)

    Ich finds schon sehr eigenartig dass überhaupt jemand in der Konsole rummalt - Da kann man doch gleich ne Fensteranwendung schreiben?



  • geeky schrieb:

    Ich finds schon sehr eigenartig dass überhaupt jemand in der Konsole rummalt - Da kann man doch gleich ne Fensteranwendung schreiben?

    natürlich könnte ich das, aber wie oben bereits schrieb wwar die Konsole ausschließlich zu Testzwecken gedacht, deswegen ist das gar nicht so wichtig wie die Konsole reagiert!

    Es geht mir darum das am desktop hinzubekommen!

    mfg,
    andi01.



  • 😕 lol, wenn ich als handle einfach NULL statt GetDesktopWindow() angeben reagiert der desktop schonmal 🙂

    allerdings wird der gesamter desktop aktualiesiert.

    wie kriege ich das mit dem rect hin?

    mfg,
    andi01.


Anmelden zum Antworten