MDIChild nur in Raster bewegen?



  • So habe ich es auch gemacht ... aber das Child wird an die neue Position gesetzt und dann zurück(von mir). Das flackert recht doll und sieht unschön aus.

    Wie kann ich dafür sorgen, dass die Message nicht weitergereicht wird?



  • Das weiterreichen geschieht normalerweise durch den Aufruf von Dispatch. Hast du den mit drin?



  • Ja ... ich glaube ....

    BEGIN_MESSAGE_MAP
               MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, TMessage, OnRepose)
               MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, TMessage, OnTitelClick)
               MESSAGE_HANDLER(WM_NCRBUTTONDOWN, TMessage, OnTitelClick)
            END_MESSAGE_MAP(TForm)
    
            DYNAMIC void __fastcall WindowProc(TMessage &Msg)
            {
               if (Msg.Msg == WM_MOVING)
               {
                  Left = (Msg.Msg.XXX/25)*25;
                  Top = (Msg.Msg.YYY/25)*25;
               }
               else
                    TForm::WindowProc(Msg);
            }
    

    So müsste es doch funktionieren ... jedoch weiß ich nicht, wie ich aus der Msg die X/Y Position rausquetsche 🙂



  • ohne MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, TMessage, OnRepose)



  • Bei WM_WINDOWPOSCHANGING hast du doch einen Pointer zu einer WINDOWPOS struct in Msg.LParam. Mit dem Flag dort müsstest du das Bewegen doch verhindern können.



  • Nun ja, kann das überhaupt so funktionieren? Schließlich weist er den Messages bestimmte Funktionen zu, fragt diese aber in WndProc ab. Meinem Verständnis nach dürften die da gar nicht mehr ankommen.

    Davon abgesehen hatte ich das Problem, dass zumindest in Multithreaded-Anwedungen Botschaften verloren gehen können, wenn man den Weg über die WndProc wählt.

    Ich habs bei mir nach folgendem Schema gelöst:
    Header:

    void __fastcall CMToggleMonitoring(TMessage Message);
    BEGIN_MESSAGE_MAP
    	VCL_MESSAGE_HANDLER(CM_TOGGLEMONITORING, TMessage, CMToggleMonitoring);
    END_MESSAGE_MAP (TForm)
    

    CPP:

    void __fastcall TMainForm::CMToggleMonitoring(TMessage Message)
    {
       // Botschaftsbehandlung...
    }
    


  • und wie kann ich msg in WINDOWPOS convertieren?



  • Joe_M. schrieb:

    void __fastcall CMToggleMonitoring(TMessage Message);
    BEGIN_MESSAGE_MAP
    	VCL_MESSAGE_HANDLER(CM_TOGGLEMONITORING, TMessage, CMToggleMonitoring);
    END_MESSAGE_MAP (TForm)
    

    CPP:

    void __fastcall TMainForm::CMToggleMonitoring(TMessage Message)
    {
       // Botschaftsbehandlung...
    }
    

    ICh habe den Borland Compiler und der kennt VCL_MESSAGE_HANDLER & CM_TOGGLEMONITORING nicht.



  • Nicht die Message selbst, sondern nur den LParam von Msg.

    WINDOWPOS* winpos = (WINDOWPOS*) Msg.LParam:
    

    Du hast nur den Compiler, keine komplette IDE?



  • nunja ... ich bin nur Hobbyprogrammierer ... daher ist das IDE und der Compiler das gleiche 🙂

    So gehts übrigends:

    BEGIN_MESSAGE_MAP
               MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, TMessage, OnRepose);
            END_MESSAGE_MAP(TForm)
    
    void __fastcall TMDIServo::OnRepose(TMessage &Msg)
    {
       WINDOWPOS *mypos = (WINDOWPOS*)Msg.LParam;
       mypos->x = (mypos->x/10)*10;
       mypos->y = (mypos->y/10)*10;
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten