zoukankan      html  css  js  c++  java
  • MFC 窗体背景图片设置

    很多人在做MFC 界面的时候想要给话框加入背景图片,很多人都会想到在OnPaint()里面来加一段代码来实现,其实这样做并不怎么科学,因为它会导致窗口不断重绘,在很多项目中窗口会闪烁(比如带播放视频的一个话框);下面的方法我感觉更为合理。

     

     

     

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

  • 相关阅读:
    http调用接口,并解析返回的xml数据,显示在jsp页面上
    项目与tomcat
    项目依赖和部署
    数据库上操作实例 找到要操作的表---筛选---选中要操作的字段---输入
    端口占用问题
    快捷键
    获取页面上的数据
    布尔类型
    EL表达式
    mac oxs 上查看进程监听的端口号 lsof
  • 原文地址:https://www.cnblogs.com/jinjiangongzuoshi/p/3256111.html
Copyright © 2011-2022 走看看