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

2019-04-15 17:21发布

//  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)对象,如位图、区域、画刷、画笔、调 {MOD}板、字体等提供 了一些基本类。我们不会直接构造一个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));  
CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄 pWnd->ModifyStyle(0, SS_BITMAP); // 修改它的属性为位图 pWnd->SetBitmap((HBITMAP)::LoadImage(NULL, _T("bmp.bmp"), IMAGE_BITMAP, 100, 50, 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);  
CStatic* pWnd = (CStatic*)GetDlgItem(IDC_PIC); // 得到 Picture Control 句柄 CImage image; image.Load(_T("png.png"); HBITMAP hBmp = image.Detach(); pWnd->SetBitmap(hBmp); pWnd->SetWindowPos(NULL, 0, 0, 100, 50, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); 3. 在资源编辑器中选定图片控件 -> Alt+Enter 打开该图片控件的“属性窗口” -> 在 "Type" 中选定图片类型 -> 在"Image"中选定图片对应的资源 ID.
 
   /////////////////////////////////////////////////////////////////// 弹出对话框 载入位图   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);