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

CFormView 實現真正上下文說明:重載 OnHelpHitTest 映射控制項 ID 至說明主題

     編輯:關於C語言

問題背景

CFormView 基於對話框模板,標準 MFC 上下文說明 (Shift+F1 或工具列「說明」按鈕) 預設僅對應視圖資源 ID (HID_BASE_RESOURCE + IDD_FORM),無法針對個別控制項 (編輯框、按鈕、下拉框) 顯示不同說明主題。

解決方案:重載 OnHelpHitTest


LRESULT CMyFormView::OnHelpHitTest(WPARAM, LPARAM lParam) {
    // lParam 為螢幕座標 (LOWORD=x, HIWORD=y)
    CPoint pt(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
    ScreenToClient(&pt); // 轉換為客戶區座標

    // 找出座標下的子視窗 (包含不可見/停用控制項)
    CWnd* pChild = ChildWindowFromPoint(pt, CWP_ALL | CWP_SKIPINVISIBLE);
    if (pChild && ::IsWindow(pChild->m_hWnd)) {
        UINT nID = pChild->GetDlgCtrlID(); // 取得控制項 ID
        if (nID != 0) {
            // 命令類控制項 (按鈕、功能表項) 對應 HID_BASE_COMMAND
            // 視窗/對話框/非命令控制項 對應 HID_BASE_RESOURCE
            // 這裡簡單假設所有控制項為命令類
            return HID_BASE_COMMAND + nID;
        }
    }

    // 無控制項或無 ID,回傳視圖資源說明 ID
    return HID_BASE_RESOURCE + GetDlgCtrlID();
}

說明 ID 命名規範 (參考 TN028)

資源檔 (.rtf/.hpj) 定義對應


// .hpj 專案檔
[MAP]
#include "resource.hm"  // 包含 ID 定義

// .rtf 內容
#if ID_FILE_OPEN
#IDH_FILE_OPEN
開啟現有檔案...
#IDH_FILE_OPEN END
#endif

#if ID_EDIT_COPY
#IDH_EDIT_COPY
複製選取內容到剪貼板...
#IDH_EDIT_COPY END
#endif

#if IDD_MY_FORMVIEW
#IDH_MY_FORMVIEW
此表單用於...
#IDH_MY_FORMVIEW END
#endif

關鍵檢查清單

  1. 控制項在對話框編輯器中設定唯一 ID (非 IDC_STATIC),並定義在 resource.h。
  2. resource.hm (說明對應檔) 包含所有控制項 ID 定義,.hpj 正確 #include。
  3. 說明專案 (.hpj) 編譯無誤,產生 .chm/.hlp。
  4. 應用程式 CWinApp::m_pszHelpFilePath 正確設定說明檔路徑。
  5. 啟用說明支援:CWinApp::EnableHtmlHelp() (HTML Help) 或傳統 WinHelp。

進階:區分命令/非命令控制項


UINT nID = pChild->GetDlgCtrlID();
if (pChild->IsKindOf(RUNTIME_CLASS(CButton)) || 
    pChild->IsKindOf(RUNTIME_CLASS(CMenu))) {
    return HID_BASE_COMMAND + nID;
} else {
    return HID_BASE_RESOURCE + nID; // 或 IDW_ 前綴對應
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
前綴用途基底值
ID_功能表項、命令按鈕HID_BASE_COMMAND (0x10000)
IDR_視窗、對話框、工具列資源HID_BASE_RESOURCE (0x20000)
IDD_對話框模板HID_BASE_RESOURCE
IDP_提示/錯誤訊息HID_BASE_PROMPT (0x30000)
IDW_非命令按鈕控制項 (編輯框、清單等)HID_BASE_RESOURCE