在一個 View 中加載多個繪圖對象,各自處理縮放邏輯導致座標映射衝突、重繪錯位。
class DrawManager {
public:
static DrawManager& Instance() {
static DrawManager inst;
return inst;
}
void RegisterDrawer(IDrawer* drawer) { drawers_.push_back(drawer); }
void UnregisterDrawer(IDrawer* drawer) {
drawers_.erase(std::remove(drawers_.begin(), drawers_.end(), drawer), drawers_.end());
}
void OnDraw(CDC* pDC, const CRect& clientRect) {
for (auto d : drawers_) d->Draw(pDC, clientRect, GetTransform());
}
void SetZoom(double factor, CPoint center) { /* 更新統一變換矩陣 */ }
Matrix GetTransform() const { return transform_; }
private:
DrawManager() {}
std::vector drawers_;
Matrix transform_;
};
IDrawer::Draw(CDC*, CRect, Matrix),使用統一變換矩陣繪制。OnDraw 僅調用 DrawManager::Instance().OnDraw(pDC, rect)。DrawManager::Instance().SetZoom(...),然後 Invalidate()。