VC中為SDI新增背景圖片總結
方案一,使用畫刷改變檢視單調的背景
1 我們為CTestView類新增一個變數 CBrush m_brushBackground;這個畫刷就是用於畫背景的。
2 我們在CTestView的建構函式中加入如下程式碼:
//方案一.1,直接用資源id
CBitmap bmp;
bmp.LoadBitmap(IDB_SPLASH); ///載入點陣圖
m_brushBackground.CreatePatternBrush(&bmp); ///建立點陣圖畫刷
*/
//方案一.2,讀圖片檔案
HBITMAP hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\res\\background.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap bmp; // background bitmap picture
bmp.Attach(hBmp);
m_brushBackground.CreatePatternBrush(&bmp); ///建立點陣圖畫刷
// AfxMessageBox("gou zao hanshu ");
3 接著我們需要在OnDraw函式中畫出來,程式碼如下: CRect rect;
GetClientRect(rect);///取得客戶區域
pDC->FillRect(rect,&m_brushBackground); ///用背景畫刷填充區域
4 為了避免背景的閃爍,使顯示更加完美,我們新增WM_ERASEBKGND訊息的處理函式,並取消呼叫父類的處理函式,程式碼如下: BOOL CTestView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
///////////////////////////////////////////////////////////////////
方案二-五,處理OnEraseBkgnd
BOOL CMPEG4DecoderView::OnEraseBkgnd(CDC* pDC)
{
//dan,2007-6-9,修改為背景圖片可隨視窗客戶區大小伸縮
// TODO: Add your message handler code here and/or call default
//dan,2007-6-9
//方案二讀檔案,圖形可伸縮
/*
HBITMAP hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\res\\background.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
HDC hMemDC = CreateCompatibleDC(pDC->m_hDC);
CBitmap bmp;
bmp.Attach(hBmp);
BITMAP bm;
bmp.GetBitmap(&bm);
SelectObject(hMemDC,hBmp);
CRect rc;
GetClientRect(rc);
StretchBlt(pDC->m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
bmp.DeleteObject();
*/
/*方案三,直接使用資源id,圖形可伸縮,修改為背景圖片可隨視窗客戶區大小伸縮,圖片偏大,失真
CBitmap bmp;
HDC hMemDC=CreateCompatibleDC(pDC->m_hDC);
bmp.LoadBitmap(IDB_SPLASH);
BITMAP bm;
bmp.GetBitmap(&bm);
SelectObject(hMemDC,HBITMAP(bmp));
CRect rc;
GetClientRect(rc);
StretchBlt(pDC->m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
bmp.DeleteObject();
*/
/*方案四,直接使用資源id,圖形不可伸縮
CBitmap backBmp;// background bitmap picture
backBmp.LoadBitmap(IDB_SPLASH);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* oldBmp=memDC.SelectObject(&backBmp);
if(!oldBmp)return false;
CRect cr;
GetClientRect(&cr);
BITMAP bmpinfo;
GetObject(backBmp.m_hObject,sizeof(BITMAP),&bmpinfo);
int wDelta=bmpinfo.bmWidth; int hDelta=bmpinfo.bmHeight;
for(int w=0;w<cr.Width();w+=wDelta)
for(int h=0;h<cr.Height();h+=hDelta)
pDC->BitBlt(w,h,wDelta,hDelta,&memDC,0,0,SRCCOPY);
memDC.SelectObject(oldBmp);
memDC.DeleteDC();
*/
//方案五,讀檔案,圖形不可伸縮
/*
HBITMAP hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\res\\background.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CBitmap backBmp; // background bitmap picture
backBmp.Attach(hBmp);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* oldBmp=memDC.SelectObject(&backBmp);
if(!oldBmp)return false;
CRect cr;
GetClientRect(&cr);
BITMAP bmpinfo;
GetObject(backBmp.m_hObject,sizeof(BITMAP),&bmpinfo);
int wDelta=bmpinfo.bmWidth; int hDelta=bmpinfo.bmHeight;
for(int w=0;w<cr.Width();w+=wDelta)
for(int h=0;h<cr.Height();h+=hDelta)
pDC->BitBlt(w,h,wDelta,hDelta,&memDC,0,0,SRCCOPY);
memDC.SelectObject(oldBmp);
memDC.DeleteDC();
*/
//方案一,直接返回,使用畫刷改變檢視單調的背景
return true;
}