首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 6.0 MDI 主框架視窗背景圖片繪製技巧

     編輯:關於VC++

MDI 架構背景繪製難點

MDI 應用程式的主框架視窗包含一個特殊的 MDICLIENT 子視窗,完全覆蓋客戶區。導致:

  • 主視窗類別 CMDIFrameWnd 的背景色與游標設定失效
  • 微軟不支援將 MDICLIENT 子類別化
  • 無法像一般視窗直接覆寫 WM_PAINT

解決方案:攔截 WM_PAINT 訊息

在主框架類別中覆寫 PreTranslateMessage 攔截 MDICLIENT 的重繪訊息,轉發 WM_PAINT 給主框架,再於 OnPaint 繪製背景圖。

實作步驟

  1. 匯入 256 色位圖資源,資源 ID 為 IDB_BITMAP1
  2. 使用 ClassWizard 為 CMainFrame 加入 PreTranslateMessage 與 OnPaint 處理函式

程式碼實作

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) {
    // 攔截 MDICLIENT 的 WM_PAINT
    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(m_hWndMDIClient);  // 取得 MDICLIENT DC

    CRect rect;
    GetClientRect(&rect);                  // 取得客戶區大小

    CBitmap bitmap;
    BITMAP szbitmap;
    bitmap.LoadBitmap(IDB_BITMAP1);        // 載入位圖資源
    bitmap.GetObject(sizeof(BITMAP), &szbitmap);

    CSize size(szbitmap.bmWidth, szbitmap.bmHeight);
    memdc.CreateCompatibleDC(&dc);         // 建立相容 DC
    CBitmap* oldbitmap = memdc.SelectObject(&bitmap);

    // 伸縮繪製填滿整個客戶區
    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();  // 呼叫基底類別
}

關鍵技術點解析

技術點說明
m_hWndMDIClient主框架成員變數,指向 MDICLIENT 視窗控制代碼
PreTranslateMessage訊息派送前攔截點,可過濾/轉發訊息
PostMessage(WM_PAINT)非同步張貼重繪訊息,避免遞迴
StretchBlt將位圖伸縮繪製至目標 DC,自適應視窗大小
GetDC(m_hWndMDIClient)直接取得 MDICLIENT 的裝置內容,而非主框架

擴充應用

  • 支援真彩色 (24/32-bit) 位圖:使用 LoadImage 載入外部 BMP/PNG/JPG
  • 平鋪模式:改用 BitBlt 迴圈實現磚狀重複
  • 置中/拉伸/裁切模式:依需求調整 StretchBlt 參數
  • 雙重緩衝優化:若閃爍嚴重,可在記憶體 DC 完成合成再一次 Blit 到螢幕

適用版本

Visual C++ 6.0 / MFC 4.2 以上,Windows 98/NT 4.0/2000/XP 均可正常執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved