基于对话框的MFC程序加载位图为背景图案

本文介绍如何在MFC应用程序中使用CBitmap和CBrush类设置对话框背景图片,包括初始化对话框、加载位图资源、创建画刷及重载WM_CTLCOLOR消息等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值