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

이 노트에서는 도움말 컨텍스트 Id (즉, 항목 번호) 및 MFC 2.0에서는 기타 도움말 문제를 할당 하는 규칙을 설명 합니다. 문맥 인식 도움말 지원 필요 Visual c + + Professional에서 사용할 수 있는 도움말 컴파일러。

도움말 지원 유형

Windows 응용 프로그램에서 구현 하는 상황에 맞는 도움말의 두 종류가 있습니다. 첫 번째, 이라고 Winhelp를 적절 한 컨텍스트에 현재 활성 개체를 기반으로 시작 하는 것을 포함 "F1 도움말" 합니다. 두 번째 SHIFT + F1 모드입니다. 이 모드에서 마우스 커서 변경 (한 조합 화살표 + 물음표) 도움말 커서 및 사용자 개체에 도움과 같은 것 이라고 그들은 클릭. 그 시점에서 WinHelp 사용자 클릭 한 개체에 대 한 도움말을 주고 시작 됩니다.

Microsoft Foundation classes 모두 이러한 형태의 도움말을 구현합니다. 또한, 프레임 워크 지원 도움말 색인을 사용 하는 데 도움이 두 개의 간단한 도움말 명령。

도움말 파일

Microsoft Foundation classes 단일 도움말 파일로 가정합니다. 도움말 파일 이름과 경로 응용 프로그램으로 같은 있어야 (.EXE-gt;입니다.HLP)(&G)。

이것은 사용자가 원하는 경우 변경할 수 있는 m_pszHelpFilePath 라는 공용 CWinApp 멤버 변수。

도움말 컨텍스트 범위

0x00000000-0x0000FFFF: 사용자 정의

0x00010000-0x0001FFFF: 명령 (메뉴/명령 단추)

nbsp;??0X00010000 + ID_(&N)

nbsp;??(참고: 0x18000-> 0x1FFFF 이후 명령 Id는 실제 범위는 > 0x8000 =)

0x00020000-0x0002FFFF: 창 및 대화 상자

nbsp;??0X00020000 + IDR_(&N)

nbsp;??(참고: 여기서-> 0x27FFF 때문에 IDRs 실용적인 범위는 < = 0x7FFF)

0x00030000-0x0003FFFF: 오류 메시지 (오류 문자열 ID 기준)

nbsp;??0X00030000 + IDP_(&N)

0x00040000-0x0004FFFF: 특수 목적 (비클라이언트 영역)

nbsp;??0x00040000 + HitTest 영역(&N)

0x00050000-0x0005FFFF: 컨트롤 (되지 않는 명령)

nbsp;??0X00040000 + IDW_(&N)

이러한 규칙은 Microsoft Foundation 클래스의 기본 구현에 하드 코딩 합니다. 다양 한 도움말 관련 멤버 함수의 다른 구현을 제공 하 여 무시할 수 있습니다.

간단한 "도움말" 명령

거기에 두 개의 간단한 도움말 명령을 Microsoft Foundation 클래스에 의해 구현 되는:

이 두 명령은 단순히 응용 프로그램에 대 한 도움말 색인을 표시 하 고 각각 WinHelp 프로그램을 사용 하 여 사용자 도움말 표시。

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

이 상황에 맞는 도움말 (F1 도움말로 보통 이라고 함)의 첫 형태입니다. 손을 작업 (활성 창 또는 메뉴 항목)에 대 한 도움말을 보려면 f1 키를 누를. 특별 한 "도움말 모드" 참여。

일반적으로 F1 키 주 창 액셀러레이터 키 테이블에 삽입 된 가속기에 의해 ID_HELP 의 ID와 명령 변환 됩니다. ID_HELP 명령 또한 주 창 또는 대화 상자에서 ID_HELP 의 ID와 버튼에 의해 생성 될 수 있습니다. 또한 메뉴나 대화 상자가 활성화 되어 f1 키를 누를 때 키가 ID_HELP 명령으로 변환할 하드 코딩。

