程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VISUAL C++6.0在MDI主框架窗口中添加位圖

VISUAL C++6.0在MDI主框架窗口中添加位圖

編輯:關於VC++

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

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved