MFC 窗體背景透明 或 加載圖片

//  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

  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

  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); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章