Problem beim einpassen eines Dialogs in die View



  • Hallo zusammen,

    ich muss ein kleines Tool für einen Laser schreiben. Dazu habe ich einen Dialog
    gebaut. Diesen Dialog erzeuge ich in CCoherent_ToolView::OnInitialUpdate().

    Das Funktioniert bis hierher wunderbar, der Dialog funktioniert wie erwartet.

    Das Problem besteht darin, dass die View (also die weisse Fläche innerhalb von MainFrame) nicht die gleiche Grösse hat wie mein Dialog.

    Ich habe unter anderem folgendes Versucht:

    In der View:

    void CCoherent_ToolView::OnInitialUpdate()
    {
      CView::OnInitialUpdate();
    
      if (mCommandWin == NULL)
      {
        //class CCommandWin : public CDialogEx
        mCommandWin = new CCommandWin;  // keine Angst ich habe ein delete ;-)
        if (!mCommandWin) return;
    
        mCommandWin->Create (CCommandWin::IDD);
        mCommandWin->SetParent (this);
        mCommandWin->ShowWindow (SW_SHOW);
    
        CRect childRect;
        mCommandWin->GetWindowRect (childRect);
    
        CRect viewRect;
        GetWindowRect (viewRect);
        int width = childRect.Width () + (childRect.left - viewRect.left);
        int height = childRect.Height () + (childRect.top - viewRect.top); 
        AfxGetMainWnd ()->SendMessage (UWM_SET_RECT_SIZE, width, height);
      }
    }
    

    In MainFrame:

    //----- OnSetRectSize ------------------------------------------------
    LRESULT CMainFrame::OnSetRectSize (WPARAM width, LPARAM height)
    {
    	mViewRect = CRect (0, 0, width, height);
    	return TRUE;
    }
    
    //----- OnShowWindow -------------------------------------------------
    void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
    {
      CFrameWnd::OnShowWindow(bShow, nStatus);
    
      CRect rect;
      CRect rect1;
      if (bShow)
      {
        GetClientRect (frameClient);
    
        int deltaX = frameClient.Width () - mViewRect.Width ();
        int deltaY = frameClient.Height () - mViewRect.Height ();
    
        GetWindowRect (frameWinRect);
        int w = frameWinRect.Width () - deltaX;
        int h = frameWinRect.Height () - deltaY;
    
        int fw = GetSystemMetrics (SM_CXEDGE);
        int fh = GetSystemMetrics (SM_CYEDGE);
    
        MoveWindow (frameWinRect.left, frameWinRect.top, w + fw, h + 20);
      }
    }
    

    So passt das Fenster genau in den Frame. Aber h + 20 ist ein Gebastel und kann so nicht bleiben.

    Ich habe die Doku zu GetWindowRect, GetClientRect, ClientToScreen und ScreenToClient schon zig mal gelesen, habe aber jedesmal Probleme wenn ich die Grösse von Fenstern und Controls anpassen muss 😞

    Es wäre nett, wenn mir da mal jemand auf die Sprünge helfen könnte.

    Herzliche Grüsse
    Walter



  • Wozu dient überhaupt dieses Gebastel mit dem Dialog? Es gibt doch auch Form-Views, die du verwenden könntest.

    (ansonsten müßte es auch einen GetSystemMetrics()-Wert für die Höhe der Titelleiste geben)



  • Hallo CStoll,

    Wozu dient überhaupt dieses Gebastel mit dem Dialog?

    Dialog kenn ich, View kenn ich und was der Bauer nich kennt.. 😉

    Ja ich gebs ja zu, mit der Oberflächen Programmierung hab ich's nicht so. Die Oberflächen unserer Programme sind eher rudimentär.

    Es gibt doch auch Form-Views, die du verwenden könntest

    Wenn man mit Form-Views eine Resource mit Buttons und Editfeldern bauen kann, dann wäre das eine Alternative. Ich schaus mir mal an.

    (ansonsten müßte es auch einen GetSystemMetrics()-Wert für die Höhe der Titelleiste geben)

    Ich habe eigentlich gedacht, dass ich das nicht brauche. Hier meine Überlegungen, bitte korrigiere mich wenn ich falsch liege.

    - GetWindowRect von MainFrame gibt mir die Position und die Aussenabmessungen des Applikationsfensters.
    - GetClientRect der View gibt mir die Grösse der weissen Fläche innerhalb MainFrame.
    - GetWindowRect des Dialogs gibt mir die Aussenabmessung des Dialogs

    Wenn ich jetzt die grösse des Applikationsfensters um die Differenz zwischen dem View Rect und dem Dialog Rect verkleinere, müsste doch der Dialog genau in den Frame passen. Da er das nicht tut, ist mindestens eine meiner Annahmen falsch.

    Herzliche Grüsse
    Walter


Anmelden zum Antworten