그러나 ID_HELP 명령을 생성 하는 그것 라우팅되는 일반 명령으로 명령 처리기 (에 대 한 자세한 내용은 Microsoft Foundation 클래스 명령 라우팅 아키텍처에 참조 기술 노트 21.)에 도달할 때까지 응용 프로그램 도움말 활성화 된 경우에 ID_HELP 명령은 CWinApp::OnHelp 함수에 의해 처리 됩니다. 때문에 가장 구체적인 컨텍스트를 결정 하는 데 적합 하지 않습니다 기본 명령 라우팅을 명령은 항상 application 개체에 라우팅됩니다 대신 하 고 도움에 대 한 사용자 지정 경로 거쳐。

CWinApp::OnHelp 다음 순서로 WinHelp 시작 하려고

  1. 도움말 id 활성 AfxMessageBox 호출에 대 한 검사 WinHelp 컨텍스트는 메시지 상자에 적절 한와 함께 시작 메시지 상자가 현재 활성화 된 경우。

  2. 메시지 상자가 활성화 된 경우 CWinApp::OnHelp WM_COMMANDHELP (Microsoft Foundation classes에 개인 메시지) 활성 창에 보냅니다. 때까지 메시지를 처리 하는 또는 현재 창의 최상위 창에는 창 Winhelp를 실행 하 여 응답 하지 않으면, 해당 창의 부모에 동일한 메시지가 보내집니다 다음 (그리고 따라서 부모 창 없는)。

  3. 메시지가 처리 되지 않은 남아, 기본 도움말 호출 됩니다. 이것은 메인 윈도우에 ID_DEFAULT_HELP 명령을 전송 하 여 이루어집니다. 이 명령은 일반적으로 매핑되어 CWinApp::OnHelpIndex。

ID 기준 값 (0x10000 명령, 대화 상자와 같은 리소스에 대 한 여기서)을 전체적으로 재정의 하려면 응용 프로그램 CWinApp::WinHelp을 재정의 해야 합니다. 사실 이렇게 스스로 ClassWizard 및 AppWizard 응용 프로그램의 구현에서 예를 들어, 모두 단일 도움말 파일을 공유 하므로。

도움말 컨텍스트 결정 방법 및이 기능을 무시 하려면 응용 프로그램 (아래 참조) WM_COMMANDHELP 메시지를 처리 해야 합니다. 좀 더 구체적인 도움이 라우팅 프레임 워크를 제공, 보다만 현재 MDI 자식 창으로 깊은를 제공 하실 수 있습니다. 또는 특정 창이 나 대화 상자-아마도 그 개체 또는 대화 상자 내의 활성 컨트롤의 현재 내부 상태에 기반에 대 한 좀 더 구체적인 도움을 제공 하고자。

WM_COMMANDHELP

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

WM_COMMANDHELP MFC 개인 Windows 메시지 도움말을 요청할 때 활성 창의 받은입니다. 창이이 메시지를 받으면 그것은 윈도우의 내부 상태와 일치 하는 컨텍스트 CWinApp::WinHelp 호출。

lParam

현재 사용할 수 있는 도움말 컨텍스트를 포함합니다. lParam 0 이면 도움말 컨텍스트가 없는 아직 결정 되었습니다. OnCommandHelp 의 구현 "더 나은" 컨텍스트를 확인 하려면 Lparam에 컨텍스트 ID를 사용할 수 있습니다 또는 CWinApp::WinHelp 전달 그냥 수 있습니다.

wParam

사용 되지 않으며 0이 될 것입니다。

OnCommandHelp 함수는 CWinApp::WinHelp를 호출 하는 경우 TRUE를 반환 해야 합니다. 이 명령은 다른 클래스 (기본 클래스)와 다른 창 라우팅 진정한 중지를 반환。

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

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

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

이 루프를 실행 하는 동안 모든 키보드 입력 메뉴에 액세스 하는 키에 대 한 제외 하 고 활성화 되어 있지 않습니다. 또한, 명령 번역 여전히 사용자가 바로 가기 키를 눌러 해당 명령에 대 한 도움을 받을 수 있도록 하려면 PreTranslateMessage 를 통해 수행。

