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

VC++ MFC 常用指標獲取技巧總結 (工具列、狀態列、視圖、文檔、框架、應用程式)

     編輯:VC 教學

核心獲取函數

  • AfxGetApp() → CWinApp* 應用程式物件
  • AfxGetMainWnd() → CMainFrame* 主框架視窗
  • AfxGetApp()->m_pMainWnd 同上,但為 CWnd* 需轉型

各類指標獲取方法

目標代碼範例說明
工具列CToolBar* pBar = (CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);預設 ID
狀態列CStatusBar* pBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);預設 ID
對話框控制項CButton* pBtn = (CButton*)GetDlgItem(IDC_MYBTN);視圖/對話框成員函數
控制項變數關聯ClassWizard → Member Variables → Add Variable (Ctrl+雙擊控制項)自動 DDX/DDV
文檔 → 視圖POSITION pos = GetFirstViewPosition(); while(pos) { CView* p = GetNextView(pos); }遍歷所有視圖
視圖 → 文檔CDoc* pDoc = GetDocument(); // 內部 static_cast(m_pDocument)最常用
框架 → 文檔/視圖CDoc* pDoc = (CDoc*)GetActiveDocument(); CView* pView = (CView*)GetActiveView();MDI/SDI 通用
應用程式CMyApp* pApp = (CMyApp*)AfxGetApp();全域唯一
主框架CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();SDI/MDI 主框架
滑鼠點擊子視窗CWnd* pChild = ChildWindowFromPoint(pt, CWP_SKIPINVISIBLE);回傳偽指標,勿長期持有

ChildWindowFromPoint 旗標

  • CWP_ALL:不忽略任何子視窗
  • CWP_SKIPINVISIBLE:忽略不可見
  • CWP_SKIPDISABLED:忽略停用
  • CWP_SKIPTRANSPARENT:忽略透明 (WS_EX_TRANSPARENT)

實用場景範例

在文檔類中通知所有視圖更新

void CMyDoc::OnDataChanged() {
    UpdateAllViews(NULL); // 標準 MFC 方式,自動遍歷視圖呼叫 OnUpdate
}

在非視圖類別中取得當前活動視圖

CView* pView = ((CMainFrame*)AfxGetMainWnd())->GetActiveView();
if (pView && pView->IsKindOf(RUNTIME_CLASS(CMyView))) {
    ((CMyView*)pView)->DoSomething();
}

避坑指南

  • 所有 GetDescendantWindow、ChildWindowFromPoint 回傳 **暫時性指標**,**不可儲存為成員變數** 長期持有,視窗重建時會失效。
  • 跨模組 (DLL/EXE) 傳遞 MFC 物件指標極度危險,**嚴禁**。
  • 多執行緒中存取 UI 物件必須 PostMessage 回主執行緒。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved