MFC 窗体背景透明 或 加载图片

时间:2022-07-08 11:49:56

//  WM_ERASEBKGND   添加 OnEraseBkgnd

BOOL CLogoDlg::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值

 CDialog::OnEraseBkgnd(pDC);
 CRect rect;
 GetClientRect(rect);
 CMemDC pDevC(pDC, rect);

//背景透明 或者载入m_hBitmap
// if (m_hBitmap)
 //{
 // pDevC->SelectObject(m_hBitmap); 
 //}
 return TRUE;
}


 

 

////////////////////////////////////////////////////////////////////////////////////////////////

窗体背景图

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

 

 

//通过PICTURE CONTROL

1. 加载 BMP

[cpp] view plaincopyprint?
  1. CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄  
  2. pWnd->ModifyStyle(0, SS_BITMAP); // 修改它的属性为位图  
  3. pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("bmp.bmp"),   
  4.                 IMAGE_BITMAP,   
  5.                 100,   
  6.                 50,   
  7.                 LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE));  

2. 加载 PNG

[cpp] view plaincopyprint?
  1. CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄  
  2. CImage image;  
  3. image.Load(_T("png.png");  
  4. HBITMAP hBmp = image.Detach();  
  5. pWnd->SetBitmap(hBmp);  
  6. pWnd->SetWindowPos(NULL,   
  7.                    0,   
  8.                    0,   
  9.                    100,   
  10.                    50,   
  11.                    SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);  

3. 在资源编辑器中选定图片控件 -> Alt+Enter 打开该图片控件的“属性窗口” -> 在 "Type" 中选定图片类型 -> 在"Image"中选定图片对应的资源 ID.

 MFC 窗体背景透明  或 加载图片

 

 ///////////////////////////////////////////////////////////////////

弹出对话框 载入位图

 

CString m_strfile;
CRect r;
GetClientRect(&r);
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
   "Bmp files(*.bmp)|*.bmp|",NULL);
    if(dlg.DoModal ())
{
   m_strfile=dlg.GetPathName ();
}

HBITMAP hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
           m_strfile,
           IMAGE_BITMAP,
           r.Width()/2,
           r.Height()/2,
           LR_LOADFROMFILE);   
m_Bmp.SetBitmap(hbitmap);

 

////////////////////////////////////////////////////////////

载入资源BMP

 HBITMAP hBitmap;
 //关联图片ID
 hBitmap =(HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_LOGO_ANYSORT), IMAGE_BITMAP,0,0, LR_LOADMAP3DCOLORS);
 //获得指向静态控件的指针
 CStatic *pStatic=(CStatic *)GetDlgItem(IDC_PIC_LOGO);//控件ID
 //设置静态控件的样式,使其可以使用位图,并试位标显示使居中
 pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
 //设置静态控件显示位图
 pStatic->SetBitmap(hBitmap);