1、vc+如何给窗体添加背景图片?VC 是一个功能强大的可视化的开发工具,但是用 VC 做的标准界面与 Windows 一样色彩灰暗单调,例如多文档窗口应用程序中的主框架窗口的背景便是如此。那么能否给主框架窗口的背景改变一下色彩或是给主框架窗口加上一幅漂亮的图片做背景?其实也不难。但与单文档窗口应用程序中改变框架窗口的背景方法不同,对多文档窗口应用程序中的主框架窗口改变背景不能简单地用 ClassWizard 重载 OnEraseBkgnd(CDC pDC)函数的方法实现。因为多文档窗口应用程序中的主框架窗口的背景区是一个 MDIClient 类的窗口,因此改变背景与这个 MDIClient 类的
2、窗口有关。MDIClient 类的窗口的句柄是 m_hWndMDIClient(在 CMDIFrameWnd 中)。以下是其实现的步骤: 一、 使用 MFC AppWizard 向导创建一个多文档窗口应用程序 1、在 VC 的“File”菜单中单击New,弹出一“New”对话框。在“Projects”页中选择“MFC AppWizard exe”,在“Project name”编辑框中输入“DrawBackground”,按OK 按钮,退出“New”对话框。 2、在“MFC AppWizard step 1”对话框到“MFC AppWizard step 6”对话框中选择默认选项,按Finis
3、h按钮即完成多文档窗口应用程序的定制。 注:MFC(Microsoft Foundation Class)是 MSVisual C的类库。 二、向应用程序添加位图 在 VC 的“View”菜单中单击“Resource Includes.”, 在弹出对话框中选择“Bitmap”, 按Import按钮从文件中加载位图文件,单击“Workspace”的“Resource”便可见到刚才加载的位图文件,默认的资源标识符为 IDB_BITMAP1。 三、用 ClassWiard 生成一个 CWnd 类的派生类 CclientWnd 在 CclientWnd 类中重载 OnEraseBkgnd(CDC pD
4、C),OnSize(UINT nType, int cx, int cy)函数,并用手工加入重载的虚函数 WNDPROC CClientWnd:GetSuperWndProcAddr()用来返回函数指针。 类 CclientWnd 的头文件代码如下: class CClientWnd : public CWnd / Construction public: CClient(); / Attributes public: / Operations public: / Overrides / ClassWizard generated virtual function overrides file
5、:/AFX_VIRTUAL(CClientWnd) public: virtual WNDPROC GetSuperWndProcAddr(); file:/AFX_VIRTUAL / Implementation public: virtual CClientWnd(); / Generated message map functions protected: file:/AFX_MSG(CClientWnd) afx_msg BOOL OnEraseBkgnd(CDC pDC); afx_msg void OnSize(UINT nType, int cx, int cy); file:/
6、AFX_MSG DECLARE_MESSAGE_MAP() ; 类 CclientWnd 的实现文件代码如下: / CClientWnd message handlers 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_BITMAP1); / 从资源加载位图 bitmap /
7、 得到位图 bitmap 的大小 BITMAP stBitmap; bmbk.GetObject(sizeof(BITMAP),stBitmap); CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight); / dcMen.CreateCompatibleDC(pDC); / 创建兼容的设备描述表 / 选入新的位图对象并保存旧的位图对象 CBitmap pold=dcMen.SelectObject( bmbk); GetClientRect(rectbk); / 取得客户区的大小 / 从内存向屏幕复制位图对象 pDCStretchBlt(rectbk
8、.left,rectbk.top,rectbk.Width(), rectbk.Height(),dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY); dcMen.SelectObject(pold); / 恢复旧的位图对象 dcMen.DeleteDC();/ 释放内存设备描述表 return true; WNDPROC CClientWnd:GetSuperWndProcAddr() static WNDPROC NEAR pfnSuper = NULL; return pfnSuper; / 返回函数指针 void CClientWnd:OnSize(UINT
9、nType, int cx, int cy) CWnd:OnSize(nType, cx, cy);/ TODO: Add your message handler code here file:/重画窗口 Invalidate(); 四、修改 CMainFrame 类 在 CMainFrame 类中定义一个 CClientWnd 类的成员变量 m_wndClient,并在CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)函数中把 m_wndClient 子类化为主框架窗口的客户窗口。代码如下: 在 MainFrm.h 中加入: include
10、 “ClientWnd1.h“ class CMainFrame : public CMDIFrameWnd private: CClientWnd m_wndClient; MainFrm.cpp 中加入代码如下: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CMDIFrameWnd:OnCreate(lpCreateStruct) = 1) return 1; file:/把 m_wndClient 子类化为主框架窗口的客户窗口 if(!m_wndClient.SubclassWindow(m_hWndMDIClie
11、nt) TRACE(“Fail to subclass MDI client windown“); return 1; 五、关键技术 1、本程序并不复杂,关键是要知道多文档窗口应用程序中的主框架窗口的背景区是一个 MDIClient 类的窗口。 2、选用函数要正确,如 CClientWnd:OnEraseBkgnd(CDC pDC)函数中选用 GetClientRect(rectbk) 函数来取得客户区的大小要比选用 GetClipBox(rectbk) 函数来得好。 3、要在 CclientWnd 类中重载 OnSize(UINT nType, int cx, int cy) 函数,并加入 Invalidate() 函数重画窗口。