如何给 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 (y<Rect.Height ( ) )

{

while (x<Rect.Width ( ) )

{

pDC->BitBlt (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();

即可产生一个位图居于背景正中的对话框。

如何给 Visual C++ 中的对话框增加位图背景相关推荐

  1. Visual Basic中实现带预览的对话框

    Visual Basic中实现带预览的对话框 2007-05-04 07:00作者:出处:论坛整理责任编辑:卢林嘉 用户在图片框中选择图片时,希望预先对图片的轮廓及大小有初步了解,但是VB的通用对话框 ...

  2. Visual C++中的ODBC编程实例

    Visual C++中的ODBC编程实例 Microsoft Developer Studio为大多数标准的数据库格式提供了32位ODBC驱动器.这些标准数据格式包括有:SQL Server.Acce ...

  3. Visual C++ 中的ODBC编程

    Visual C++ 中的ODBC编程 ODBC(Open Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序 ...

  4. 如何在Visual Studio中自动格式化代码?

    我知道Visual Studio可以自动格式化以使我的方法和循环正确缩进,但是我找不到该设置. #1楼 对于Visual Studio 2010/2013/2015/2017 设置文档格式( Ctrl ...

  5. 如何:在 Visual Studio 中添加或移除引用(转载)

    http://msdn2.microsoft.com/zh-cn/library/wkze6zky(VS.80).aspx Visual Studio 如何:在 Visual Studio 中添加或移 ...

  6. 如何在Visual Studio中“添加现有项”整个目录结构?

    我有一个独立于任何C#项目的独立文件集,它们位于复杂的嵌套目录结构中. 我想以这种格式将它们添加到我正在处理的ASP.NET Web应用程序中的不同目录中; 同时保留相同的结构. 所以,我将文件夹复制 ...

  7. 在Visual Studio中使用Git [关闭]

    作为一个长期的Visual SourceSafe用户(和仇恨)我正在讨论与同事转换到SVN ; 他建议改用Git . 显然,它可以在没有中央服务器的情况下用作点对点(我们是一个3开发团队). 我无法找 ...

  8. 在Visual Studio中启用对jquery等javascript框架的智能感知

    http://www.cnblogs.com/tonybinlj/archive/2009/05/26/1490434.html 启用Visual Studio 对jQuery的智能感知 首先看一下V ...

  9. 在Visual C++ 中使用内联汇编

    一. 优点 使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤.在 Visual C++ 中,内联汇编是内置的编译器,因此不需要配置诸如 MASM 一类的独立汇编工 ...

最新文章

  1. 有关eigen库的一些基本使用方法
  2. 高效使用Vector
  3. jQuery-个人学习记录(2)
  4. nodejs中文件,目录的操作(1)
  5. 八年数据库之路的感悟
  6. android bitmap 加边框,Android 给圆角的Bitmap加边框
  7. Android图形之HWC(二十四)
  8. 数据结构 树的遍历(递归遍历练习)
  9. QCC3020 单地址量产项目 功耗数据 电流测试数据
  10. 2019杭州电子科技大学计算机考研经验谈
  11. 近期购书体验:当当相对最棒,卓越蜗牛,京东缺货
  12. 小猫爬山题解(暴力解题)
  13. STM8 的汇编学习
  14. MySQL本天早上8点到明早8点_早上8点是什么时辰
  15. Unity功能——设备硬件绑定(通过设备SN码)
  16. 《那些年啊,那些事——一个程序员的奋斗史》——66
  17. Echarts X轴类型为time时,X轴标签的细化(年月日时分秒)
  18. java一元二次方程求解_求JAVA解一元二次方程的程序。
  19. 肯德基店里的广告 We Do Chicken Right
  20. java zip压缩解压_JAVA实现实用的ZIP压缩与解压

热门文章

  1. MySQL DQL语言的笔记
  2. 从入门到放弃之大数据Hive
  3. 麦肯锡方法中的经验(读书摘要)
  4. 产品新人如何快速成长?
  5. 作者:王亚楠(1988-),男,中国科学院昆明植物研究所科学数据库管理员
  6. 作者:赵晨(1980-),男,深圳般若计算机系统股份有限公司气象大数据应用负责人...
  7. 【软件质量】变更管理与可追踪性
  8. 【Python】Pandas高效加载JSON文件
  9. 【数据结构与算法】顺序表V3.0的Java实现
  10. C++ 工厂模式(设计模式)