[MFC] Cum schimb aranjarea default a ferestrelor MDI Child?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] Cum schimb aranjarea default a ferestrelor MDI Child?

Post by Ovidiu Cucu » 26 Mar 2012, 10:20

Problema
Intr-o aplicatie MDI, atunci cand se creaza ferestre MDI Child noi, acestea sunt arajate in cascada.
Cum as putea schimba aceasta aranjare?

Rezolvare
Ferestrele MDI Child, sunt de fapt copiii unei fereste MDI Client care sta in zona client a frame-ului principal.
Pentru a crea o noua fereastra MDI Clild, framework-ul trimite un mesaj WM_MDICREATE ferestrei MDI Client. Pozitia si dimensiunea ferestrei MDI Child este setata intern in procedura fereastra default (aceasta primeste CW_USEDEFAULT ca si coordonate si dimensiuni).
Totusi aceasta se poate schimba in felul urmator:
  1. Derivez o clasa din CWnd, sa-i zicem CMDIClientWnd.
  2. In clasa frame-ului principal, adaug membru tip CMDIClientWnd.

    Code: Select all

    #include "MDIClientWnd.h"
    
    class CMainFrame : public CMDIFrameWnd
    {
       CMDIClientWnd m_wndMDIClient;
       // ...
    };
  3. Subclasez fereastra MDI Client. De notat ca m_hWndMDIClient este un membru public al clasei CMDIFrameWnd si este handle-ul ferestrei MDI Client.

    Code: Select all

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
       if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
          return -1;
    
       m_wndMDIClient.SubclassWindow(m_hWndMDIClient);
       // ...
    }
  4. In clasa CMDIClientWnd, mapez mesajul WM_MDICREATE.

    Code: Select all

    // MDIClientWnd.h
    
    class CMDIClientWnd : public CWnd
    {
       // ...
       afx_msg LRESULT OnMDICreate(WPARAM wParam, LPARAM lParam);
    };

    Code: Select all

    // MDIClientWnd.cpp
       // ...
       ON_MESSAGE(WM_MDICREATE, OnMDICreate)
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CMDIClientWnd message handlers
    
    LRESULT CMDIClientWnd::OnMDICreate(WPARAM wParam, LPARAM lParam)
    {
       LPMDICREATESTRUCT lpMDICreateStruct = (LPMDICREATESTRUCT)lParam;
       // NOTE: here can modify lpMDICreateStruct in order to change defaults.
       // ...  
       return Default();
    }
  5. In fine, modific membrii x, y, cx si cy ai structurii MDICREATESTRUCT, pentru a schimba pozitia si dimensiunile ferestrei MDI child care va fi creata.


Resurse [Windows Dev Center] Vezi si

<< Back to MFC index



Post Reply