即時線上說明支援 TN028:
這張便箋說明指派說明內容識別碼,並在 MFC 中的其他說明問題的規則。 即時線上說明支援需要說明編譯器在 Visual C++ 中使用。
注意事項 |
---|
除了實作即時線上說明使用 WinHelp,MFC 也支援使用 HTML 說明檔。如需有關此支援和 HTML 說明使用設計程式的詳細資訊,請參閱 HTML 說明: 程式的即時線上說明。 |
說明支援的類型
有兩種類型的 Windows 應用程式中實作即時線上說明。 第一,稱為 「 F1 說明 」 牽涉到啟動 WinHelp 與適當的內容,根據目前使用中的物件。 第二個是"Shift + F1 」 模式。 在此模式中,滑鼠游標會變為 [說明] 游標,使用者會進行下列操作,在物件上按一下。 此時,WinHelp 就會啟動,讓使用者按下的物件的說明。
Mfc 實作兩種形式的說明。 此外,架構會支援兩個簡單的說明命令說明的索引和使用可以幫助。
說明檔
Mfc 假設單一的 [說明] 檔案。 說明檔案必須與應用程式有相同的名稱和路徑。 比方說,如果可執行檔是 C:\MyApplication\MyHelp.exe 的說明檔必須是 C:\MyApplication\MyHelp.hlp。 您可以設定整個路徑m_pszHelpFilePath成員變數的CWinApp 類別。
說明內容範圍
MFC 的預設實作會要求程式以遵循一些規則,有關工作分派的說明內容識別碼。 這些規則是之 Id 範圍配置給特定的控制項。 若要覆寫這些規則,可以提供各種說明相關的成員函式的不同執行方式。
0x00000000 - 0x0000FFFF : user defined
0x00010000 - 0x0001FFFF : commands (menus/command buttons)
0x00010000 + ID_
(note: 0x18000-> 0x1FFFF is the practical range since command IDs are >=0x8000)
0x00020000 - 0x0002FFFF : windows and dialogs
0x00020000 + IDR_
(note: 0x20000-> 0x27FFF is the practical range since IDRs are <= 0x7FFF)
0x00030000 - 0x0003FFFF : error messages (based on error string ID)
0x00030000 + IDP_
0x00040000 - 0x0004FFFF : special purpose (non-client areas)
0x00040000 + HitTest area
0x00050000 - 0x0005FFFF : controls (those that are not commands)
0x00040000 + IDW_
簡單的"Help"命令
有兩個簡單的 「 說明 」 命令,由 Mfc 實作:
ID_HELP_INDEX 可由存取關聯式資料庫CWinApp::OnHelpIndex
ID_HELP_USING 可由存取關聯式資料庫CWinApp::OnHelpUsing
第一個命令會顯示應用程式的 [說明] 索引。 第二個會顯示使用者說明使用 WinHelp 程式。
即時線上說明 (F1 說明)
F1 鍵通常會轉譯至命令 id 為ID_HELP的加速器放在主視窗的對應鍵對應表。 ID_HELP指令也會產生由按鈕 id 為ID_HELP主視窗或對話方塊上。
不論如何ID_HELP ,就會產生命令,直到達到命令處理常式,以標準模式] 指令路由傳送。 如需有關 MFC 命令傳送架構的詳細資訊,請參閱技術的附註 21。 如果應用程式已啟用,說明ID_HELP指令處理CWinApp::OnHelp。 應用程式物件就會收到說明訊息,然後適當地傳送命令。 這是必要的因為預設路由命令不適用於決定最適合的內容。
CWinApp::OnHelp嘗試啟動 WinHelp 順序如下:
會檢查使用中的AfxMessageBox呼叫,以幫助的識別碼。 如果目前使用中的訊息方塊,WinHelp 就會啟動適用於該訊息方塊的內容。
傳送到使用中視窗的 WM_COMMANDHELP 訊息。 如果該視窗啟動 WinHelp 沒有回應,相同的訊息會再送給該視窗的上階直到將郵件傳送,或目前視窗是最上層的視窗。
傳送 ID_DEFAULT_HELP 命令至主視窗。 這會叫用預設的說明。 這個命令通常會對應至CWinApp::OnHelpIndex。
若要全域覆寫預設的 ID 基底值 (例如: 命令 0x10000 和 0x20000 的資源,例如對話方塊),應用程式應該覆寫CWinApp::WinHelp。
若要覆寫這項功能,以及說明內容會決定的方式,您應該可以處理 WM_COMMANDHELP 訊息。 您可能想要提供更詳細說明路由比 「 架構 」 提供,因為它只會為目前的 MDI 子視窗深。 您也可以提供關於特定視窗或對話方塊,也許是根據目前的內部狀態,該物件或作用中的控制項在對話方塊內的更詳細的說明。
WM_COMMANDHELP
afx_msg LRESULT CWnd::OnCommandHelp(WPARAM wParam, LPARAM lParam)
WM_COMMANDHELP 是私用的 Windows MFC 訊息要求說明時接收的使用中視窗。 當視窗收到這封郵件時,可能會呼叫CWinApp::WinHelp以符合視窗的內部狀態的內容。
lParam
包含目前可用的 「 說明 」 內容。 lParam如果已決定不說明的內容,則為零。 實作的OnCommandHelp可以使用 [內文識別碼中的lParam來決定不同的內容,或可以只是將它傳遞至CWinApp::WinHelp。wParam
尚未使用,且將會是零。
如果OnCommandHelp的函式呼叫CWinApp::WinHelp,它應該傳回TRUE。 傳回TRUE至其他類別,然後到其他視窗,這個命令的路由會停止。
說明模式 (Shift + F1 說明)
這是第二個表單的即時線上說明。 一般而言,這種模式被輸入藉由按下 SHIFT + F1,或透過功能表或工具列。 它實作為命令 (ID_CONTEXT_HELP)。 訊息篩選器的攔截程序不會用來翻譯的強制回應對話方塊時,此指令或功能表開啟,因此這項指令,使用者可以使用時才執行的應用程式的主訊息幫浦 (CWinApp::Run)。
之後進入此模式,[說明] 滑鼠游標會顯示在應用程式的所有範圍,即使應用程式通常會顯示它自己的資料指標,該區域 (例如視窗周圍之縮放邊框)。 在能夠使用滑鼠或鍵盤選取命令。 而非執行命令,會顯示該命令的說明。 此外,使用者可以按一下可見的物件,在畫面上,例如在 [工具列按鈕,將會顯示該物件的說明。 這種說明模式由CWinApp::OnContextHelp。
在這個迴圈 (loop) 執行時,所有鍵盤輸入不在作用中,除了用於存取功能表的機碼。 此外,命令轉譯仍然會透過PreTranslateMessage以允許使用者按下對應鍵,並接收該命令的說明。
如果沒有特定轉譯或採取的動作將放在PreTranslateMessage函式,不應該在進行 SHIFT + F1 說明模式下,您應該檢查m_bHelpMode成員的CWinApp才能執行這些作業。 CDialog的實作PreTranslateMessage呼叫之前檢查這IsDialogMessage,例如。 這會在非強制回應對話方塊上的 「 對話方塊瀏覽 」 機碼 SHIFT + F1 模式期間停用。 此外, CWinApp::OnIdle仍會呼叫這個迴圈期間。
如果使用者選擇從功能表的命令,它被視為該命令的說明 (透過 WM_COMMANDHELP,如下所示)。 如果使用者按一下應用程式視窗的可見區域時,會決定需要非用戶按一下或用戶端連按。 OnContextHelp非用戶的控制代碼對應自動按一下用戶端的按鍵動作。 如果是用戶端按一下,然後將傳送 WM_HELPHITTEST 所按下的視窗。 如果該視窗會傳回非零值,這個值用於做為內容說明。 它會傳回零,如果OnContextHelp會試著在父視窗 (而且如果再次失敗,其父代,等等)。 如果無法判斷說明內容,則預設會傳送 ID_DEFAULT_HELP 命令到主視窗,接著 (通常) 對應到CWinApp::OnHelpIndex。
WM_HELPHITTEST
afx_msg LRESULT CWnd::OnHelpHitTest(WPARAM, LPARAM lParam)
WM_HELPHITTEST 是用 SHIFT + F1 說明模式期間,只要按一下使用中視窗收到一個 MFC 私用的 windows 訊息。 當視窗收到這封郵件時,它會傳回用於 DWORD 說明 ID 的 WinHelp。
LOWORD(lParam)
包含位置相對於視窗的工作區按下滑鼠的 x 軸裝置座標。HIWORD(lParam)
包含的 y 軸座標。wParam
尚未使用,且將會是零。 如果傳回值是零,WinHelp 呼叫時該內容。 如果傳回值為零,說明查詢父視窗。
在許多情況下,您可以利用您可能已經有的點擊測試程式碼。 請參閱實作 CToolBar::OnHelpHitTest 處理的範例, WM_HELPHITTEST 訊息 (此程式碼會使用按鈕和工具提示中的所用的點擊測試程式碼CControlBar)。
MFC 應用程式精靈支援和 MAKEHM
MFC 應用程式精靈會建立必要的檔案以便建置說明檔 (.cnt 和.hpj 檔)。 它也包含多個預先建置的.rtf 檔案可接收的 Microsoft 說明編譯器。 許多主題都已完成,但有些可能需要針對特定應用程式進行修改。
自動建立"說明對應"的檔案是由稱為 MAKEHM 的公用程式支援的。 MAKEHM 公用程式可以翻譯應用程式的資源。H 檔案中說明對應檔。 例如:
#define IDD_MY_DIALOG 2000
#define ID_MY_COMMAND 150
將會翻譯成:
HIDD_MY_DIALOG 0x207d0
HID_MY_COMMAND 0x10096
這種格式適用於說明編譯器的設備,這會將內容 Id (必須是在右邊的數字) 對應的主題名稱 (在左邊符號)。
MAKEHM 的程式碼是在 MFC 程式設計公用程式範例中,您可以使用 MAKEHM。
執行 MFC 應用程式精靈 」 之後加入說明支援
若要將說明新增至您的應用程式,最好是選取 [即時線上說明] 選項在 MFC 應用程式精靈的 [進階功能] 頁面上建立您的應用程式之前,先。 如此一來 MFC 應用程式精靈會自動新增到所需的訊息對應項目您CWinApp-衍生的類別支援說明。
訊息方塊上的說明
[說明] 訊息方塊 (有時稱為 「 警示 」) 可支擾AfxMessageBox函式、 的包裝函式MessageBox Windows API。
有兩個版本的AfxMessageBox,一個用於字串 ID,另一個則用於字串的指標 (LPCSTR):
int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp);
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp);
在這兩種情況下,沒有識別碼選擇性幫助。
如為前者,nIDHelp 的預設值是 0,表示無法取得此訊息方塊的說明。 如果使用者按下 F1,如訊息方塊處於作用中時,使用者將不會收到說明 (即使該應用程式支援的說明)。 如果這不是令人滿意,nIDHelp 應該提供說明的 ID。
在第二個案例中,nIDHelp 的預設值為-1,表示說明 ID 等同於 nIDPrompt。 說明適只有當應用程式說明功能,當然是)。 如果您想要 [訊息] 方塊中有沒有說明支援,您應該提供 0 的 nIDHelp。 如果您要的訊息,說明啟用,但不比 nIDPrompt 是不同的說明 ID 的需求,只是提供不同的 nIDPrompt nIDHelp 的正數值。