|
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
|