특정 번역 또는 SHIFT + F1 도움말 모드 동안 장소 걸리지 PreTranslateMessage 함수에서 일어나는 작업이 있는 경우 이러한 작업을 수행 하기 전에 CWinApp 의 m_bHelpMode 멤버를 확인 해야 합니다. PreTranslateMessage CDialog 구현 예 IsDialogMessage를 호출 하기 전에이 확인 합니다. 이 SHIFT + F1 모드 동안 모덜리스 대화 상자에 "대화 탐색" 키를 비활성화합니다. 또한 CWinApp::OnIdle 여전히이 루프 동안 호출。

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

WM_HELPHITTEST

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

WM_HELPHITTEST 활성 창 중 SHIFT + F1 도움말 모드를 클릭 하 여 받은 MFC 개인 windows 메시지입니다. Winhelp에 의해 사용에 대 한 DWORD 도움말 ID를 반환 창이이 메시지를 받으면。

LOWORD(lParam)

창의 클라이언트 영역을 기준으로 마우스 클릭 어디 축 장치 좌표를 포함。

HIWORD(lParam)

y 축 좌표를 포함합니다.

wParam

사용 되지 않으며 0이 될 것입니다. 반환 값이 0이 아닌 경우 WinHelp 그 컨텍스트와 함께 호출 됩니다. 부모 창의 도움말을 쿼리 하는 경우 반환 값이 0 인 경우。

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

MFC AppWizard 지원 및 MAKEHM

AppWizard 도움말 파일 (.cnt 및.hpj 파일)를 구축 하는 데 필요한 파일을 만듭니다. 또한 미리 수가 포함 되어있습니다.Microsoft 도움말 컴파일러에 의해 허용 되는 RTF 파일. 항목의 대부분은 완전 한, 하지만 일부 특정 응용 프로그램에 대 한 수정 해야 할 수 있습니다.

"매핑 도움말" 파일의 자동 생성은 라는 MAKEHM 유틸리티에서 지원 됩니다. MAKEHM 유틸리티는 응용 프로그램의 리소스를 번역할 수 있습니다.H 파일을 도움말 매핑 파일입니다. 예를 들어:

# define IDD_MY_DIALOGnbsp;? 2000
# define ID_MY_COMMAND 150(&N)

로 번역:

HIDD_MY_DIALOGnbsp;?? 0x207d0
HID_MY_COMMAND 0X10096(&N)

이 형식은 항목 이름 (왼쪽에 기호)와 함께 컨텍스트 Id (오른쪽에 있는 숫자)을 매핑하는 도움말 컴파일러의 설비와 호환。

MAKEHM의 소스 코드는 MFC 프로그래밍 Utilties 샘플에서 사용할 수 있는 MAKEHM。

Appwizard를 실행 한 후 추가 도움말 지원

응용 프로그램에 도움말을 추가 하는 가장 좋은 방법은 응용 프로그램을 만들기 전에 마법사의 옵션 대화 상자에서 "컨텍스트 구분 도움말" 옵션을 확인 하는 것입니다. 그런 식으로 AppWizard 도움말을 지원 하도록 CWinApp 파생 클래스에 필요한 메시지 맵 항목을 자동으로 추가。

도움말 지원 없이 응용 프로그램을 이미 만든 지금은 그것을 추가 하고자 하는 경우 Visual c + + 프로그래머 가이드 를 참조 하십시오.

메시지 상자에 대 한 도움말

(경고 라고도 함) 메시지 상자에 도움말 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의 기본값은-1 나타냅니다 도움말 ID Nidprompt와 같습니다. 도움말 작동 응용 프로그램은 도움말 사용 하는 경우에). 메시지 상자 도움말 지원 해야 하는 것이 원하는 경우 Nidhelp에 대 한 0을 제공 해야 합니다. 도움말을 사용 하지만 nIDPrompt 보다 다른 도움말 ID 욕망, nIDHelp Nidprompt의 다른 양수 값을 제공 하기만 하면 메시지를 원하는 해야。

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index