from:
http://rwsk.snnu.edu.cn/?uid-156-action-viewspace-itemid-240
先载入一张图片
,ID
为
IDB_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:: CreateBitmap
、
CBitmap::CreateBitmapIndirect
、
CBitmap::LoadBitmap
或
Cbitmap:: CreateCompatibleBitmap
。
DeleteObject ( )
:
CgdiObject
类的一个成员函数,从内存中删除附加给
CGdiObject
的
Windows GDI
对象,释放与此对象相关的系统存储空间。
GdiObject
类为各种
Windows
图形设备接口(
GDI
)对象,如位图、区域、画刷、画笔、调色板、字体等提供了一些基本类。我们不会直接构造一个
CGdiObject
对象,而是使用某一个派生类如
CPen
或
CBrush
创建。
用法
:
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)
;参数
pDC
是
TestDlg
的设备上下文,
pWnd
是
TestDlg
中发送该消息的
control
指针,
nCtlColor
是
Control
的类型编码。
WM_CTLCOLOR
是系统在绘制控件的时候自动发送的,如果需要自定义,就截取这个消息并重载它的响应函数,用
classWizard
添加
WM_CTLCOLOR
消息然后编辑其
OnCtlColor
函数。这样
Windows
向应用程序发送消息
WM_CTLCOLOR
,应用程序处理
WM_CTLCOLOR
消息并返回一个用来绘画窗体背景的刷子句柄。
更改对话框的背景颜色和文本颜色
:一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对于这个问题,其实可以 由几种不同的方法来实现,具体如下(粗斜体代码为增添的):
----方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。
---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话 框设置为蓝色背景和红色文本,步骤如下:
---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。
---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:
BOOL CExampleDlgApp: : InitInstance ( )
{
…
CExampleDlgDlg dlg;
m_pMainWnd = &dlg;
//先于DoModal()调用,将对话框设置为蓝色背景、红色文本
SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); //即可
int nResponse = dlg.DoModal();
…
}
---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对 话框。
---- 方法二:重载OnPaint(),即W M_PAINT
给对话框加载一个菜单:
的ID