★既瑜★--为VC程序加背景图

导读:
  为VC程序加背景图
  VC是一个功能强大的可视化的开发工具,但是用VC做的标准界面与Windows一样色彩灰
  暗单调,例如多文档窗口应用程序中的主框架窗口的背景便是如此。那么能否给主框架窗
  口的背景改变一下色彩或是给主框架窗口加上一幅漂亮的图片做背景?其实也不难。但与
  单文档窗口应用程序中改变框架窗口的背景方法不同,对多文档窗口应用程序中的主框架
  窗口改变背景不能简单地用ClassWizard重载OnEraseBkgnd(CDC* pDC)函数的方法实现。
  因为多文档窗口应用程序中的主框架窗口的背景区是一个MDIClient类的窗口,因此改变背
  景与这个MDIClient类的窗口有关。MDIClient类的窗口的句柄是m_hWndMDIClient(在CMDI
  FrameWnd中)。以下是其实现的步骤:
  一、 使用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”对话框中选择默
  认选项,按[Finish]按钮即完成多文档窗口应用程序的定制。
  注:MFC(Microsoft Foundation Class)是MS-Visual C++的类库。
  二、向应用程序添加位图
  在VC的“View”菜单中单击“Resource Includes...”, 在弹出对话框中选择“Bitm
  ap”, 按[Import]按钮从文件中加载位图文件,单击“Workspace”的“Resource”便可
  见到刚才加载的位图文件,默认的资源标识符为IDB_BITMAP1。
  三、用ClassWiard生成一个 CWnd 类的派生类CclientWnd
  在CclientWnd类中重载OnEraseBkgnd(CDC* pDC),OnSize(UINT nType, int cx, in
  t cy)函数,并用手工加入重载的虚函数WNDPROC* CClientWnd::GetSuperWndProcAddr()
  用来返回函数指针。
  类CclientWnd的头文件代码如下:
  class CClientWnd : public CWnd
  {
  // Construction
  public:
  CClient();
  // Attributes
  public:
  // Operations
  public:
  // Overrides
  // ClassWizard generated virtual function overrides
  file://{{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://}}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
  // 得到位图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 true;
  }
  WNDPROC* CClientWnd::GetSuperWndProcAddr()
  {
  static WNDPROC NEAR pfnSuper = NULL;
  return &pfnSuper; // 返回函数指针
  }
  void CClientWnd::OnSize(UINT 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 "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_hWndMDIClient))
  {
  TRACE("Fail to subclass MDI client window/n");
  return -1;
  }
  }
  五、关键技术
  1、本程序并不复杂,关键是要知道多文档窗口应用程序中的主框架窗口的背景区是一
  个MDIClient类的窗口。
  2、选用函数要正确,如CClientWnd::OnEraseBkgnd(CDC* pDC)函数中选用GetClien
  tRect(&rectbk) 函数来取得客户区的大小要比选用GetClipBox(&rectbk) 函数来得好。
  3、要在CclientWnd类中重载OnSize(UINT nType, int cx, int cy) 函数,并加入In
  validate() 函数重画窗口。

本文转自
http://blogger.org.cn/blog/more.asp?name=njucs&id=3755
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值