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:
- Derivez o clasa din CWnd, sa-i zicem CMDIClientWnd.
- In clasa frame-ului principal, adaug membru tip CMDIClientWnd.
Code: Select all
#include "MDIClientWnd.h" class CMainFrame : public CMDIFrameWnd { CMDIClientWnd m_wndMDIClient; // ... };
- 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); // ... }
- 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(); }
- 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