HDN_BEGINTRACK funktioniert nicht
-
Wenn man laut MSDN für eine Headercontrol eines Listviewfensters mit Reportstyle den WM_NOTIFY-Event HDN_BEGINTRACK abfängt und "return 1" zurückgibt, dann kann man damit die Größenänderung per Mausdrag verhindern.
Ich hab hier zwei Anwendungen geschrieben, bei einer wird mit CreateWindow ein Hauptfenster erzeugt und ebenfalls mit CreateWindow ein Childfenster im Listview-Reportstyle. Obengenannte Vorgehensweise führt hierbei zum Erfolg.
Jetzt hab ich eine andere Anwendung geschrieben, in der im WinMain(..) kein Fenster mit CreateWindow erzeugt wird, sondern mit DialogBox(...) eine Dialogresource aufgerufen wird, die eine Listviewcontrol im Reportstyle mit Headercontrol enthält. Auch hier erhalte ich im Messagehandler der Dialogbox den Event WM_NOTIFY->HDN_BEGINTRACK, wenn ich mit der Maus versuche die Größe der Headercontrol zu verstellen. Jedoch hat "return 1" keine Auswirkung, die Größenänderung wird nicht verhindert, sondern zugelassen. Was mache ich falsch. Ich glaube schon mal irgendwo gelesen zu haben, das der Messagehandler einer Dialogbox irgenwie bestimmte Sachen anderst behandelt als der Messagehandler eines mit CreateWindow erzeugten Fensters.
So rufe ich die Dailogbox auf:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int iCmdShow){ return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), 0, DialogMain_EventHandler); }Wer kann mir da weiterhelfen?
-
Die HDN_BEGINTRACK Meldung wird an das List Control gesendet. Du musst also das List Control subclassen und dort die Nachricht behandeln. In der DialogProc kannst Du nichts machen.
-
Klappt so nicht. Die Nachricht wird nicht an den Eventhandler des gesubclassten Listviews geschickt, sondern läuft immer noch im Eventhandler der Dialogbox auf. Hier mal mein Code vieleicht mach ich was falsch:
Der Eventhandler wird bei der Inizialierung des Dialogs "umgebogen"
case WM_INITDIALOG:{ wProc_Listview1 = (WNDPROC)SetWindowLong(GetDlgItem(hWnd, DLG_LISTVIEW1), GWL_WNDPROC, (LONG)SubclassListview1); return 1; }und hier der neue Eventhandler:
LRESULT CALLBACK SubclassListview1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ switch(message){ case WM_NOTIFY:{ switch(((LPNMHDR)lParam)->code){ case HDN_BEGINTRACK:{ return 1; } } } } return CallWindowProc(wProc_Listview1, hWnd, message, wParam, lParam); }
-
Ich glaubs nicht, aber ich hab den Eventhandler des Dialogs subclssen müssen. Das versteh ich jetzt aber nicht.
-
Du brauchst beide HDN_BEGINTRACK catchen:
case HDN_BEGINTRACKA: case HDN_BEGINTRACKW: if (disable) return 1;Und JA, bei ListView muß man subclassen:
msdn schrieb:
HDN_BEGINTRACK Notification
Notifies a header control's parent window ...
-
sapero schrieb:
Du brauchst beide HDN_BEGINTRACK catchen:
case HDN_BEGINTRACKA: case HDN_BEGINTRACKW: if (disable) return 1;Moin,
jo da geb ich dir recht, ich hab das jetzt mal ausprobiert und den Listview gesubclasst. Die Control sendet mir HDN_BEGINTRACKW, obwohl mein Project nicht für Unicode definiert ist, also da wäre ich ja lebtag nicht drauf gekommen.
Aber nun die nächste Frage, wie bereits oben beschrieben hab ich dann mal meinen Dialog gesubclasst und die Dialogproc gegen eine Windowsproc ausgetauscht. Da hat dann das Abfangen des Events HDN_BEGINTRACK geklappt, hat da jemand eine Erklärung dafür?