网站首页

家园论坛

老版论坛

家园博客

业界新闻

技术文档

下载中心

速查中心

图片中心

硬件资讯
上一篇:VC++中用通讯控件开发串行通信程序 下一篇:用VC实现自动监测光驱状态的改变
如何给Visual C++中的对话框增加位图背景

来源: 作者: 添加日期:2005-9-4 19:19:56 点击次数:

Visual C++Microsoft至今最全面和最完善的程序开放产品之一,它提供了一组各种各样的为适应几乎每一种编程风格而设计的工具,在编程能力和方便性方面达到了空前的水平。

应用程序的界面设计占用了整个程序设计的很大一部分工作量,一个应用程序是否成功,界面的好坏有很大的影响,因此,现代的软件设计特别强调界面设计,并且也做得很好,使用户使用起来很容易,对话框就是Windows提供的界面元素的一个,它用来进行信息输入,也可用来把程序的结果或中间结果告诉用户。实际上,它是应用程序中使用最多的一种交互方式。


Visual C++中,对话框的背景通常是灰色的,文字是黑色的(这也是默认值),见下图。

 



但用户可以通过使用位图可以很容易地改变对话框的背景,这里,笔者编写了一个CBmpDialog类,将位图引入到对话框的背景之中,改善了对话框的视觉效果。添加了位图背景的对话框效果如以下两图所示。


 

CBmpDialog类的创建过程如下,首先在资源中设计一个对话框,然后创建一个管理该对话框的类,即CBmpDialog,基类为CDialog,通过类向导为其添加消息处理函数OnCtlColor )和OnEraseBkgnd ( ),并在其头文件BmpDialog.h中添加以下内容:

   

# define BITMAP_TILE 0

# define BITMAP_CENTER 1

 

class CBmpDialog : public CDialog

{

public:

    void SetBitmap (UINT ResID,int Type=BITMAP_TILE); //该函

  数装入位图并决定如何显示,缺省放置方式为平铺

private:

    int mType; //定义位图放置方式变量

    CBrush mHollowBrush; //定义一个画笔类

    CBitmap mBitmap; //定义一个位图类

};

 

    接下来在源程序BmpDialog.cpp加入下列代码:

1、构造函数CBmpDialog::CBmpDialog ( ),该函数构造了一个CbmpDialog对象,并生成一个空画笔,以便被类引用。

 

CBmpDialog::CBmpDialog (CWnd* pParent /*=NULL*/)

                     : CDialog (CBmpDialog::IDD, pParent)

{   

mHollowBrush.CreateStockObject (HOLLOW_BRUSH);

     

}

 

    2CBmpDialog::OnCtlColor ( )函数,当对话框准备显示一个控件时,调用此函数,它返回一个HBRUSH,用于绘制控件背景,对于静态控件返回一个空画笔,位图将出现在控件的后面;对于其它控件,则采用OnCtlColor ( )的默认值,并允许控件以普通方式绘制,此时,位图不会出现在控件的后面。

 

HBRUSH CBmpDialog::OnCtlColor (CDC* pDC, CWnd* pWnd,

UINT    nCtlColor)

{

      if (mBitmap.GetSafeHandle ( ) !=NULL) //返回的位图句柄非空时

      {

           switch (nCtlColor)

           {

           case CTLCOLOR_STATIC: //为静态控件时,返回空画笔

                 pDC->SetBkMode (TRANSPARENT);

                 return (HBRUSH) mHollowBrush.m_hObject;

                 break;

           default: //对其它控件,采用缺省值

         HBRUSH hbr = CDialog::OnCtlColor (pDC,

pWnd, nCtlColor);

          return hbr ;

                 break;

           }

      }

      else //无位图背景时

      {

           HBRUSH hbr = CDialog::OnCtlColor (pDC, pWnd, nCtlColor);

           return hbr;

      }

}

 

3CBmpDialog::OnEraseBkgnd ( )函数,当对话框需要重绘时,框架将调用此函数,OnEraseBkgnd ( )显示位图的方式有两种:如果位图居中放置,就先调用基类的OnEraseBkgnd ( ),重新绘制整个背景,然后把位图显示在对话框的中心位置;如果想以铺瓦的方式排列位图,就以对话框的左上角为起点进行排列,直到填满整个对话框。

 

BOOL CBmpDialog::OnEraseBkgnd (CDC* pDC)

{

      if (mBitmap.m_hObject!=NULL) //对象句柄非空

      {

           CDC MemDC;

BITMAP bm;

           CRect Rect;

int x=0, y=0;

           GetClientRect (&Rect); //获取客户区大小

mBitmap.GetObject (sizeof (BITMAP),&bm); //用位图上的信息    填充BITMAP结构的各个域

           MemDC.CreateCompatibleDC (pDC); //初始化内存描述对象

CBitmap*pOldBitmap=MemDC.SelectObject (&mBitmap); //           义一个CBITMAP类,并初始化为选入到设备描述对象的位图

           if (mType==BITMAP_CENTER) //位图置背景的中心

           {

                 CDialog::OnEraseBkgnd(pDC); //先重绘整个背景

                 x= (Rect.Width()-bm.bmWidth) /2; //位图左上角横坐标

                 y= (Rect.Height()-bm.bmHeight) /2; //位图左上角纵坐标

                 pDC->BitBlt

设为首页 | 加入收藏 | 业务办理 | 友情链接 | 论坛版面 | 浙ICP备07502118号 |