Koordinatenumrechnung InvalidateRect()
-
Hallo,
ich bin gerade dabei mit der GDI+ etwas in ein Windows-Forms-Fenster zu zeichnen und mit Invalidate Rect() wieder zu löschen.Mein eigentliches Ziel ist es, dies mit einem eigenenen Transparenten Fenster über dem Desktop zu tun, Notepad habe ich nur zu Testzwecken benutzt(aber in einem selbst erstellten Fenster tritt genau dasselbe Problem auf) .
Im Programm werden also 2 Rechtecke gezeichnet und das 2. soll durch InvalidateRect() vollständig wieder gelöscht werden.
Das Problem is dass die Umrechnung der Koordinaten nicht wirklich zu klappen scheint:
hier mein Code wie ich die Rechtecke zeichne und die Koordinaten der an InvalidateRect() übergeben RECT-Struktur zuvor mit ScreenToClient() umrechne:
#include <windows.h> #include <gdiplus.h> #include<conio.h> #include<iostream> #pragma comment(lib, "gdiplus.lib") #include<wchar.h> using namespace Gdiplus; using namespace std; HDC hdc=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); } HWND editor=FindWindow(NULL, L"Unbenannt - Editor"); int main() { for(;;) { system("cls"); GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); //... system("PAUSE"); cout<<"zeichne rechteck 1\n"; rechteck(80, 80, 30, 30); Sleep(2000); rechteck(110, 110, 110, 110); cout<<"zeichne rechteck 2\n"; /*dieses Rechteck sollte nachher von InvalidateRect() komplett gelöscht werden!*/ Sleep(2000); RECT rect; rect.left=110; rect.top=110; rect.right=220; rect.bottom=220; //konvertieren: POINT oben_links; oben_links.x=rect.left; oben_links.y=rect.top; POINT unten_rechts; unten_rechts.x=rect.right; unten_rechts.y=rect.bottom; ScreenToClient(editor, static_cast<LPPOINT>(&oben_links)); ScreenToClient(editor, static_cast<LPPOINT>(&unten_rechts)); rect.left=oben_links.x; rect.top=oben_links.y; rect.right=unten_rechts.x; rect.bottom=unten_rechts.y; //Rechteck löschen: bool success=InvalidateRect(editor, &rect , TRUE); if(success==true) { cout<<"rect successfull invalidated\n"; } if(success==false) { cout<<"error while trying to invalidate rect\n"; } Sleep(2000); // ... GdiplusShutdown(gdiplusToken); } }hier ein Screen des leider nicht wirklich zufriedenstellenden Ergebnisses:
http://img64.imageshack.us/img64/320/fehlernachkonvertierung.pngwenn ich gar nicht umrechne kommt das raus: (wieder ein Screen)
http://img64.imageshack.us/img64/9321/fehleraa.pngich habe auch schon probiert mit ClientToScreen() umzurechnen, das hat das problem aber leider auch nicht gelöst.
was mache ich denn mit der Umrechnung falsch? Immerhin sollte das 2.Rechteck ja eigentlich vollständig gelöscht werden.
danke schonmal,
andi01.
-
muss ich vielleicht die Koordinaten mit einer anderen Funktion als ScreenToClient() umrechnen?