다음을 통해 공유


TN028: 상황에 맞는 도움말 지원

이 참고가 도움말 컨텍스트 Id 및 기타 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 할당에 대 한 몇 가지 규칙을 따라야 합니다 필요 합니다.이러한 규칙은 특정 컨트롤에 할당 된 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_

간단한 "도움말" 명령

Mfc로 구현 된 두 개의 간단한 도움말 명령입니다.

첫 번째 명령은 응용 프로그램에 대 한 도움말 색인을 표시합니다.사용자 도움말 WinHelp 프로그램을 사용 하 여 두 번째를 보여 줍니다.

상황에 맞는 도움말 (F1 도움말)

일반적으로 F1 키 명령 id가 변환 됩니다 ID_HELP 에서 액셀러레이터 키 주 창 액셀러레이터 키 테이블에 배치 합니다.ID_HELP 명령 수 있습니다 또한 생성할 수 여 단추 id가 ID_HELP 주 창 또는 대화 상자입니다.

에 관계 없이 얼마나 ID_HELP 명령을 생성 되는 경우 명령 처리기까지 일반 명령으로 라우팅됩니다.MFC 명령 라우팅 아키텍처에 대 한 자세한 내용은 참조 하십시오 기술 노트 21.응용 프로그램 도움말을 사용할 수 있는 경우는 ID_HELP 명령으로 처리 됩니다 CWinApp::OnHelp.응용 프로그램 개체 도움말 메시지를 수신 하 고 명령을 적절 하 게 라우팅합니다.이것은 기본 명령 라우팅을 가장 특정 컨텍스트를 결정 하는 데 적합 한 있기 때문입니다.

CWinApp::OnHelpWinhelp를 다음 순서로 시작 하려고 시도 합니다.

  1. 검사에 대 한 활성 AfxMessageBox 호출 도움말 ID와메시지 상자는 현재 활성화 되어 있으면 메시지 상자에 적절 한 컨텍스트 WinHelp 시작 됩니다.

  2. WM_COMMANDHELP 메시지를 활성 창으로 보냅니다.Winhelp를 시작 하 여 해당 창이 응답 하지 않는 경우 같은 오류 메시지가 다음 해당 창의 상위 메시지를 처리 하거나 현재 창의 최상위 창인지 때까지 보내집니다.

  3. 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 도움말을 요청 하면 활성 창에서 받은 개인 MFC Windows 메시지입니다.창에서이 메시지를 받으면 호출 될 수 있습니다 CWinApp::WinHelp 와 윈도우의 내부 상태와 일치 하는 컨텍스트.

  • lParam
    현재 사용 가능한 도움말 컨텍스트를 포함 합니다.lParam확인 된 도움말 컨텍스트가 없는 경우 0이입니다.구현 하는 OnCommandHelp 에 있는 컨텍스트 ID를 사용할 수 있습니다 lParam 에 다른 컨텍스트를 확인 하거나 바로 전달할 수 있습니다 CWinApp::WinHelp.

  • wParam
    사용 되지 않으며 0 이어야 합니다.

경우는 OnCommandHelp 함수 호출 CWinApp::WinHelp를 반환 합니다 TRUE.반환 TRUE 이 명령은 다른 클래스와 다른 창 라우트가 중지 됩니다.

도움말 모드를 (Shift + F1 도움말)

이 두 번째 폼의 상황에 맞는 도움말입니다.일반적으로이 모드는 SHIFT + F1 키를 누르거나 또는 메뉴 모음을 통해 입력 됩니다.이 명령으로 구현 됩니다 (ID_CONTEXT_HELP).이 명령은 모달 대화 상자는 동안 변환할 메시지 필터 후크 사용 되지 않습니다 또는 메뉴 활성화 되어, 응용 프로그램에서 기본 메시지 펌프를 실행 중일 때 따라서이 명령을 사용자에 게 사용할 수 있습니다 (CWinApp::Run).

이 모드를 입력 한 후에 응용 프로그램이 정상적으로 (예: 창 크기 조정 테두리) 해당 영역에 대 한 자체 커서를 표시 하는 경우에 도움말 마우스 커서는 응용 프로그램의 모든 영역을 통해 표시 됩니다.사용자가 마우스나 키보드를 사용 하 여 명령을 선택할 수 있습니다.명령을 실행 하는 대신 해당 명령에 대 한 도움말 표시 됩니다.또한 사용자가 도구 모음에서 단추와 같은 화면에서 표시 되는 개체가 누르고 해당 개체에 대 한 도움말을 표시할 수 있습니다.이 모드의 도움말에서 제공 CWinApp::OnContextHelp.

