筆者在開發項目時想在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色位元影像,你也可以實現真彩色位元影像的顯示,具體方法我就不多說了,有興趣的朋友可以試一試。