maddin Geschrieben 23. Oktober 2001 Geschrieben 23. Oktober 2001 hallo, ich versuche in einem programm ein bitmap zu zeichnen. das ganze sieht zur zeit so aus. case WM_PAINT: { if (strcmp(g_Img, "") != 0) { cout << "paint" << endl; HBITMAP hBitmap; BITMAP bitmap; HDC hdc, hdcMem; PAINTSTRUCT ps; hBitmap = (HBITMAP) LoadImage(NULL, g_Img, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION); GetObject (hBitmap, sizeof (BITMAP), &bitmap); hdc = BeginPaint (hWnd, &ps); hdcMem = CreateCompatibleDC (hdc); SelectObject (hdcMem, hBitmap); BitBlt (hdc, 50, 50, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY); EndPaint (hWnd, &ps); DeleteDC (hdcMem); DeleteObject (hBitmap); } break; } in g_Img steht der dateiname des bitmaps, das gezeichnet werden soll. das problem ist jetzt, das er das bitmap zwar einwandfrei zeichnet, aber nur, nachdem ich das fenster einmal minimiert und dann wiederhergestellt habe. bei einen einfachen senden der nachricht WM_PAINT des fensters wird das bitmap nicht gezeichnet. meine frage ist nun die nach dem warum und wie kann ich das ändern ??? <FONT COLOR="#a62a2a" SIZE="1">[ 23. Oktober 2001 08:29: Beitrag 1 mal editiert, zuletzt von maddin ]</font> Zitieren
haddock Geschrieben 23. Oktober 2001 Geschrieben 23. Oktober 2001 Wenn ich mich dunkel erinnere, müßtest du die Methode on_paint (oder so) überschreiben, damit bei Fensterveränderungen der Fensterinhalt neu aufgebaut wird. Zitieren
maddin Geschrieben 23. Oktober 2001 Autor Geschrieben 23. Oktober 2001 wenn ich mich dunkel erinner ist die mehtode on_paint oder das überschreiben dieser eine geschichte der mfc. und damit arbeite ich nicht. Zitieren
DBO Geschrieben 23. Oktober 2001 Geschrieben 23. Oktober 2001 Hi, unter windows ist es so das Anwendung sich selber merken müssen was bei ihnen gespeichert wurde. Daher musst du dir alle gezeichneten Objekte abspeichern z.B. in der Klasse CArray. Wenn nun das Fenster z.B. minimiert und maximiert. wird wird die Message WM_PAINT geschickt, welche von der Funktion onpaint() aufgegangen wird, diese Funktion musst du überschreiben, und hierrin dann die Gespeicherten Objete neu Zeichnen! Zitieren
maddin Geschrieben 23. Oktober 2001 Autor Geschrieben 23. Oktober 2001 @NewNuke ok erstmal benutze ich immer nocht nicht die mfc und kann so auch nicht die funktion onpaint überschreiben. oder habe ich da irgentetwas nicht mitbekommen. zweitens habe ich mir alle objekte die ich zeichnen möchte gespeichert. und zwar als dateinamen eines bitmaps in g_Img. drittens ist es glaube ich genau andere herum wie du es verstanden hast. das bitmap wird nach einem minimieren und gefolgtem wiederherstellen korrekt gezeichnet. das einzige problem ist, das das bild nicht gezeichnet wird, wenn ich dem fenster manuell die nachricht WM_PAINT sende. Zitieren
Crush Geschrieben 23. Oktober 2001 Geschrieben 23. Oktober 2001 Ich meine auch, daß Du um das OnPaint nicht drumrum kommst. "The system sends an internal WM_PAINT message only once. After an internal WM_PAINT message is returned from GetMessage or PeekMessage or is sent to a window by UpdateWindow, the system does not post or send further WM_PAINT messages until the window is invalidated or until RedrawWindow is called again with the RDW_INTERNALPAINT flag set." Die Nachricht wird halt aufgenommen und ins Nirvana geschickt, bevor sie Dein Fenster erreicht. Offensichtlich ist Onpaint dran schuld, weil hier die Paint-Message abgefangen wird. Vielleicht würde es klappen, wenn Du hier RedrawWindow() mit dem komischen Flag am Ende aufrufst?!?!? Oder besser noch das ganze in UpdateWindow() refreshen lassen. <FONT COLOR="#a62a2a" SIZE="1">[ 23. Oktober 2001 09:36: Beitrag 3 mal editiert, zuletzt von Crush ]</font> Zitieren
maddin Geschrieben 23. Oktober 2001 Autor Geschrieben 23. Oktober 2001 <BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Crush: <STRONG>Ich meine auch, daß Du um das OnPaint nicht drumrum kommst. </STRONG> Zitieren
Crush Geschrieben 23. Oktober 2001 Geschrieben 23. Oktober 2001 Ok, anderer Vorschlag: Nimm einen Message-Schnüffler und Zeichne mal die Messages die beim Minimizen & Maximizen so verschickt werden auf. Versuche einen von diesen Messages abzufangen und hier den Update reinzubasteln. Ich habe mich auch schon gefragt, wie ich mich in die Message-Queue einklinken könnte, sodaß ich zuerst alle Signale filtern kann bevor irgendwas ausgelöst wird. Wenn Du das irgendwie hinkriegen solltest, würd´s mich interessieren wie. Darfst Du keine MFC verwenden oder willst Du das nicht? Härteste Lösung wäre es einen Timerprozess laufen zu lassen, der die Größe und den Status des Fensters ausliest. Beim Ändern zu Normalgröße mußt Du halt dann das Bild selber neu blitten. CWnd *pmeinWindow = FindWindow(NULL, _T("Name von Meinemwindow")); dann kannst Du ja hiermit ordentlich weiterarbeiten! <FONT COLOR="#a62a2a" SIZE="1">[ 23. Oktober 2001 10:35: Beitrag 3 mal editiert, zuletzt von Crush ]</font> Zitieren
maddin Geschrieben 23. Oktober 2001 Autor Geschrieben 23. Oktober 2001 1.) ich darf keine mfc verwenden. 2.) an die message - queue anhänge wäre sicherlich interessant. da bin ich aber auch schon ein wenig am tüftel. bislang erfolglos. am besten den source von spy++ klauen. 3.) problem hat sich gelöst. habe vor dem senden der WM_PAINT nachricht einen aufruf der funktion InvalidateRect hinzugefügt. mit RedrawWindow sollte es laut doku auch klappen aber irgendwie nicht bei mir. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.