`
paulfzm
  • 浏览: 888327 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

MFC 添加对话框背景图片

    博客分类:
  • vc++
阅读更多

先载入一张图片,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消息并返回一个用来绘画窗体背
景的刷子句柄

====================================

//放在OnPaint()里

{//设置背景图片
CRect    rect;  
GetClientRect(&rect);  
CDC    *pDC=GetDC();  
CDC    memdc;  
memdc.CreateCompatibleDC(pDC);  
CBitmap    bitmap;  
//从资源中载入位图  
bitmap.LoadBitmap(IDB_BITMAP1);  
memdc.SelectObject(bitmap);  
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
}


==========================================


对于VC++文档、视结构中的视图,从用户的角度来看,只是可以改变大小、位置的普通窗口,同其他基于Windows应用程序的窗口是一样的;从程序员的 角度来看,视图并不是普通的窗口,而是从MFC库中CView类派生的类对象。像任何VC++对象一样,视图对象的行为由类的成员函数(数据成员)决定, 包括派生类中应用程序定义的函数和从基类继承来的函数。

提出问题
视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW是一致的。设计者一般会希望自己的 程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景。我们可以用Windows函数SetSysColors来重新指定 COLOR_WINDOW所对应的实际颜色,来达到改变视图背景颜色的目的。但这样会同时改变其他应用程序的视图窗口背景,使得整个Windows系统的 颜色设置产生混乱。另外,我们可能会用以下方法来设置视图的背景颜色,即在CView的OnDraw函数中添写如下一段程序代码:
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectClient;
CBrush brushBkColor;
GetClientRect(rectClient);
brushBkColor.CreateSolidBrush(RGB(255,0,0));
pDC->DPtoLP(rectClient);
pDC->FillRect(rectClient,&brushBkColor);

}
这样可以达到改变当前应用程序的视图背景的目的,但同时也产生了一些不良影响,使得程序运行效果不尽如人意。

分析问题
我们知道,在VC++的文档、视结构中,CView的OnDraw函数用于实现绝大部分图形绘制的工作。如果用户改变窗口尺寸, 或者显示隐藏的区域,OnDraw函数都将被调用来重画窗口。并且,当程序文档中的数据发生改变时,一般必须通过调用视图的Invalidate(或 InvalidateRect)成员函数来通知Windows所发生的改变,对Invalidate的调用也会触发对OnDraw函数的调用。正因为 OnDraw函数被频繁调用,所以在其执行时,每次都刷新填充一次视图客户区域,便会使屏幕不稳定,产生闪烁现象。
笔者通过对VC++应用程 序框架结构和Windows消息映射系统的仔细研究,找到另外一种改变视图背景的方法,其执行效果比上述两种方法都好。其实在程序调用OnDraw函数之 前,会触发一个Windows消息:WM_ERASEBKGND,以擦除视图刷新区域。在缺省情况下,Windows系统使用视图窗口注册时窗口类中的成 员hbrBackground所描述的画刷来擦除屏幕,这一般会将屏幕刷新成COLOR_WINDOW所对应的颜色。因此,在OnDraw函数中设置背景 颜色的执行过程是这样的:先将屏幕刷新成COLOR_WINDOW所对应的颜色,接着又在OnDraw函数中填充其他颜色,这正是产生屏幕闪烁的根本原 因。

解决问题
通过上述分析,我们应将视图背景颜色填充移到Windows消息:WM_ERASEBKGND所对应的消息映射函数中,而不是在 OnDraw函数中。我们可以通过下列步骤实现这一过程:在文档类中增加一成员变量m_viewBkColor保存当前背景颜色,同时增加两个成员函数 GetViewBkColor和SetViewBkColor对其进行读写操作。这样做的好处是可以对m_viewBkColor成员进行序列化,将其和 文档联系在一起,打开某一文档时,其背景将和上一次程序操作该文档时的背景保持一致。在视图类中为视图的Windows消息WM_ERASEBKGND增 加消息映射函数OnEraseBkgnd,代码如下:
BOOL CTestView::OnEraseBkgnd(CDC* pDC) 
{
CRect rect;
CBrush brush;
brush.CreateSolidBrush(GetDocument()->GetViewBkColor());
pDC->GetClipBox(rect);
pDC->FillRect(rect,&brush);
return true;
}
在该函数中不需要对客户区域矩形进行设备坐标到逻辑坐标的转换,并且Windows在调用该函数时会自动进行裁剪区域的计算,使得需要刷新的屏幕面积达到最小。这样我们可以在程序中通过设计下列菜单函数轻松地改变视图背景的颜色,而且运行效果相当令人满意。
void CTestView::OnChangeViewBkcolor() 
{
CColorDialog cdlg;
if(cdlg.DoModal()==IDOK)
{
GetDocument()->SetViewBkColor
(cdlg.GetColor());
InvalidateRect(NULL);
}
}

<script type="text/javascript"></script>

分享到:
评论

相关推荐

    如何给MFC对话框添加背景图片

    然而,标准的MFC对话框通常只有单一的颜色作为背景,如果我们想要给对话框添加个性化的背景图片,就需要进行一些自定义工作。本教程将详细解释如何在MFC对话框中添加背景图片。 1. **添加背景图片资源** 首先,你...

    MFC对话框背景图片改变代码

    本文将详细介绍如何在MFC中实现对话框背景图片的更改。 首先,我们需要了解MFC对话框的基本结构。MFC对话框通常由一个对话框类(继承自CDialog或CDialogEx)和对应的资源文件(.rc)组成。资源文件包含了对话框的...

    MFC为对话框添加BMP图片作为背景

    AfxMessageBox(_T("无法加载背景图片")); return FALSE; // 加载失败,结束初始化 } ``` 然后,创建一个与对话框大小相同的DC(设备上下文),并将BMP绘制到这个DC上: ```cpp CDC memDC; memDC....

    MFC基于对话框 添加背景图片

    在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中为基于对话框的应用程序添加背景图片,以及如何实现对话框的皮肤加载和菜单功能。MFC是微软提供的一个C++类库,用于构建Windows应用程序,...

    MFC 在对话框显示图片的多种方法

    在MFC应用中,对话框显示图片主要涉及两种方法:非动态显示和动态显示。这两种方法各有其适用场景,下面将详细介绍。 **非动态显示图片** 1. **使用Picture控件** 这是最简单的方法,适用于图片已经在资源中加载...

    MFC对话框背景设置解决方案

    "MFC对话框背景设置解决方案"涉及到的关键知识点主要包括:MFC对话框的基本结构、对话框模板、资源管理、背景图片的加载和绘制,以及自定义对话框类的使用。下面将详细讲解这些内容。 1. MFC对话框基本结构: MFC...

    MFC动态修改对话框背景颜色

    总之,MFC提供了一个灵活的框架来实现动态修改对话框背景颜色。通过覆盖`OnPaint()`函数,结合适当的成员变量和事件处理,我们可以创建出具有个性化的用户界面。在实践中,不断探索和学习MFC的特性,将有助于提升...

    MFC添加背景图片MFC添加背景图片

    MFC添加背景图片 MFC是Microsoft Foundation Classes的缩写,是一个基于Windows API的C++类库。它提供了许多有用的类和函数,帮助开发者快速构建Windows应用程序。在MFC中,添加背景图片是非常常见的需求,特别是在...

    MFC改变对话框背景和文字颜色.rar

    改变mfc工程对话框的背景颜色 显示的文字颜色不同的方法 自绘按钮样式的改变 和鼠标样式的改变 给对话框加载位图背景 给单独的edit button static 等控件添加不同颜色样式等 有同步的文档结合代码进行了详细的说明 ...

    基于MFC的关于设置对话框背景颜色的设置

    本文将详细讲解如何在基于MFC的对话框应用中设置自定义的背景颜色,以满足个性化需求。 首先,我们需要理解MFC对话框的工作原理。MFC对话框是基于Windows API中的对话框类(`CDialog`),它继承自`CWnd`,提供了一...

    mfc添加背景图片

    ### MFC 添加背景图片知识点详解 #### 一、引言 在MFC(Microsoft Foundation Classes)应用程序开发过程中,为了提高用户界面的美观性和趣味性,经常需要为对话框添加背景图片。本文档将详细介绍如何使用MFC在...

    MFC延伸对话框,延伸对话框

    - 最后,使用MFC向导添加菜单、工具栏和对话框资源。 5. **MFC对话框.bmp** 压缩包中的"MFC对话框.bmp"文件可能是用于在MDI应用程序中显示的位图资源,例如作为背景图像或者图标。在MFC中,位图可以被加载到...

    VC/MFC 基于对话框 按钮加载PNG图片

    在VC++的MFC(Microsoft Foundation Classes)框架中,创建基于对话框的应用程序时,我们经常需要对对话框上的控件进行自定义,比如给按钮加载PNG图片,以实现更美观的效果,甚至需要图片具有透明效果。这篇内容将详细...

    改变对话框背景颜色的MFC代码

    4. **更新颜色**:在TBN_HSCROLL处理函数中,根据滑块的新位置获取R、G、B值,然后设置对话框背景色: ```cpp void CChangeColorDlg::OnTbnHscroll(UINT nID, CScrollBar* pSB, UINT nPos) { int r = m_sliderR....

    MFC设置位图为对话框背景

    6. **处理控件**:最后,需要注意的是,当对话框背景设置为位图后,通常需要对对话框上的控件进行一些调整,确保它们能正常显示和操作。比如,可以将控件的背景色设置为透明,这样不会被位图覆盖。 ```cpp for ...

    MFC 基础知识:对话框背景添加图片和按钮Button添加图片1

    简介:自幼受贵州大山的熏陶,养成了诚实质朴的性格。经过寒窗苦读,考入BIT,为完成自己的教师梦,放弃IT、航天等工作,成为贵财一名大学教师,并想把自己所学所感真

    MFC 设置对话框的颜色

    首先,我们需要在对话框类的头文件中添加一个CBrush类型的成员变量,用于存储对话框的背景颜色。然后,在OnInitDialog函数中,我们需要创建一个solid brush,并将其颜色设置为绿色。 接下来,我们需要重载...

    MFC基于对话框游戏 打字游戏1.0V

    在这个打字游戏中,彩色界面的实现可能涉及到对控件的外观进行自定义,例如改变控件的颜色、字体等属性,或者通过在对话框背景上绘制图形,以达到更加生动的效果。同时,游戏还包含了音乐元素,这可能需要集成音频...

    VC_6.0_下MFC基于对话框_绘制图形

    在本教程中,我们将探讨如何在Visual C++ 6.0环境下使用MFC(Microsoft Foundation Classes)库创建一个基于对话框的应用程序,该程序能够绘制图形。MFC是微软提供的一个C++类库,它封装了Windows API,使得开发者...

    MFC按钮或对话框添加任意格式背景

    使用GDI+对按钮或对话框添加任意格式图片,不用加载资源,可以直接使用接口进行背景重绘。支持任意格式图片。

Global site tag (gtag.js) - Google Analytics