初学VC之路:第一个任务,编写对话框(3)——实现具有位图背景的对话框

  实现了基础功能后,对类和对象的调用有了初步的认识,就可以把之前找到几种给对话框添加图片的方法再回顾一下,看看应该怎么做。

最简单的方法就是添加Picture控件了,先在Resource面板里面import一个图片,必须是BMP格式的。定义ID,可以采用默认的IDB_BITMAP1。然后往对话框上面拖一个Picture控件,把属性中的Type选择为BITMAP,就会出现一个Image下拉菜单,从中选择要显示的图片ID,这里当然只有IDB_BITMAP1一个选择了,选中就可以,其他的属性根据需要自己设置。

需要注意的是,由于对话框上面还要显示自定义按钮,所以在添加Picture控件之前,应该先添加需要的Button,否则就会像我一开始尝试的一样,对话框显示的图片会把按钮覆盖了,平添许多麻烦。

如此这样以后,运行程序,就会发现对话框有了图片背景,并且能够看到添加的各种按钮。

这个方法简单是简单,可就是需要提前添加要在图片上面显示的其他按钮等控件,有点麻烦。再看看其他两种用代码的方法是怎么做的。

代码比较少的是通过定义背景图来添加对话框图片。下面是我从网上找到的一段程序介绍:(假设建好的基于对话框的工程为Ttest,对话框类为CTestDlg

 

 

先载入一张图片,IDIDB_BITMAP2

 TestDlg.h

CBrush m_brBk;//public中定义

 

TestDlg.cpp

 

 

在初始化函数OnInitDialog()中加入:

BOOL CTestDlg::OnInitDialog()

{

          CDialog::OnInitDialog();

CBitmap bmp;

bmp.LoadBitmap(IDB_BITMAP2);

m_brBk.CreatePatternBrush(&bmp);

bmp.DeleteObject();

.

.

.

      return TRUE;  // return TRUE  unless you set the focus to a control

}

 

在打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:

HBRUSH  CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

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

        

if (pWnd == this)

{

    return m_brBk;

}

    return hbr;

}

按照上面的方法一路COPY下来运行,OK!并且由于图片是做为背景显示的,所以再添的按钮都能很好的显示出来,非常方便。

总结一下其中出现的变量和函数。

CBrush:类CBrush封装了Windows图形设备接口(GDI)中的画刷,画刷也就是采取什么方案填充图形的背景的工具。

OnInitDialog ( ):用于对对话框类的变量的初始化(注意:是在产生对话框之前就初始化),是WM_INITDIALOG消息产生的消息处理函数,覆盖该函数可改变对话框初始设置。

用法

virtual BOOL OnInitDialog();返回值指定对话框是否对它的一个控件设置输入焦点。如果OnInitDialog返回非零值,Windows 将输入焦点设在对话框的第一个控件上,只有在对话框明确将输入焦点设在某控件上,应用返回0

CBitmap:类CBitmap封装了Windows图形设备接口(GDI)中的位图,并且提供操纵位图的成员函数。

LoadBitmap ( )CBitmap类的一个成员函数,从应用的可执行文件中加载一个命名的位图资源来初始化位图对象。

用法

BOOL LoadBitmap( LPCTSTR lpszRecourceName )BOOL LoadBitmap( UINT nIDResource );返回值调用成功时返回非零值,否则为0。参数lpszResourceName指向一个包含了位图资源名字的字符串(该字符串以null结尾)。NIDResource指定位图资源中资源的ID号。本函数从应用的可执行文件中加载由lpszResourceName指定名字或者由nIDResource指定的ID号标志的位图资源。加载的位图被附在Cbitmap对象上。如果由lpszResourceName指定名字的对象不存在,或者没有足够的内存加载位图,函数将返回0。可以调用函数CgdiObject::DeleteObject删除由LoadBitmap加载的位图,否则Cbitmap的析构函数将删除该位图对象。

CreatePatternBrush ( )CBrush类的一个成员函数,用位图指定的模式初始化画刷。

用法

BOOL CreatePatternBrush( CBitmap* pBitmap );返回值调用成功时返回非零值,否则为0。参数pBitmap指定一个位图。本函数用位图指定的模式初始化画刷。此画刷随后就可用于任何支持光栅操作的设备上下文。由bBitmap指定的位图一般用以下的函数初始化:CBitmap:: CreateBitmapCBitmap::CreateBitmapIndirectCBitmap::LoadBitmapCbitmap:: CreateCompatibleBitmap

DeleteObject ( )CgdiObject类的一个成员函数,从内存中删除附加给CGdiObjectWindows GDI对象,释放与此对象相关的系统存储空间。GdiObject类为各种Windows图形设备接口(GDI)对象,如位图、区域、画刷、画笔、调色板、字体等提供了一些基本类。我们不会直接构造一个CGdiObject对象,而是使用某一个派生类如CPenCBrush创建。

用法

BOOL DeleteObject( );如果GDI对象被成功删除,则返回非零值,否则为0。通过释放附加的GDI对象占有的系统存储来删除它们。与CGdiObject对象有关的存储不受此调用的影响。如果CGdiObject对象正被选入设备上下文中,则应用不可对此对象调用DeleteObject,。当一个模式画刷被删除时,与之相关联的位图不被删除。位图必须被独立删除。

HBRUSH:数据类型,用于定义画刷句柄。在Windows环境中,句柄是用来标识项目的,这些项目包括:module, task, instance, file ,block of memory, menu, control, font, resource, icon, cursor, string, GDI object等,包括bitmap, brush, metafile, palette, pen, region以及设备描述表device context。实际上,句柄是一个标识符,用来表示对象或者项目,是一个32位的正整数。应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用这个句柄,以引用相应的对象。

WM_CTLCOLOR消息WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。利用向导映射该消息产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);参数pDCTestDlg的设备上下文,pWndTestDlg中发送该消息的control指针,nCtlColorControl的类型编码。WM_CTLCOLOR是系统在绘制控件的时候自动发送的,如果需要自定义,就截取这个消息并重载它的响应函数,用classWizard添加WM_CTLCOLOR消息然后编辑其OnCtlColor函数。这样Windows向应用程序发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画窗体背景的刷子句柄。

 

 

还是写代码学到的东西多,这十行代码就带出了常用的CBitmap类、CButton类还有CGdiObject类,及其部分成员函数。通过类的对象调用成员函数,从而实现程序的各种功能。还有MFC消息处理程序。一个MFC消息处理程序需要一个函数原型、一个函数体和一个在消息映射中的输入项。Class Wizard帮助将消息处理程序添加到类中,从列表框选定一个Windows消息标识符,并且向导生成具有正确函数参数的代码和返回值,通过重载相应的函数实现消息的传递。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值