如何將vc對話框更漂亮


如何给 Visual C++ 中的对话框增加位图背景 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); } 2 、 CBmpDialog::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; } } 3 、 CBmpDialog::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 (x, // 目标位图横坐标 y, // 目标位图纵坐标 bm.bmWidth, // 要转换的块高度 bm.bmHeight, // 要转换的块宽度 &MemDC, // 图形数据的源设备对象 0, // 源位图横坐标 0, // 源位图纵坐标 SRCCOPY); // 转换类型代码, SRCCOPY 表示数据不经修改直接拷贝 } else // 位图平铺放置 { // 从左上角开始依次排列位图 while (yBitBlt (x,y,bm.bmWidth,bm.bmHeight, &MemDC,0,0,SRCCOPY ); x=x+bm.bmWidth; } x=0; y=y+bm.bmHeight; } } MemDC.SelectObject ( pOldBitmap ); // 将位图对象选入 内存 设备描述对象 return TRUE; } else // 无位图时产生普通对话框 return CDialog::OnEraseBkgnd (pDC); } 4 、 CBmpDialog::SetBitmap( ) 函数,通过调用此函数,装入将在对话框中显示的位图,如果函数没有调用,或者位图不存在,就会产生普通的对话框。 void CBmpDialog::SetBitmap (UINT ResID, int Type) { mBitmap.LoadBitmap (ResID); // 装入位图对象 mType=Type; // 位图放置方式 } 使用该类时,首先必需将位图资源加入到项目中,为其赋予一个资源号,然后声明一个 CBmpDialog 对象,接着调用 SetBitmap ( ) 函数对其进行初始化。如下述语句: CBmpDialog dlg2; dlg2.SetBitmap(IDB_CLOUDS,BITMAP_CENTER); dlg2.DoModal(); 即可产生一个位图居于背景正中的对话框。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值