深入MDI客户窗口编程.docx_第1页
深入MDI客户窗口编程.docx_第2页
深入MDI客户窗口编程.docx_第3页
深入MDI客户窗口编程.docx_第4页
深入MDI客户窗口编程.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深入MDI客户窗口编程 在使用VC6.0/5.0的AppWizard生成MDI应用的时候,我们发现MDI主窗口的客户区背景千篇一律的是深灰的。VC6.0/5.0并没有提供修改其背景色的方法。甚至使用SDK编程也没有好的方法修改背景色。以至于微软的产品如Office也是灰蒙蒙的背景。那么,有没有办法将背景设置为自己喜欢的颜色呢?笔者在学习过程中摸索出一套随意改变客户区窗口颜色的方法。利用这套方法,可以将客户区窗口设为256色背景甚至设为BITMAP位图以至于动画等等。大大地增强了程序的多媒体效果。先介绍对MDI客户窗口编程的基本原理。一、MDI客户窗口一个MDI应用的主框架窗口包含一个特殊的子窗口称为MDICLIENT窗口。MDICLIENT窗口负责管理主框架窗口的客户区。MDICLIENT窗口本身有自己的子窗口即由CMDIChildWnd派生的文档窗口,也就是MDI子窗口。MDI主框架窗口负责管理MDICLIENT子窗口。当控制条(菜单条,状态条等)发生变化时,MDI主框架窗口重新配置MDICLIENT窗口。MDICLIENT子窗口负责管理全部的MDI子窗口。父窗口负责将某些命令传递到子窗口。因此,消息队列发向MDI子窗口的消息由MDICLIENT窗口负责传递,发向MDICLIENT窗口和MDI子窗口的消息由主框架窗口负责传递。这样,我们可以在主框架窗口截获关于MDICLIENT窗口的重画消息然后加入自己设计的代码。二、MDI客户窗口编程方法对MDI客户窗口编程有一定的难度。原因是MDIFrameWnd的客户区完全被MDICLIENT窗口覆盖掉了。这样,MDI主窗口类MDIFrameWnd的背景色和光标都不起作用。同时,微软并不支持将MDICLIENT窗口作为子类,MDICLIENT窗口只能使用标准的背景色和光标。所以,对MDI客户窗口编程不能象对普通窗口那样简单地重载WM_PAINT的消息处理函数。改变MDI客户窗口背景的方法有两种。使用CMDIFrameWnd:CreateClient 函数: CreateClient( LPCREATESTRUCT lpCreateStruct, CMenu* pWindowMenu );参数lpCreateStruct是指向CREATESTRUCT 结构的指针。在CREATESTRUCT 结构中lpszClass项指向窗口类WNDCLASS结构。通过改变WNDCLASS结构中的HbrBackground项和hCursor项可以更改MDICLIENT窗口的背景刷和光标。由于该函数创建新的MDICLIENT窗口对象,必须在重载的主窗口的OnCreate成员函数中调用。该方法比较复杂,必须手动创建MDI客户窗口,不能利用AppWizard自动提供的功能。而且,只能使用Windows95有限的16色背景刷。本文采用第二种方法。在主框架窗口的消息队列中截获发向MDI客户窗口的WM_PAINT消息并向主框架窗口发送一条标志消息。在这条标志消息的处理函数中对MDI客户窗口进行操作。该方法比较简捷,但有几点值得注意的地方。 首先,如何截获MDI客户窗口WM_PAINT消息。MFC提供了PreTranslateMessage(MSG* pMsg) 函数。它在消息发送到TranslateMessage 和DispatchMessage 函数以前预先解释消息。可以重载该函数截获MDI客户窗口WM_PAINT消息:BOOL PreTranslateMessage(MSG* pMsg)if(pMsg-hwnd=m_hWndMDIClient & pMsg-message=WM_PAINT)PostMessage(WM_PAINT);return CMDIFrameWnd:PreTranslateMessage(pMsg);其次,为简单起见,这里将标志消息设为MDI主窗口的WM_PAINT。在MDI主窗口WM_PAINT的消息处理函数中增加重画MDI客户窗口的代码。读者也可以自定义消息,不过麻烦一点。最后,由于对MDI客户窗口的操作都是在主窗口完成的。如何在主窗口中获得MDI客户窗口的设备描述表呢。其实,在MDI主窗口类中有MDI客户窗口成员m_hWndMDIClient。按如下方法得到客户窗口的设备描述表dc.m_hDC=:GetDC(this-m_hWndMDIClient);然后就可以对客户窗口进行操作了。三、实例将客户窗口设为256色背景。 使用AppWizard生成MDI应用TEST。 在TEST.CPP中的函数,增加如下代码: BOOL CTestApp:InitInstance()AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); / Call this when linking to MFC statically#endifSetRegistryKey(_T(Local AppWizard-Generated Applications);LoadStdProfileSettings(); / Load standard INI file options (including MRU)CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_TESTTYPE,RUNTIME_CLASS(CTestDoc),RUNTIME_CLASS(CChildFrame), / custom MDI child frameRUNTIME_CLASS(CTestView);AddDocTemplate(pDocTemplate);/ create main MDI Frame windowCMainFrame* pMainFrame = new CMainFrame;if (!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd = pMainFrame;/ Parse command line for standard shell commands, DDE, file openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ Dispatch commands specified on the command lineif (!ProcessShellCommand(cmdInfo)return FALSE;/ The main window has been initialized, so show and update it.pMainFrame-ShowWindow(m_nCmdShow);/*增加代码头*AfxGetMainWnd()-PostMessage(WM_PAINT);/*增加代码尾*pMainFrame-UpdateWindow();return TRUE;保证程序一开始就更新客户窗口。使用ClassWard在CmainFrame类中加入PreTranslateMessage消息处理函数入如下: BOOL PreTranslateMessage(MSG* pMsg) /*增加代码头*if(pMsg-hwnd=m_hWndMDIClient & pMsg-message=WM_PAINT)PostMessage(WM_PAINT);/*增加代码尾*return CMDIFrameWnd:PreTranslateMessage(pMsg);在主窗口的WMPAINT消息处理函数中加入: void CMainFrame:OnPaint()/*增加代码头*CMDIFrameWnd:OnPaint();CRect rc;CDC dc;dc.m_hDC=:GetDC(this-m_hWndMDIClient);CBrush br(RGB(120,200,40));/256色刷子dc.SelectObject(&br);dc.GetClientRect(&rc);dc.PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),PATCOPY);ReleaseDC(&dc);/*增加代码尾*将客户窗口设为Bitmap位图。 1,2,3同例一。4在资源中加入自己喜欢的位图并设为IDB_BITMAP1。在主窗口类加入Cbitmap类成员m_bmp。并在CMDIFrameWnd:OnCreate()函数末尾初始化:m_bmp.LoadBitmap(IDB_BITMAP1);5在主窗口的WM_PAINT消息处理函数中加入:void CMainFrame:OnPaint()/*增加代码头*CMDIFrameWnd:OnPaint();CRect rc,memrc;CDC dc,memdc;dc.m_hDC=:GetDC(this-m_hWndMDIClie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论