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