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

MFC/ATL 視窗矩形獲取封裝:CClientRect 與 CWindowRect

     編輯:關於C++

痛點

頻繁呼叫 GetClientRect/GetWindowRect 時,每次都需宣告臨時 CRect 變數,程式碼冗長:

CRect rc;
::GetClientRect(hWnd, &rc);

RAII 風格封裝

利用繼承 CRect (或 tagRECT),建構子自動填充:

// 基於 CRect (MFC/ATL 共用)
class CClientRect : public CRect {
public:
    explicit CClientRect(HWND hWnd) {
        ATLASSERT(::IsWindow(hWnd));
        ::GetClientRect(hWnd, this);
    }
};

// 不依賴 MFC/ATL,直接繼承 tagRECT
class CClientRect : public tagRECT {
public:
    explicit CClientRect(HWND hWnd) {
        ATLASSERT(::IsWindow(hWnd));
        ::GetClientRect(hWnd, this);
    }
};

使用範例

void OnSize(UINT, CSize sz) {
    CClientRect rc(m_hWnd);          // 自動取得客戶區矩形
    MoveChildWindow(rc);             // 直接當 CRect/RECT 用
    InvalidateRect(&rc);             // 隱性轉型
}

同理封裝 GetWindowRect

class CWindowRect : public CRect {
public:
    explicit CWindowRect(HWND hWnd) {
        ATLASSERT(::IsWindow(hWnd));
        ::GetWindowRect(hWnd, this);
    }
};

優點總結

  • **就地建構、即用即走**,無需額外變數宣告。
  • **型別相容**:公開繼承 CRect/tagRECT,可直接傳遞給接受 RECT* 或 CRect& 的 API。
  • **安全性**:建構子斷言視窗有效性,早期發現無效 HWND。
  • **可擴充**:衍生類別可加入螢幕/客戶區座標轉換等輔助方法。

適用場景

  • MFC/ATL 專案:繼承 CRect 享受完整方法 (Width(), Height(), CenterPoint()…)。
  • 純 Win32 SDK 專案:繼承 tagRECT 零依賴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved