AnimateWindow() killt WM_PAINT
-
1. Lies mal ein Tutorial über Windows. WM_PAINT wird von der WndProc behandelt und ein Fenster ist selbst verantwortlich, dass sein Inhalt entsprechend dargestellt wird.
2. Wird von einer WndProc WM_PAINT nicht behandelt dann wird in der DefWindowProc, einfach BeginPaint/EndPaint ausgelöst, was den Hintergrund löscht (sofern definiert) und das Fenster validiert, damitkeine weitere Nachricht ausgelöst wird.
3. Eine DlgProc ist ein Handler, der von der WndProc des Dialogprozesses aufgerufen wird um dem Entwickler eine Chance zu geben auf WM_COMMAND, WM_CTLCOLOR..., WM_INITDIALOG, WM_NOTIFY zu reagieren. Das die DlgProc im Context der WndProc aufgerufen wird macht es keinen Sinn alles zu behandeln.
Scon gar nicht WM_PAINT, auch wenn diese Info durchgereicht wird.
Schau mal alleine bitte auf den Rückgabewert und vor allem auf die Komplexität wenn Du auf einen WM_NOTIFY reagieren willst. (Seieh DWL_MSGRESULT)
Verantwortlich für die Darstellung des Dialog ist (Regel 1 in Windows) eben das Fenster selber und das ist die WndProc des Dialoges und nicht die DlgProc!
4. Und wenn Du schon WM_PAINT behandelst und TRUE zurückgibst! Dann solltest Du auch das Minimum machen was ein WM_PAINT Handlereben macht. Begin/EndPaint aufrufen und nicht einfach nichts machen.Bitte lies die MSDN. Alles was ich hier schreibe ist dort auch zu lesen!
PS: Ein MVP weiß nicht alles, aber er weiß einiges in seinem Fachgebiet.
-
Allerdings ist es absoluter Unfud in einer DialogProc WM_PAINT zu behandeln! Technisch unmöglich. Eine DialogProc ist eben keine WndProc.ich mache das aber so und es klappt Perfekt. Wie sollte man es denn sonst machen?
-
OK, Evtl. zu hart. Aber es steht nicht da wie die Implemntierung für WM_PAINT ist.
Unter den folgenden Bedingungen kann es funktionieren.
1. Bevor die eigene WndProc des Dialoges auferufen wird wird die DlgProc aufgerufen.
2. Wenn die DlgProc TRUE zurückgibt, dann macht die WndProc des Dialoges auch nichts mehr und einfach einen return.Das ist jedoch weder dokumentiert noch klar und deshalb eben nicht sicher.
Ich würde die WndProc des Diaoges subclassen und meinen Handler vorschalten.Wobei ein subclass für WM_PAINT sowieso kritisch ist... aber das ist eine andere Geschichte.
-
WndProc? Ich benutze nur einen einzigen Dialog fürs ganze Programm, diese Rufe ich mit DialogBox auf und es klappt ganz normal mit WM_PAINT
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, dlg); } ... BOOL CALLBACK dlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: AnimateWindow(hDlg, 1000, AW_SLIDE | AW_HOR_POSITIVE); // klappt bei mir gut, keine Ahnung was der Threadersteller für Probleme hat... return TRUE; case WM_PAINT: hdcTarget = BeginPaint (hDlg, &ps) ; EndPaint (hDlg, &ps) ; return TRUE;natürlich aufs nötigste gekürzt. Vielleicht hab ich auch nur was falsch verstanden

-
edit: Es geht doch nicht, meine Bitmap wird nicht mehr gezeichnet wenn ich AnimateWindow benutze. ALso habe ich diese lösung aus dem Thread hier benutzt:
case WM_INITDIALOG: AnimateWindow(hDlg, 200, AW_BLEND); SetTimer(hDlg, NULL, 1, (TIMERPROC)LoaderDlg); case WM_TIMER: DrawThings(hDlg); return TRUE;aber auf wie viel soll ich den Timer setzen? Ist 1 millisekunde ok oder zu oft?
-
Kann denn keiner einfach mal die MSDN lesen?
AnimateWindow:
http://msdn.microsoft.com/en-us/library/ms632669(VS.85).aspxThe window procedures for the window and its child windows should handle any WM_PRINT or WM_PRINTCLIENT messages. Dialog boxes, controls, and common controls already handle WM_PRINTCLIENT. The default window procedure already handles WM_PRINT.
-
ja das hab ich gelesen aber was kommt in diese Nachricht rein??
Ein case : return TRUE wird wohl nicht reichen -.-
da steht ja nicht was man in dieser Prozedur machen soll...
-
ReinerExe schrieb:
ja das hab ich gelesen aber was kommt in diese Nachricht rein??
Gratulation daß Du es geschafft hast, in der MSDN nach AnimateWindow() zu suchen.
Aber Deine Intelligenz reicht sicher aus, um mal in der MSDN nach dem Folgebegriff WM_PRINTCLIENT zu suchen, oder nicht?
Dort steht ganz klar, was Du bei Erhalt dieser Message machen sollst oder kannst.
Andere weitverbreitete Alternative:
Warum benutzt Du nicht einfach Google oder bing.com?
Suchbegriffe "WM_PRINTCLIENT AnimateWindow" eingeben und schon kann Dir geholfen werden...
Martin
-
hast du das selber schon mal gegoogelt!? Da sind weder gute Erklärungen noch C++ Codebeispiele
-
Martin Richter schrieb:
Kann denn keiner einfach mal die MSDN lesen?
AnimateWindow:
http://msdn.microsoft.com/en-us/library/ms632669(VS.85).aspxThe window procedures for the window and its child windows should handle any WM_PRINT or WM_PRINTCLIENT messages. Dialog boxes, controls, and common controls already handle WM_PRINTCLIENT. The default window procedure already handles WM_PRINT.
Tja, das hatte ich auch schon eine Seite vorher geschrieben...