In MDIChild den Befehl wsMaximized abfangen



  • Hallo,

    ich habe ein Programm geschrieben in MDIForm. Nur wen ich in den MDIChild auf Maximieren gehe setzt er das in den ganzen MDIForm rein und die TForm.BorderIcons sind dann in MainMenu.

    Meine Frage ist kann man das unterbinden oder abfangen? Das er das ganze im MDIForm macht, aber das Icon(biMaximize) soll aber Activ bleiben.

    Ich habe zwar schon was versucht

    void __fastcall TMDIChild::FormResize(TObject *Sender)
    {
    if (WindowState == wsMaximized)
     WindowState = wsNormal;
    }
    

    Die TForm.BorderIcons blinkt kurz auf im MainMenu und dann ist der Rahmen vom Haupt Programm weg und setzt das falsch.

    Ich Programmiere mit C++Builder XE3 und hoffe es kann mir einer Helfen.



  • Stichwort WM_NCHITTEST. Damit kannst du das dr├╝cken des Maximaze Buttons abfangen:

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx



  • Sorry das ich das jetzt wieder erwecke.
    Aber ich bekomme das nicht hin ­čś×
    Und zwar

    private:
    void __fastcall WMNCHitTest(TWMNCHitTest& Message);
    
    public:
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest)
    END_MESSAGE_MAP(TForm)
    ...
    void __fastcall TMDIChild::WMNCHitTest(TWMNCHitTest& Message)
    {
    
    switch (Message.Msg)
    {
      case WM_NCHITTEST:
          if (Message.Result == HTMAXBUTTON)
    	{
    	   // Er springt hier nicht rein 
    	}
    
    }
    
    }
    

    Result ist immer '0' und man kann die Buttons Minimiert, Maximiert und Schlie├čen nicht anklicken. Irgend was fehlt wei├č aber nicht was.



  • MESSAGE_HANDLER schreibt:

    Any function specified in a MESSAGE_HANDLER macro must be defined as follows:
    LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);



  • @Swordfish: Dies ist aber ein VCL-Code nicht ATL, s.a. Frage zu MESSAGE_HANDLER(...).

    BTW: Warum sind eigentlich deine ganzen Themen in der Forentechnik gel├Âscht?



  • @rave173 :
    Er kann da auch nicht reinspringen, weil die Aufgabe von WM_NCHITTEST das Ermitteln der Schaltfl├Ąche ist, auf der der Mauszeiger steht.
    Du musst dazu die "Original" Routine aufrufen:

    void __fastcall TMDIChild::WMNCHitTest(TWMNCHitTest& Message)
    {
    
    switch (Message.Msg)
    {
      case WM_NCHITTEST:
            TForm::WndProc(Message);
            
            if (Message.Result == HTMAXBUTTON)
    	{
    	   
    	}
    
    }
    
    }
    


  • Erst mal danke f├╝r die Antworten,

    Ich habe das jetzt anders gemacht kam mit TForm::WndProc(Message); nicht zurecht

     MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCHitTest)
    
    ...
    
    switch (Message.Msg)
    {
    	case WM_NCLBUTTONDOWN:
    
    	if (Message.WParam == HTMAXBUTTON)
    	{
            ... code ...
            }
    										
            break;
    
    
    	}
    

    l├Ąuft oder kann es Probleme damit geben?



  • @th69 sagte in In MDIChild den Befehl wsMaximized abfangen:

    Dies ist aber ein VCL-Code nicht ATL

    Wow. Hab nicht gewusst da├č die Macrodingens dort auch so hei├čen.


Log in to reply