给多文档窗口应用程序中的主框架窗口改变背景色

来源:互联网 发布:c语言查找字符串位置 编辑:程序博客网 时间:2024/05/22 08:07
一、向应用程序添加位图

    在VC的“View”菜单中单击“Resource Includes...”, 在弹出对话框中选择“Bitmap”, 按[Import]按钮从文件中加载位图文件,单击“Workspace”的“Resource”便可见到刚才加载的位图文件,默认的资源标识符为IDB_BITMAP1。
 
二、用ClassWiard生成一个 CWnd 类的派生类CMDIClient

在CMDIClient类中重载OnEraseBkgnd(CDC* pDC),OnSize(UINT nType, int cx, int cy)函数,并用手工加入重载的虚函数WNDPROC* CClientWnd::GetSuperWndProcAddr()用来返回函数指针。
 
类CMDIClient的头文件代码如下:
class CMDIClient : public CWnd
{
// Construction
public:
 CMDIClient();
// Attributes
public:
// Operations
public:
// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CMDIClient)
 //}}AFX_VIRTUAL
 virtual WNDPROC* GetSuperWndProcAddr();

// Implementation
public:
 virtual ~CMDIClient();
 // Generated message map functions
protected:
 //{{AFX_MSG(CMDIClient)
 afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 afx_msg void OnSize(UINT nType, int cx, int cy);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};
类CMDIClient的实现文件代码如下:
BOOL CMDIClient::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 CRect rectbk; // 客户区的大小
 CDC dcMen; // 内存设备描述表
 CBitmap bmbk; // 位图对象
 bmbk.LoadBitmap(IDB_BITMAP); // 从资源加载位图 bitmap
 // 得到位图bitmap的大小
 BITMAP stBitmap;
 bmbk.GetObject(sizeof(BITMAP),&stBitmap);
 CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight);
 ////////
 dcMen.CreateCompatibleDC(pDC); // 创建兼容的设备描述表
 // 选入新的位图对象并保存旧的位图对象
 CBitmap *pold=dcMen.SelectObject(&bmbk);
 GetClientRect(&rectbk);
 // 取得客户区的大小
 // 从内存向屏幕复制位图对象
// pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(),
 pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(),
 rectbk.Height(),&dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY);
 dcMen.SelectObject(pold);
 // 恢复旧的位图对象
 dcMen.DeleteDC();
 // 释放内存设备描述表
 return TRUE;
 
// return CWnd::OnEraseBkgnd(pDC);
}
WNDPROC*CMDIClient::GetSuperWndProcAddr()
{
 static WNDPROC NEAR pfnSuper = NULL;
 return &pfnSuper; // 返回函数指针
 return 0;
}
void CMDIClient::OnSize(UINT nType, int cx, int cy)
{
 CWnd::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
 Invalidate();
}
三、修改CMainFrame类

在CMainFrame类中定义一个CMDIClient类的成员变量m_wndClient,并在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中把m_wndClient子类化为主框架窗口的客户窗口。代码如下:

在MainFrm.h 中加入:
#include "MDIClient.h" 
 class CMainFrame : public CMDIFrameWnd

{

private:

CMDIClient m_wndClient;

};
MainFrm.cpp 中加入代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
 {
  TRACE0("Failed to create toolbar/n");
  return -1;      // fail to create
 }
 if (!m_wndStatusBar.Create(this) ||
  !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar/n");
  return -1;      // fail to create
 }
 // TODO: Delete these three lines if you don't want the toolbar to
 //  be dockable
 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndToolBar);
 
 //把m_wndClient子类化为主框架窗口的客户窗口
 if(!m_wndMDIClient.SubclassWindow(m_hWndMDIClient))
 {
  TRACE("Fail to subclass MDI client window/n");
  return -1;
 }

 return 0;

原创粉丝点击