筆者在開發項目時想在MDI程序中添加彩色位圖以美化界面,也實驗了幾種方法,但都有一些小問題,經多方查找資料,終於圓滿的實現了這種功能,現把我的實現方法介紹給大家。
首先要清楚對於一個MDI應用程序的主框架窗口來說包含一個特殊的子窗口稱為MDICLIENT窗口,應用程序的主框架類中有一個成員變量m_hWndMDIClient 指的就是MDICLIENT窗口。MDICLIENT窗口負責管理主框架窗口的客戶區,對MDI客戶窗口編程有一定的難度。原因是MDIFrameWnd的客戶區完全被MDICLIENT窗口覆蓋掉了。這樣,MDI主窗口類MDIFrameWnd的背景色和光標都不起作用。同時,微軟並不支持將MDICLIENT窗口作為子類,MDICLIENT窗口只能使用標准的背景色和光標。所以,對MDI客戶窗口編程不能象對普通窗口那樣簡單地重載WM_PAINT的消息處理函數。我們可以在主框架窗口截獲關於MDICLIENT窗口的重畫消息,然後加入自己設計的代碼。我用PreTranslateMessage(MSG* pMsg) 截獲MDI客戶窗口WM_PAINT消息,在這個函數中向主框架窗口發送WM_PAINT消息,在該消息的處理函數中實現彩色位圖的顯示。我的具體實現如下:1、向程序添加256色彩色位圖資源,命名為IDB_BITMAP1;2、用ClassWizard向主框架類添加函數CMainFrame::PreTranslateMessage(MSG* pMsg);3、用ClassWizard向主框架類添加函數CMainFrame::OnPaint();現給出兩個函數的實現:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->hwnd==m_hWndMDIClIEnt && pMsg->message==WM_PAINT)
PostMessage(WM_PAINT);
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
void CMainFrame::OnPaint()
{
CDC dc, memdc;
dc.m_hDC=::GetDC(this->m_hWndMDIClIEnt);
CRect rect;
CBitmap bitmap;
BITMAP szbitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
bitmap.GetObject(sizeof(BITMAP),&szbitmap);
CSize size(szbitmap.bmWidth,szbitmap.bmHeight);
memdc.CreateCompatibleDC(&dc);
CBitmap *oldbitmap=memdc.SelectObject(&bitmap);
GetClIEntRect(&rect);
StretchBlt(dc.m_hDC,0,0,rect.Width(),rect.Height(),
memdc.m_hDC,0,0,size.cx,size.cy,SRCCOPY);
memdc.SelectObject(oldbitmap);
memdc.DeleteDC();
dc.DeleteDC();
CMDIFrameWnd::OnPaint();
}
按上述步驟就可以實現在MDI程序中顯示彩色位圖了,我舉的例子用的是256色位圖,你也可以實現真彩色位圖的顯示,具體方法我就不多說了,有興趣的朋友可以試一試。