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

Visual C++ 程式設計兩大核心技巧:視圖背景色無閃爍設定與對話框標題動態修改

     編輯:VC 教學

技巧一:視圖背景色——正確處理 WM_ERASEBKGND

錯誤做法:在 OnDraw 填充背景

void CTestView::OnDraw(CDC* pDC) {
    CRect rect; GetClientRect(&rect);
    CBrush brush(RGB(255,0,0));
    pDC->FillRect(&rect, &brush); // 每次重繪都會先擦除再填 → 閃爍
}

原因分析

MFC 繪圖流程:WM_ERASEBKGND → 系統用類別註冊時的 hbrBackground 擦除 → OnDraw 繪製內容。在 OnDraw 重填背景會導致「擦白→填紅」雙重繪製,產生閃爍。

正確做法:攔截 WM_ERASEBKGND

  1. 文件類加入 COLORREF m_viewBkColor 並提供 Get/Set,支援序列化
  2. 視圖類加入訊息映射 ON_WM_ERASEBKGND()
  3. 實作:
BOOL CTestView::OnEraseBkgnd(CDC* pDC) {
    CRect rect; pDC->GetClipBox(&rect); // 僅取得需更新區域
    CBrush brush(GetDocument()->GetViewBkColor());
    pDC->FillRect(&rect, &brush);
    return TRUE; // 告訴系統已處理擦除,不再預設動作
}

選單修改背景色

void CTestView::OnChangeViewBkColor() {
    CColorDialog dlg;
    if(dlg.DoModal() == IDOK) {
        GetDocument()->SetViewBkColor(dlg.GetColor());
        InvalidateRect(NULL); // 觸發重繪
    }
}

技巧二:對話框標題動態修改——利用 OnInitDialog

錯誤嘗試

CTestDialog dlg;
dlg.SetWindowText(_T("新標題")); // 失效:視窗尚未建立
dlg.DoModal();

原因

DoModal 內部才建立視窗物件,建構函數返回時視窗不存在;DoModal 返回後視窗已銷毀。

正確模式

  1. 對話框類加入 CString m_strCaption 公有成員
  2. 呼叫端:
CTestDialog dlg;
dlg.m_strCaption = _T("動態標題");
dlg.DoModal();
  1. 重載 OnInitDialog:
BOOL CTestDialog::OnInitDialog() {
    CDialog::OnInitDialog();
    if(!m_strCaption.IsEmpty()) SetWindowText(m_strCaption);
    return TRUE;
}

核心心法

兩個技巧本質相同:在正確的生命週期階段執行正確的代碼。MFC 框架預定義了大量虛擬函數與訊息映射入口,掌握調用時序(建構 → Create/DoModal → OnInitDialog/OnCreate → WM_ERASEBKGND → OnDraw → 銷毀)是寫出高效、穩定程式的關鍵。

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