Static 控制項(`CStatic`)本身不支援滾動。 它只是一個簡單的顯示容器(文字、圖片、矩形框),沒有滾動條機制,也無法響應滾動訊息。若在 Static 上繪圖並拖動滾動,畫面不會跟隨移動,只會重繪可見區域,導致內容錯位或消失。
MFC 文檔/視圖架構中,專門提供 `CScrollView`** 類別處理大範圍繪圖與滾動。核心步驟:
SetScrollSizes(MM_TEXT, CSize(totalWidth, totalHeight)) 設定邏輯文檔總大小(以像素為單位)。pDC 的視口原點,你只需按邏輯座標繪圖,無需手動計算偏移。class CMyDrawView : public CScrollView {
protected:
virtual void OnInitialUpdate() {
CScrollView::OnInitialUpdate();
// 假設繪圖區寬 2000px、高 1500px
SetScrollSizes(MM_TEXT, CSize(2000, 1500));
}
virtual void OnDraw(CDC* pDC) {
// 直接用邏輯座標繪圖,MFC 自動處理可見區域裁剪與偏移
pDC->Rectangle(100, 100, 500, 400);
pDC->TextOut(200, 200, _T("這是可滾動的繪圖區"));
// ... 更多繪圖代碼 ...
}
};
`CScrollView` 內部已封裝滾動條訊息處理、視口座標轉換、無效區重繪等邏輯。手動處理極易出現座標轉換錯誤、閃爍、邊界越界等問題。站在巨人肩膀上,專注於 `OnDraw` 繪圖邏輯即可。
經典教學:MFC CScrollView 使用詳解 (CSDN)