OnNcHitTest HTSYSMENU
-
Freitag, 27. April 2012 13:01
Hallo, ich habe einen Nicht Modalen Dialog in einer MFC Anwendung den ich nicht verschieben aber schließen lassen will. Das Window mit DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU erzeugt und hat auch einen rotes Abbrechen Kreuz.Jetzt habe ich DlgCode OnNcHitest und immer wenn HTCAPTION kommt gebe ich HTNOWARE zurück. Damit lässt er sich nicht mehr verschieben. Aber ich bekomme leider nie HTSYSMENU um das Abbrechen Kreuz abzufangen. Ich habe mir das ausgeben lassen.Es gibt nur HTCLIENT und HTCAPTION Nachrichten. Wie muss ich das Fenster definieren damit ich auch HTSYSMENU bekomme?
Freudi
Alle Antworten
-
Sonntag, 29. April 2012 11:21Moderator
Ich tippe mal darauf, dass die Doku nicht angepasst wurde.
Lies mal den Thread:
http://forums.codeguru.com/showthread.php?t=502215Evtl. hilft es weiter.
Ich denke HTCLOSE müsstest Du dennoch bekommen...Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
-
Mittwoch, 2. Mai 2012 05:23
Hallo Freudi,
ich weis jetzt nicht, was Du exakt in der WM_NCHITTEST Bearbeitung gemacht hast. Ich habe mal kurz bei mir gegraben, da ich sowas auch mal gemacht hatte, das war wie folgt:
LRESULT CDlgTesterDlg::OnNcHitTest(CPoint point) { LRESULT retval; retval=CDialog::OnNcHitTest(point); if (retval==HTCAPTION) retval=HTNOWHERE; return retval; }Mit dem obigen code wird das verschieben des Fensters unterbunden, das Systemmenü, und die Buttons zum Minimieren, Maximieren und Schließen ist davon unberührt.
Übrigens wenn Du den Schließen Button beeinflussen möchtest, wie z.B. vorher prüfen ob was gespeichert werden soll, dann kannst Du die virtuelle Methode CDIalog::OnCancel überschreiben. Die wird aufgerufen, wenn der Schließen button betätig wurde.
-
Mittwoch, 2. Mai 2012 08:28
Hallo Bordon meine sieht so aus:
LRESULT CDlgMosa2::OnNcHitTest(CPoint point) { LRESULT res = CDialog::OnNcHitTest(point); if( res == HTSYSMENU ) return res; if( res == HTCAPTION) res = HTNOWHERE; else TRACE("%ld\n", res); return res; }Der Trace gibt immer nur 1= HTCLIENT aus. D.h. es scheinen nur HTCAPTION und HTCLIENT zu kommen. Am Ende muss ich selber testen ob die übermittelte Position im "Kreuz" liegt. ABer ich denke das ist auch nicht so einfach weil der in XP ja anders aussieht als in Windows7. -
Mittwoch, 2. Mai 2012 08:47Hab mir jetzt mal 3 Testprojekte erstellt. Dialog basierend, Single Doc, Multi Doc. In den Dlg/Viewklassen habe ich mir mit Trace die Codes in OnNcHitTest ausgeben lassen. Da kommt nur HTCAPTION,HTCLIENT,HTBORDER mehr scheint es unter Windows 7 nicht zu geben. Ich probiere jetzt noch mal XP.
-
Mittwoch, 2. Mai 2012 10:38
Mein Endziel war ein Dialog der nicht verschiebbar aber schließbar ist. Ich habe das jetzt ohne NCHITTEST geloest via
...OnInitDialog ... CMenu* pSystemMenu = GetSystemMenu(FALSE); if ( pSystemMenu ) pSystemMenu->RemoveMenu(SC_MOVE, MF_BYCOMMAND);
Funktioniert natürlich nur wenn der Dialog den Style WS_SYSMENU gesetzt hat. Irgendwie scheint das in Vista/Win7 nicjht mehr zu klappen. In XP ging es, aber der Kunde hat Win7/Vista.
Danke trotzdem an alle
- Als Antwort markiert Freudi Mittwoch, 2. Mai 2012 10:38
-
Freitag, 4. Mai 2012 12:14Moderator
Das scheint an DWM zu liegen.
Ein Test Programm mit einem einfachen MC Dialog zeigt gleiches Verhalten.
Ich bekomme HTMENU nur in WM_NCMOUSEMOVE zu sehen.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
-
Freitag, 11. Mai 2012 08:33
Hallo MArtin, Denke ich auch weil es in Xp funtioniert hat.

