雖說現在的應用程序普遍使用標簽形式,但是多文檔依然作為文檔編輯重要形式。例如 ps 、vc6 等。
介紹一些用法:
1、框架窗口:創(chuàng)建一個客戶區(qū)窗口。類名:MDICLIENT
文檔窗口:創(chuàng)建:CreateWindow(...CLIENTCREATESTRUCT)
typedef struct tagCLIENTCREATESTRUCT {
HANDLE hWindowMenu; //要加入文檔列表的子菜單的句柄,文檔列表菜單
UINT idFirstChild; //與文檔列表中的第一個文檔窗口相關聯(lián)的菜單ID
} CLIENTCREATESTRUCT;
2、
typedef struct tagMDICREATESTRUCT { // mdic
LPCTSTR szClass;
LPCTSTR szTitle;
HANDLE hOwner;
int x;
int y;
int cx;
int cy;
DWORD style;
LPARAM lParam;
} MDICREATESTRUCT;
要有一個顯示文檔列表的菜單
3、消息:
主窗口:不處理的消息:reurn DelFrameProc(hwnd,hwndClient,message,wParam,lParam);
子文檔窗口:不處理的消息: return DefMDIChildProc (hwnd, message, wParam, lParam) ;
(1)
WM_MDICREATE //應用程序通過發(fā)送 WM_MDICREATE創(chuàng)建一個文檔
wParam = 0; // not used; must be zero
lParam = (LPARAM) (LPMDICREATESTRUCT) lpmdic; // creation data
(2)
WM_MDIGETACTIVE //客戶區(qū)通過發(fā)送WM_MDIGETACTIVE獲得活動子窗口的句柄
wParam = 0; // not used; must be zero
lParam = (LPBOOL) lpfMaximized; // optional pointer to maximized state flag
(3)
WM_QUERYENDSESSION //其lParam參數可以區(qū)分是否關閉
nSource = (UINT) wParam; // 未用
fLogOff = lParam
返回true表示終結,false表示未終結
(4)
WM_MDIDESTROY //發(fā)送給客戶區(qū)結束子文檔
wParam = (WPARAM) (HWND) hwndChild; // handle to child to close
lParam = 0;
(5)
WM_MDITILE //以平鋪方式重新排列文檔。
wParam = (WPARAM) (UINT) fuTile; // tiling flag
lParam = 0;
(6)
WM_MDICASCADE //以層疊方式重新排列文檔
wParam = (WPARAM) (UINT) fuCascade; // cascade flag
lParam = 0;
(7)
WM_MDIICONARRANGE //重新排列所有最小化的文檔
wParam = 0; // not used; must be zero
lParam = 0; // not used; must be zero
(8)當窗口變成活動或非活動的,都接收此此消息
WM_MDIACTIVATE //主窗口接收時:得到一個活動子窗口
// Message sent to MDI client
wParam = (WPARAM) (HWND) hwndChildAct; // 設定活動子窗口的句柄
lParam = 0; // not used; must be zero
//子文檔窗口接收時,
// Message received by MDI child
hwndChildDeact = (HWND) wParam; // 失去活動的窗口
hwndChildAct = (HWND) lParam; // 接受活動的窗口
(9)
WM_MDISETMENU //設置主窗口的菜單。
wParam = (WPARAM) (HMENU) hmenuFrame; // handle to frame menu
lParam = (LPARAM) (HMENU) hmenuWindow; // handle to Window menu ,加入新文檔列表的菜單
Windows會在該菜單項上自動添加。
(10)注意:像WM_CHILDACTIVATE 、WM_GETMINMAXINFO 、WM_MENUCHAR 、WM_MOVE 、WM_SETFOCUS 、WM_SIZE 和WM_SYSCOMMAND。要傳給DefMDIChildProc處理。故:在這些消息后用break,而不return。
(11)不常用到的
WM_MDIRESTORE = $0223; //程序 發(fā)送此消息給MDI客戶窗口讓子窗口從最大最小化恢復到原來大小
WM_MDINEXT = $0224; //程序 發(fā)送此消息給MDI客戶窗口激活下一個或前一個窗口
WM_MDIMAXIMIZE = $0225; //程序發(fā)送此消息給MDI客戶窗口來最大化一個MDI子窗口;
4、加速鍵的消息循環(huán)
while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
!TranslateAccelerator (hwndFrame, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
/////////才掌握,發(fā)現現在大多數公司都棄用啦。可惜啊,可惜啊、
posted on 2011-04-11 11:03
Yu_ 閱讀(458)
評論(0) 編輯 收藏 引用 所屬分類:
Windows程序設計