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

VC 手動新增自定義訊息完整流程:從定義到 ClassWizard 識別

     編輯:VC 教學

四步驟手工加入

1. 定義訊息常數 (建議 ≥ WM_USER+100)

#define WM_MY_MESSAGE (WM_USER + 100)

2. 實作處理函數 (簽名固定)

LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) {
    // 處理邏輯
    return 0;
}

3. 類別宣告區加入聲明 (AFX_MSG 區塊內)

class CMainFrame : public CMDIFrameWnd {
protected:
    //{{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT);
    afx_msg void OnTimer(UINT);
    afx_msg LRESULT OnMyMessage(WPARAM, LPARAM); // 新增
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

4. 訊息映射區加入 ON_MESSAGE (AFX_MSG_MAP 區塊內)

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_WM_TIMER()
    ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) // 新增
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

完成後效果

ClassWizard 重新掃描後會識別此訊息,後續可在訊息列表中看到 WM_MY_MESSAGE,雙擊即可跳轉至處理函數,享受與標準訊息同等的 IDE 支援。

實戰用例:多執行緒完成通知主視窗

// 工作執行緒
UINT ThreadProc(LPVOID p) {
    // ... 耗時運算 ...
    ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_MY_MESSAGE, (WPARAM)hThread, result);
    return 0;
}

// 主視窗處理
LRESULT CMainFrame::OnMyMessage(WPARAM w, LPARAM l) {
    HANDLE h = (HANDLE)w; int res = (int)l;
    // 更新進度條、啟用按鈕、顯示結果...
    return 0;
}

注意事項

  • 若在類別精靈中新增虛擬函數,需刪除類別宣告中自動產生的函數原型,避免與映射區重複定義編譯錯誤
  • 跨進程發送需用 RegisterWindowMessage 取得全域唯一 ID
  • 傳遞指標務必確保記憶體有效期 (建議用 PostMessage + 堆疊分配或共享記憶體)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved