VC—主框架窗口绘制背景

来源:互联网 发布:iphone6 mac地址 编辑:程序博客网 时间:2024/04/29 17:26

VC—主框架窗口绘制背景

使 用VC进行项目开发,特别是简单的MIS系统开发中,通常在用户没有进行操作之前显示的是主框架的窗口(用户点击操作菜单项再弹出处理窗口)。因此给主框 架窗口提供一个背景图片就显得很有必要(例如一用户满意的LOGO等)。但是对于主框架的背景的绘制不能简单地用ClassWizard重载 OnEraseBkgnd(CDC* pDC)函数的方法实现。

       多文档窗口应用程序中的主框架窗口的背景区是一个MDIClient类的窗口,因此改变背 景与这个MDIClient类的窗口有关。MDIClient类的窗口的句柄是m_hWndMDIClient(在CMDIFrameWnd中),可以通 过以下步骤实现:

Step 1:在资源中添加一个Bitmap资源,资源标志符为IDB_BKGOUND;

Step 2:添加一个MDIClient类:Insert——>New Class,选择MFC Class,基类选择“generic CWnd”,类名为CClientWnd;

Step 3:为CClientWnd添加OnEraseBkgnd(CDC* pDC),OnSize(UINT nType, int cx, int cy)函数的重载(Class Wizard),并添加虚函数WNDPROC* CClientWnd::GetSuperWndProcAddr():

BOOL CClientWnd::OnEraseBkgnd(CDC* pDC)

{

// TODO: Add your message handler code here and/or call default

CRect rectbk; // 客户区的大小

CDC dcMen; //内存设备描述表

CBitmap bmbk; // 位图对象

bmbk.LoadBitmap(IDB_BKGOUND); // 从资源加载位图 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(),rectbk.Height(),&dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY);

dcMen.SelectObject(pold);

// 恢复旧的位图对象

dcMen.DeleteDC();

// 释放内存设备描述表

//return CWnd::OnEraseBkgnd(pDC);

return TRUE;

}


void CClientWnd::OnSize(UINT nType, int cx, int cy)

{

CWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

Invalidate(); //大小改变后重画

}


ClientWnd.h中添加:

virtual WNDPROC* GetSuperWndProcAddr();

ClientWnd.cpp中添加:

NDPROC* CClientWnd::GetSuperWndProcAddr()

{

static WNDPROC NEAR pfnSuper = NULL;

return &pfnSuper; // 返回函数指针

}


Step 4:为主框架添加背景:

在MainFrm.h中添加:CClientWnd m_wndClient; (添加#i nclude “ClientWnd.h”头文件)

在CMainFrame类的OnCreate()事项中添加:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;


if(!m_wndClient.SubclassWindow(m_hWndMDIClient))

{

TRACE("Fail to subclass MDI client window/n");

return -1;

}

//////省略

}