VC—主架構視窗繪製背景 轉自skyremember的專欄
使用VC進行項目開發,特別是簡單的MIS系統開發中,通常在使用者沒有進行操作之前顯示的是主架構的視窗(使用者點擊操作功能表項目再彈出處理視窗)。因 此給主框 架視窗提供一個背景圖片就顯得很有必要(例如一使用者滿意的LOGO等)。但是對於主架構的背景的繪製不能簡單地用ClassWizard重載 OnEraseBkgnd(CDC* pDC)函數的方法實現。
多文件視窗應用程式中的主架構視窗的背景區是一個MDIClient類的視窗,因此改變背 景與這個MDIClient類的視窗有關。MDIClient類的視窗的控制代碼是m_hWndMDIClient(在CMDIFrameWnd中),可以通 過以下步驟實現:
Step 1:在資源中添加一個Bitmap資源,資源標誌符為IDB_BKGOUND;
Step 2:添加一個MDIClient類:Insert——>New Class,選擇MFC Class,基類選擇"generic CWnd",類名為CClientWnd;
Step 3:為CClientWnd添加OnEraseBkgnd(CDC* pDC)(WM_ERASEBKGND),OnSize(UINT nType, int cx, int cy)(WM_SIZE)函數的重載(Class Wizard),並添加虛函數WNDPROC* CClientWnd::GetSuperWndProcAddr():
BOOL CClientWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rectbk; // 客戶區的大小
CDC dcMen; //記憶體裝置描述表
CBitmap bmbk; // 位元影像對象
bmbk.LoadBitmap(IDB_BKGOUND); // 從資源載入位元影像 bitmap
// 得到位元影像bitmap的大小
BITMAP stBitmap;
bmbk.GetObject(sizeof(BITMAP),&stBitmap);
CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight);
dcMen.CreateCompatibleDC(pDC);
// 選入新的位元影像對象並儲存舊的位元影像對象
CBitmap *pold=dcMen.SelectObject(&bmbk);
GetClientRect(&rectbk);
// 從記憶體向螢幕複製位元影像對象
pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(),rectbk.Height(),&dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY);
dcMen.SelectObject(pold);
// 恢複舊的位元影像對象
dcMen.DeleteDC();
// 釋放記憶體裝置描述表
//return CWnd::OnEraseBkgnd(pDC);
return TRUE;
}
void CClientWnd::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
Invalidate(); //大小改變後重畫
}
ClientWnd.h中添加:
virtual WNDPROC* GetSuperWndProcAddr();
ClientWnd.cpp中添加:
WNDPROC* CClientWnd::GetSuperWndProcAddr()
{
static WNDPROC NEAR pfnSuper = NULL;
return &pfnSuper; // 返回函數指標
}
Step 4:為主架構添加背景:
在MainFrm.h中添加:CClientWnd m_wndClient; (添加#include"ClientWnd.h"標頭檔)
在CMainFrame類的OnCreate()事項中添加:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndClient.SubclassWindow(m_hWndMDIClient))//該句為加入
{
TRACE("Fail to subclass MDI client window/n");
return -1;
}
//////省略
}