当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 利用非模窗口生成MDI介面
| 利用非模窗口生成MDI界面 下载源代码 #include "MDIChild.H"class CMainFrame : public CFrameWnd{protected: // create from serialization only CMainFrame(); DECLARE_DYNCREATE(CMainFrame) // Attributespublic: CMDIChild m_Child; /////////////////////////////// .....} 第四步:在 OnCreate() 事件中加入m_Child.InitMainWnd(this)。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ ...... RECT Rect; SetRect(&Rect, 0,64,800, 574); // 非模子窗口的活动区域,没想出自动计算的好办法, m_Child.InitMainWnd(this, &Rect); //所以只能手工设置。} 第五步:增加菜单事件 #include "Dlg1.H"void CMainFrame::OnDialog1() { CDlg1 *pDlg = NULL; char *sName = "功能1"; //////////////////////////////// if(!m_Child.GetClassChild(sName)) { pDlg = new CDlg1; if(!pDlg) return; pDlg->Create(IDD_DIALOG1, this); } m_Child.ADD((CView*)pDlg, sName);} 第六步:补充CDlg1是一个CDialog的弹出窗口,将普通弹出窗口转变成非模窗口的方法在网上有很多,这里就不多说了,也可以自己看代码。非模子窗口是用名称进行管理的,就是说可以生成两个基类相同的窗口,但是它们 在 m_Child.ADD 的时候要用不同的名称登记。技术细节: 利用非模窗口在弹出时依然响应消息流的特点,程序主要是通过管理主窗和非模子窗口,让它们在得到和失去焦点的时候标题栏依然显示正常。因为,激活非模子窗口时会使主窗口的标题变灰,激活主窗口时非模子窗口也会变灰。要实现这种功能并不困难,但要把这些功能封装成一个类方便使用就比较复杂。我是运用 了 SetWindowLong(hWnd,GWL_WNDPROC,(LONG)MDIChildProc) 来栏截主窗口和非模子窗口的信息。在 MDIChildProc 和 MDIMainProc 两个函数中处理标题栏。 缺点: 没有想出方便的方法得到主窗口客户区的大小,因此我强制了主窗口始终为最大化,并且需要手工计算出客户区的大小。以后我就不用它了。 ![]() 图一 图像描述 |
评论 (0) All