InvalidateRect() + ScreenToClient()
-
Hallo,
ich bin gerade dabei mit der GDI+ etwas in ein Windowsfenster 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
.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

bleiben also diese Fragen:
-woran liegt es denn das das nicht klappt und was kann ich besser machen?
-liegt es vielleicht daran, dass ich den DeviceContext mit GetWindowDC() ermittle und nicht GetDC()?danke schonmal,
andi01.
-
Mir ist nicht klar, wie Deine Rechtecke
rechteck(50, 50, 10, 10);
rechteck(10, 10, 10, 10);die verlinkten Screenshots ergeben können.
Müssten da nicht zwei gleich grosse Rechtecke erscheinen?
-
Du zeichnest Dein Rechteck in den Koordinaten 10-70...
Du zeichnest in den DC eines Fensters. Also müssten dies Fensterkoordinaten sein.
Du "invalidierst" ein Rechteck im Koordinaten Bereich 110-220. Wobei Du diese Koordianten auf irgend ein Fenster umrechnest.Zudem in dem Editor Fenster vermutlich ein weiteres fenster liegt in dem die eigentliche Zeichenfläche liegt...
Ich verstehe immer noch nicht was dieser Unfug soll.
-
upps ka wie die falschen Koordinaten da reingekommen sind=)
ich bessere das gleich mal aus(erstaunlichereise stimmen sie aber im original).Wie auch immer, ich teste es jetzt mal mit einem selbsterstellten fenster

mfg,
andi01.
-
also ich habs jetzt mal mit einem Windows-Forms Fenster versucht, das Ergebnis sieht zwar nicht genau aus wie bei notepad, aber leider wird das Rechteck auch da nur teilweise gelöscht. woran liegt das? die Umrechnung sollte doch einegntlich stimmen...