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

VC++ 在視圖類別中動態建立按鈕控件 (二):父視窗關係與訊息處理

     編輯:VC 教學

前言

承接上篇「在主框架視窗建立按鈕」,本文示範如何在 CView 衍生類中動態建立按鈕、處理 WM_CREATE 訊息、探討父視窗對按鈕位置的影響,並說明 WS_VISIBLE 樣式簡化顯示邏輯。

在 CView 中回應 WM_CREATE

CView 預設無 OnCreate,需透過類別向導加入:

  1. ClassView 右鍵 CTestView → Add Windows Message Handler...
  2. 選取 WM_CREATE → Add and Edit。

完整 OnCreate 實作

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1) return -1;

    // 建立按鈕,父視窗指定為 GetParent() (即 CMainFrame)
    m_btn.Create(_T("按鈕"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                 CRect(0, 0, 100, 100), GetParent(), 123);

    return 0;
}

父視窗對位置的決定性影響

建立位置父視窗 (pParentWnd)座標基準按鈕顯示位置
CMainFrame::OnCreatethis (CMainFrame)主框架客戶區 (0,0)工具列上方、選單下方
CView::OnCreate + thisthis (CView)View 客戶區 (0,0)View 內部左上角
CView::OnCreate + GetParent()GetParent() (CMainFrame)主框架客戶區 (0,0)同 CMainFrame 建立位置

結論:按鈕位置由 父視窗的客戶區座標系 決定,與建立程式碼所在類別無關。

WS_VISIBLE:一行程式碼完成建立與顯示

// 等同於 Create + ShowWindow(SW_SHOWNORMAL)
m_btn.Create(_T("按鈕"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
             CRect(0,0,100,100), GetParent(), 123);
  • WS_CHILD:子視窗 (必須)。
  • WS_VISIBLE:建立即顯示,省去 ShowWindow。
  • BS_DEFPUSHBUTTON:預設按鈕樣式 (有邊框強調)。

C++ 物件生命週期 vs 視窗資源

  • m_btn 為 CView 成員變數,生命週期隨 View 物件。
  • View 銷毀時,CWnd::~CWnd 會自動 DestroyWindow 釋放 HWND。
  • 但 CButton C++ 物件本身不會因視窗銷毀而銷毀,仍可呼叫非視窗相關函式 (如 GetButtonStyle)。

常用按鈕樣式速查

尋找 API 小技巧

MSDN 索引輸入關鍵字組合 (如 GetParent、SetWindowPos、ModifyStyle),多為「動詞+名詞」命名,善用自動完成快速定位。

總結

在 CView 中動態建立按鈕,關鍵在於:(1) 透過類別向導加入 WM_CREATE 處理;(2) 明確指定父視窗 (this 或 GetParent()) 決定座標系;(3) 使用 WS_VISIBLE 簡化顯示;(4) 成員變數管理生命週期,避免區域變數導致視窗過早銷毀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
樣式外觀/行為
BS_PUSHBUTTON標準按鈕
BS_DEFPUSHBUTTON預設按鈕 (粗邊框)
BS_CHECKBOX核取方塊
BS_AUTOCHECKBOX自動切換勾選狀態
BS_RADIOBUTTON單選鈕
BS_AUTORADIOBUTTON自動互斥單選
BS_OWNERDRAW自繪按鈕 (需處理 WM_DRAWITEM)