이 루프를 실행 하는 동안 모든 키보드 입력 활성 키를 제외 하 고 메뉴에 액세스할 수 없습니다.또한 변환 명령을 여전히 통해 수행 PreTranslateMessage 사용자가 액셀러레이터 키를 누르고 해당 명령에 대 한 도움말을 받을 수 있도록 합니다.

있을 경우 특정 번역 또는 특정 작업 수행에 PreTranslateMessage SHIFT + F1 도움말 모드 중 확인 해야 수행할 않는 함수는 m_bHelpMode 의 구성원 CWinApp 이러한 작업을 수행 하기 전에.CDialog 의 구현을 PreTranslateMessage 호출 하기 전에이 검사 IsDialogMessage, 예를 들어.SHIFT + F1 모드 중 "이동 대화" 키를에서 모덜리스 대화 상자를 사용할 수 없습니다.또한, CWinApp::OnIdle 여전히이 루프 중 이라고 합니다.

명령 메뉴에서 선택할 경우 해당 명령에 대 한 도움말으로 처리 됩니다 (통해 WM_COMMANDHELP, 아래 참조).사용자는 응용 프로그램 창의 표시 영역을 클릭할 경우는 비클라이언트 또는 클라이언트 클릭 여부를 결정이 이루어집니다.OnContextHelp비클라이언트 핸들 매핑을 자동으로 클릭 하 여 클라이언트를 클릭합니다.클라이언트 클릭 이면 다음 보냅니다는 WM_HELPHITTEST 창을 클릭 합니다.창 0이 아닌 값을 반환 하는 경우 해당 값에 대 한 도움말 대 한 컨텍스트로 사용 됩니다.이 0을 반환 하는 경우 OnContextHelp 부모 창 시도 (및 해당 부모 실패 등).도움말 컨텍스트를 확인할 수 없는 경우 기본 보내는 것은 ID_DEFAULT_HELP 명령을 다음 일반적으로 매핑되는 주 창에 CWinApp::OnHelpIndex.

WM_HELPHITTEST

afx_msg LRESULT CWnd::OnHelpHitTest(WPARAM, LPARAM lParam)

WM_HELPHITTEST 활성 창 중 SHIFT + F1 도움말 모드를 클릭 하 여 수신 되는 MFC 개인 windows 메시지입니다.창을이 메시지를 받으면 여 WinHelp DWORD 도움말 ID 사용을 반환 합니다.

  • LOWORD(lParam)
    창의 클라이언트 영역을 기준으로 마우스 클릭 한 위치에 대 한 x 축 장치 좌표를 포함 합니다.

  • HIWORD(lParam)
    y 축 좌표를 포함합니다.

  • wParam
    사용 되지 않으며 0 이어야 합니다.반환 값이 아닌 경우 WinHelp 해당 컨텍스트와 호출 됩니다.반환 값이 0 이면 부모 창에 대 한 도움말 쿼리 됩니다.

대부분의 경우 이미 있을 수 있습니다 적중 테스트 코드를 활용할 수 있습니다.구현을 참조 하십시오. CToolBar::OnHelpHitTest 처리의 예는 WM_HELPHITTEST 메시지 (코드의 단추 및 도구 설명에 사용 하는 적중 테스트 코드를 활용 하 여 CControlBar).

MFC 응용 프로그램 마법사 지원 및 MAKEHM

MFC 응용 프로그램 마법사는 도움말 파일 (.cnt 및.hpj 파일)를 작성 하는 데 필요한 파일이 만들어집니다.Microsoft 도움말 컴파일러에서 승인한 미리 작성 된.rtf 파일이 포함 되어 있습니다.여러 항목의 완료 된 있지만 일부 특정 응용 프로그램을 수정 해야 할 수 있습니다.

"도움말 매핑" 파일 자동 생성 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);

두 경우 모두는 도움말에서 선택적 ID

첫째로, 기본 Nidhelp에 대 한 도움말이이 메시지 상자를 표시 하는 0입니다.(응용 프로그램에서 도움말을 지 원하는 경우)와 같은 메시지 상자가 활성화 되어 있을 때 f1 키를 누를 경우 사용자 도움말을 받을 수 없습니다.이 경우 Nidhelp에 대 한 도움말 ID는 제공 되어야 합니다.

후자의 경우 기본값은 Nidhelp에 대 한 도움말 ID nIDPrompt 같은 것을 나타내는-1입니다.도움말 응용 프로그램의 도움말을 사용할 수 경우에 작동 합니다).메시지 상자 도움말을 지원 했는지 원할 경우 Nidhelp에 대해 0을 제공 해야 합니다.원하는 메시지 도움말 활성화 수 있지만 nIDPrompt 보다는 다른 도움말 ID를 원하는, 단순히 nIDHelp Nidprompt에서 다른 양수 값을 지정 해야 합니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트