MFC --> TitleBar = FALSE setzen aber Dlg-Fenster dennoch verschieben wollen



  • hallo,

    wenn ich bei nem MFC-Dlg-Fenster mir die Title-Bar auf false setze, kann ich mein Fenster nicht mehr verschieben. Ich möchte aber, wenn ich mit der linken Maustaste auf das Fenster klick das Fenster verschieben wollen.

    Habt ihr ne Lösung parat? Danke



  • Du könntest die OnNcHitTest() Methode überschreiben und anstelle von CTCLIENT (Innenbereich) HTCAPTION zurückgeben.



  • Oder den Mausklick abfangen und halt "selber" das Fenster verschieben mit MoveWindow



  • Nimm' dir ein Beispiel an Visula Basic!:

    Vb-fun.de schrieb:

    Wenn sich der Mauscursor auf der Titelleiste einer Form befindet, kann mit gedrückter linken Maustaste normalerweise eine Form auf dem Desktop verschoben werden. Bei einer Form ohne Titelleiste ist das natürlich nicht möglich. Wie dies mit nur wenigen Codezeilen doch realisierbar ist, zeigt dieses Beispiel.
    Tipp
    Möchten Sie nicht die gesamte Form sondern nur ein Steuerelement zum Verschieben nutzen, fügen Sie die Codezeilen der Form_MouseDown-Prozedur einfach unverändert in die MouseDown-Prozedur des entsprechenden Steuerelements ein.

    REM Code im Codebereich des Moduls
    Option Explicit
    
    Public Const HTCAPTION = 2
    Public Const WM_NCLBUTTONDOWN = &HA1
    
    '16 bit
    Declare Function SendMessage Lib "user" (ByVal hwnd As Integer, _
            ByVal wMsg As Integer, ByVal wParam As Integer, _
            lParam As Any) As Long
    
    Declare Function ReleaseCapture Lib "user32" () As Long
    
    '32 bit
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam _
            As Long, lParam As Any) As Long
    
    Declare Function ReleaseCapture Lib "user32" () As Long
    
    REM Code im Codebereich der Form
       
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _
            X As Single, Y As Single)
    
      If Button = 1 Then
        ReleaseCapture
        SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
      End If
    End Sub
    

    Quelle: Form ohne Titelleiste verschieben.

    Mit freundlichen Grüßen
    Rhombicosidodecahedron



  • Danke ich werd mir eure Ideen mal zu Gemüte führen... 🙂



  • Hallo,

    hätte da mal noch eine kleine Frage. Habe ein dialogfenster mit verschiedenen controls. zum beispiel buttons, labels activeXcontrols editor etc. wenn ich jetzt mit der linken maustauste in den dialog klick und ich treff ein steuerelement, würde da das applikationsfenster mitbekommen was für steuerlement durch den mausklick gedrückt wurde?

    quasi die reihenfolge wenn das klickevent erfolgt. da zum beispiel wenn ich das WM_LMouseButtonDown-ereignis der Applikation überschreibe sie selbst nur die klicks mitbekommt die nicht auf anderen steuerelementen erfolgt sind. die priorität scheint demzufolge erstmal das entsprechende steuerelement zu haben...aber kann die applikation ansich mitbekommen was angeklickt bzw. wo der mauszeiger gelandet wurde...quasi das ereignis der klicks halt irgendwie hochbubbln...da hat das Window nen container für die alle enthaltenen steuerelemente darstellt.

    Danke



  • ArgV04 schrieb:

    wenn ich jetzt mit der linken maustauste in den dialog klick und ich treff ein steuerelement, würde da das applikationsfenster mitbekommen was für steuerlement durch den mausklick gedrückt wurde?

    Nein! Außer du schreibt in dem MessageProg von jedem Steuerelement, dass wenn die Nachricht XXX ist, dass jene Nachricht an das Hauptfenster weitergeschickt werden soll.

    Vielidee: (=Vielleichtidee = kann klappen muss aber nicht!)
    Es müsste eine Funktion geben (ein Message Prog), der die Nachrichten von den Steuerelement"kindern" eines Containers aufnimmt und weiterleitet. Dann könnte man den so einstellen, dass er die jeweiligen Nachrichten abfägt, auswertet und an das Hauptfenster weiterleitet.

    Wenn die Vielidee schlecht ist, mach' es wie ich es ganz oben beschreiben haben.

    Mit freundlichen Grüßen
    Rhombicosidodecahedron

    P.S.: Es gibt in Visual Basic 6.0 genau diese Eigenschaften (vielleicht aut in .NET) Sie leitet alle Kinderereignisse(zumindest die mit den Mausnachrichten) auf das Dialogfeld!



  • Um eine Nachricht abzufangen, bevor es von irgendjemand weiterverarbeitet wir, kannst du PreTranslateMessage benutzen.

    Um bei gedrückter linker maustaste deinen Dialog zu verschieben versuch das mal:

    void CxxxDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
    	CDialog::OnMouseMove(nFlags, point);
    	SendMessage(WM_SYSCOMMAND, SC_MOVE | HTCLIENT, 0L); 	
    }
    

    Gruß


  • Mod

    ArgV04 schrieb:

    hätte da mal noch eine kleine Frage. Habe ein dialogfenster mit verschiedenen controls. zum beispiel buttons, labels activeXcontrols editor etc. wenn ich jetzt mit der linken maustauste in den dialog klick und ich treff ein steuerelement, würde da das applikationsfenster mitbekommen was für steuerlement durch den mausklick gedrückt wurde?

    quasi die reihenfolge wenn das klickevent erfolgt. da zum beispiel wenn ich das WM_LMouseButtonDown-ereignis der Applikation überschreibe sie selbst nur die klicks mitbekommt die nicht auf anderen steuerelementen erfolgt sind. die priorität scheint demzufolge erstmal das entsprechende steuerelement zu haben...aber kann die applikation ansich mitbekommen was angeklickt bzw. wo der mauszeiger gelandet wurde...quasi das ereignis der klicks halt irgendwie hochbubbln...da hat das Window nen container für die alle enthaltenen steuerelemente darstellt.

    Nein! Sofern ein Control nicht transparent ist (WM_NCHITTEST Handler des Controls returniert HTTRANSPARENT) bekommt ein Parent davon nichts mit.
    PreTranslateMessage dafür zu verbiegen kann übeelste Folgen habe, denn viele Controls setzen einen Capture beim Mausklich und ohne den kommen die ganz schon durcheinander.

    An dieser Stelle wäre eher ein zentraler Maushook angesagt.
    Aber wie gesagt zum verschieben des Controls genügt das was CStoll bereits schrieb.


Anmelden zum Antworten