Note: Forums will be making significant UX changes to address key usability improvements surrounding search, discoverability and navigation. To learn more about these changes please visit the announcement which can be found HERE.

Jawab 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:21
    Moderator
     
     

    Ich tippe mal darauf, dass die Doku nicht angepasst wurde.

    Lies mal den Thread:
    http://forums.codeguru.com/showthread.php?t=502215

    Evtl. 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
     
      Enthält Code

    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
     
      Enthält Code

    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:47
     
     
    Hab 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
     
     Beantwortet Enthält Code

    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:14
    Moderator
     
     

    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.