12. 도움말 만들기

본장은 본 Part의 마지막 부분이 도움말 만들기 입니다. 이항목은 프로그래밍 항목이라기 보다 유틸리티를 사용하는 부분에 가깝습니다. 그러나 프로그램을 만들때 필수적으로 들어가는 내용입니다. 유틸리티에 가깝다는 것은 이론 보다는 워드프로세서 사용법이나 도움말 컴파일하는 법등을 설명하는 쪽이 많다는 것입니다.

윈도우에서 인정받는 부분이 바로 WinHelp입니다. 어느곳에서든지 어느 항목에서든지 모르면 도움말을 사용하여 바로바로 궁금한 점을 해결할 수 있다는 것이죠. 필자가 윈도 프로그램을 할 때 함수를 모두 외우고 하지는 않습니다. 그렇다고 옆에 책을 가득 쌓아 놓고 프로그램하지도 않습니다. 다만 함수를 모르거나 새로운 부분을 알고 싶을 때는 Developer Studio에서 도움말을 검색하여 이해합니다.

사실 Developer Studio의 Help만 가지고도 충분히 윈도 프로그램을 배울 수 있다고 봅니다. 그만큼 강력하게 많은 내용을 다루었기 때문이죠.

요즘 많은 상업용 프로그램들이 강력한 도움말을 수반합니다. 얼마나 많은 도움말을 가지고 있느냐가 프로그램의 기능이 얼마나 많으냐보다 사용자에게 더 많이 어필하기 때문이죠.

대상자: 초급

Chapter 등급: 필수

공부방법:

그냥 마음 편하게 가지면서 읽어보시면 될것 같습니다.

1.MS-WORD를 이용하여 HELP 프로그램 만들기

MS-WORD를 실행시키고 새로운 텍스트를 설정합니다. 기존에 있는 RTF 파일을 검색하려면 Ex111에 있는 Debug 안의 Ex111.RTF 파일을 열어 보면 됩니다.

<1>타이틀 만들기

타이틀은 □도움말 만들기 예제□라고 화면 상단에 씁니다. 다음 이 도움말 예제의 ID를 설정합니다. 즉 HELP 파일을 열어서 각 항목을 검색하기 위해서는 항목마다 ID가 부과됩니다.

실질적으로 ID 첫 단어는 HID를 이용합니다. 처음 예제는 ID라는 개념을 정확하게 알게 하기 위하여 HELP라는 단어를 이용했습니다.

□도움말 만들기 예제□ 앞에 커서를 위치하고 □삽입□ 메뉴에서 □각주□를 선택하면 그림 1-12-1과 같은 항목이 나옵니다. 이 때 사용자 정의로 설정한 후 사용자 정의란에 □#□키를 넣으면 □도움말 만들기 예제□가 □#도움말 만들기 예제□로 변하면서 밑에 각주창이 뜹니다. 각주로 □#□ 표시를 하는 것은 현 항목의 ID를 설정하는 것입니다. 밑의 각주창에 □#□ 글자가 나오면서 옆에 각주를 표시할 단어를 넣으라고 커서가 이동해 있습니다.

(그림 1-12-1)각주 넣기

이곳에 현재 항목의 아이디를 설정해야 합니다. 본 예제에서는 ID를 HELP_EXAM으로 설정했습니다.

또한 현재 항목의 제목을 설정해야 합니다. 커서를 각주 윈도가 아닌 메인윈도의 "#" 다음으로 이동한 다음 □삽입□ 항목에서 □각주□를 선택하고 사용자 정의에 □$□ 값을 설정합니다. 마찬가지로 각주 윈도에 □$□ 항목이 뜨겠지요. 그 문자 다음에 제목을 넣습니다. 본 예제에서는 □도움말 만들기 예제□라는 제목을 설정했습니다. 현재 상태가 그림 1-12-2와 같습니다.

(그림 1-12-2)도움말 제목 설정

<2>항목 만들기

도움말에는 각각의 항목이 필요합니다. 즉 도움말을 실행시키면 처음에는 항목이 나타나지요. 그리고 각 항목을 클릭하면 그에 따르는 도움말이 나타나고요. 이 항목을 만들어야 합니다. 각 항목마다 ID를 연결시켜 주어야 합니다. 연결하는 방법은 제목 바로 옆에 아이디를 설정해 주고 다음 그 글자를 감추기 형태로 표시하면 됩니다.

본 예제에서 항목은 3개입니다.

① 도움말 만드는 법

② 도움말 사용법

② 프로그램 연결

위 3개의 항목은 그림 1-12-3과 같이 표시합니다.

(그림 1-12-3)각 항목 설정하기

각 항목마다 현재 항목을 클릭했을 때 도움말이 어떻게 나타날 것인가를 설정해 주어야 합니다. 글자 중앙에 라인을 긋는 □취소선□ 형태이면 윈도가 바뀌면서 현재 설정한 도움말이 나오고 □밑줄□이면 현재 윈도에 작은 박스가 나타나면서 도움말이 나옵니다. 많은 양의 도움말이 아닐 경우에는 □밑줄□을 선택하고 많은 양의 도움말이나 또다른 항목의 리스트이면 □취소선□ 형태가 좋습니다. 현재 글자를 밑줄글자나 취소선 글자로 변형하는 방법은 현재 글자를 마우스로 설정하여 반전시킨 다음 서식에서 글꼴을 설정하여 변경시키면 됩니다.

본 예제에서는 도움말 만드는 법과 프로그램 연결 항목은 새로운 윈도로, 도움말 사용법은 작은 창으로 설정했습니다. 설정된 형태는 그림 1-12-4와 같습니다.

이제 항목과 연결되는 ID를 감추어야 합니다. 그림 1-12-4에서 보듯이 HELP_MAKE, HELP_USE, HELP_CONECT 항목이 화면에서 보이지 않게 글자들을 설정한 후 서식에서 글꼴을 선택하고 글자 속성을 □숨김□으로 선택하여 모든 글자를 감추게 합니다.

이제 각 항목마다 도움말 내용을 넣어야 합니다. 현재 상태에서 Ctrl+Enter키를 누르면 쪽 구분이 되어 페이지가 나누어집니다.

이제 새로운 페이지에 새로운 데이터를 넣어야 한다는 것입니다.

(그림 1-12-4) 항목에 취소선 및 밑출 넣기

쪽 구분으로 다음 페이지를 만들고 도움말 만드는 법을 클릭했을 때 출력되는 데이터를 기록합니다.

□도움말 만드는법

도움말 만드는 법은 이것입니다.

다음 다시 Ctrl+Enter키를 누르고 도움말 사용법을 클릭했을 때 출력되는 데이터를 기록합니다.

□도움말 사용법

도움말 사용법은 여기에 있습니다.

다시 Ctrl+Enter키로 페이지를 나눈 다음 프로그램 연결 항목을 클릭했을 때 출력되는 데이터를 기록합니다.

□프로그램 연결

프로그램 연결은 여기에 있습니다.

이제 각 항목마다 각주를 이용하여 ID와 제목을 설정하고 각주 □K□를 새로 기록하여 키워드를 기록합니다. 지금까지의 내용은 그림 1-12-5와 같습니다.

이와 같이 하면 도움말 예제는 다 만든 게 됩니다. 간단하게 이야기하면 한 페이지당 화면에 출력할 항목을 나타내고, 각 페이지의 도움말 아이디를 각주 □#□를 이용해서 설정하고, 각주 □$□를 이용하여 각 도움말의 제목을 설정하고, 각주 □K□를 이용하여 키워드를 설정하는 것입니다. 키워드는 나중에 도움말 찾기에서 활용됩니다.

본 데이터를 Ex111.rtf로 저장합니다. 저장 방식은 RTF를 설정하는 것 잊지 마시고요.

(그림 1-12-5)도움말 만들기 예제용 Ex111.RTF

<3>HELP 프로젝트 만들기

이제 텍스트 편집기를 이용하여 또다른 파일을 만듭니다. 파일에는 다음과 같이 기록합니다.

[OPTIONS]

CONTENTS=HELP_EXAM

TITLE=도움말 만들기

COMPRESS=true

WARING=2

[MAP]

HELP_EXAM 101

[FILES]

Ex111.rtf

위와 같이 만든 다음 본 데이터를 Ex111.hpj로 설정합니다. 각각의 항목에 대해서 설명하겠습니다.

[OPTIONS]

CONTENTS=HELP_EXAM //현재 도움말의 최초 ID는 HELP_EXAM이다.

TITLE=도움말 만들기 //현재 도움말 윈도 타이틀은 도움말 만들기이다.

COMPRESS=true//압축 유무

WARING=2//경고 표시

[MAP]

HELP_EXAM 101

HELP_EXAM을 숫자로 표시하여 101이라는 뜻입니다. 이렇게 해두면 나중에 프로그램에서

#define HELP_EXAM 101

하고 WinHelp(HELP_EXAM);라고 실행하면 본 도움말이 나타납니다. 이 도움말 내용을 담은 파일이 바로 Ex111.rtf라는 것이죠. Visual C++에서 제공하는  Help Workshop을 실행시키고 Ex111.rtf를 로드하고 컴파일하면 Ex111.hlp 파일이 생성됩니다. File 메뉴에서 Run WinHelp 항목을 실행시키면  도움말이 그림 1-12-6과 같이 나타납니다.

(그림 1-12-6)EX111.hlp 실행 결과

윈도 98에서 도움말이 트리 구조 형태로 나오는 것을 본 적 있을 것입니다. 그림 1-12-7과 같이 말입니다. 이렇게 만드는 방법은 hpj 파일을 만들어서 컴파일하는 것이 아니라 cnt 파일을 만들어서 컴파일하는 것입니다.

Ex111.cnt라는 파일에 아래와 같이 기록한 다음  Micorsoft Help Workshop을 이용하여 컴파일하면 그림 1-12-7과 같은 형태의 도움말 파일을 만들 수 있습니다.

:Base Ex111.hlp

1 도움말 만들기

2 도움말 만드는 법=HELP_MAKE

3 도움말 사용법=HELP_USE

4 프로그램 연결=HELP_CONECT

<Ex111.cnt 트리 구조용 도움말 파일 만드는 프로젝트

(그림 1-12-7)트리구조의 도우말 파일

<4> 도움말 예제 Ex111 프로그램

이제 Ex111.hlp를 실질적으로 프로그램에서 불러오는 Ex111 프로그램으로 제작하겠습니다. 이 프로그램은 프로젝트 제작시 AppWizard의 step 4에서 context sensitive help를 체크해야 합니다. 이렇게 하면 hlp 디렉토리가 만들어지고 기본적인 Ex111hlp 파일이 만들어집니다. 그러나 이 help 파일을 이용하지 않고 우리가 만든 Ex111.hlp를 이용합니다.

context sensitive help를 체크하지 않고 메뉴판에서 항목을 수정하여 도움말을 불러올 수도 있습니다.

(1)메뉴판 설정

Resource Edit를 이용하여 메뉴를 수정합니다. 메뉴에서 Help 항목은 다음과 같이 수정합니다.

제목	ID
도움말 도움말 항목 온라인 도움말 도움말 찾기	IDM_HELP_INDEX IDM_HELP_FINDER IDM_ONLINE_HELP IDM_SEEK_HELP

도움말을 선택했을 경우에는 단지 그림 1-12-6과 같은 단순한 도움말이 나옵니다.

도움말 항목을 선택하면 그림 1-12-7과 같은 트리 구조의 도움말이 나오게 되고 온라인 도움말을 선택하면 윈도 안에 색인된 모든 도움말이 나오게 됩니다. 도움말 찾기란 어떤 특정한 스트링을 이용하여 이 문자열이 도움말에 있으면 나타납니다. MS-WORD의 각주 □K□에 설정된 키워드를 찾게 되는 것이죠.

(2)프로그램과의 연결

Ex111 프로젝트에서 resourse.h를 열고 다음과 같은 내용을 삽입합니다.

#define HELP_EXAM                       101

위의 hpj 파일에 [MAP]와 같이 이 곳에서도 HELP_EXAM을 101로 설정합니다.

이렇게 함으로써 현재 도움말 파일에서 ID를 찾아가게 됩니다.

이제 각 항목마다 WinHelp 함수를 이용하여 메뉴를 선택했을 때 도움말을 호출합니다.

도움말 메뉴를 선택했을 때 실행하는 내용

WinHelp(0L,HELP_INDEX);

위와 같이 하면 그림 1-12-6과 같은 단순한 help가 나타납니다.

도움말 항목을 선택했을 때 실행하는 내용

WinHelp(0L,HELP_FINDER);

즉 트리 구조의 도움말 파일을 출력할 때 사용하는 함수입니다.

온라인 도움말 메뉴를 선택했을 때 실행하는 내용

WinHelp(0L,HELP_HELPONHELP);

윈도 안에 색인된 모든 도움말이 나오게 됩니다.

도움말 찾기 메뉴를 선택했을 때 실행하는 내용

CString szTemp("도움말");//키워드를 설정한 다음

//키워드를 찾아서 도움말을 실행시키라는 내용

AfxGetApp()->WinHelp((DWORD)(LPCSTR)szTemp,HELP_KEY);

이제 프로그램을 컴파일한 후 각 항목을 클릭하면 도움말이 나타날 것입니다.

Ex111.exe 프로그램을 실행했을 때의 모습은 그림 1-12-8과 같습니다.

프로그램을 컴파일한후에 Help Workshop 프로그램으로 컴파일하여 생성된 hlp파일을 덮어 씌어야 합니다. 그렇지 않으면 AppWizard에서 자동으로 만들어진 hlp파일에 의한 도움말이 나올것입니다.

이제 프로그램을 컴파일한 후 각 항목을 클릭하면 도움말이 나타날 것입니다.

Ex111.exe 프로그램을 실행했을 때의 모습은 그림 1-12-8과 같습니다.

(그림 1-12-8)Ex111.exe 실행 모습

2.항목과 연결되는 도움말

Ex1112 프로그램에서는 AppWizard를 이용하여 step 4에서 context sensitive help를 체크하면 자동적으로 hlp 디렉토리에 Ex1112.hlp 파일을 만들 수 있는 hpj,rtf,cnf 등과 기본적인 도음말의 내용을 만들어 줍니다.

프로그램을 컴파일하고 실행시킨 후에 도구 바에서      버튼을 클릭하면 마우스 커서가 화살표와 함께 □?□을 수반한 형태로 변화됩니다. 이 상태에서 모르는 항목의 도구바를 클릭하거나 메뉴를 클릭하면 그 항목의 사용법에 대한 도움말이 나타납니다.

즉 각 항목별로 도움말을 찾아보는 것이죠. 예를 든다면 File 메뉴에서 Open이

란 메뉴의 사용법을 모른다면      버튼을 클릭한 후에 File 메뉴에서 Open 메뉴를 클릭하면 Open에 대한 내용만 나오게 됩니다.

이렇게 각 항목과 도움말을 연결시키는 방법은 ID의 연결입니다. File 메뉴에서 Open 메뉴의 ID는 ID_FILE_OPEN입니다.

이 때 이 항목의 도움말의 ID는 앞에 H를 넣은 HID_FILE_OPEN이라고 설정해 주면 프로그램에서는 HID_FILE_OPEN 도움말 항목을 불러오게 됩니다. 즉 프로그램에서 설정된 ID 앞에 H를 넣은 ID로 도움말 파일을 작성하면 그 항목과 같은 도움말이 있으면 그 항목의 도움말이 실행됩니다.

그런데 만일 Open이란 항목과 Save란 항목이 같은 도움말을 사용할 경우에는 어떻게 할까요? 서로 ID가 다른데 또하나의 항목을 만들어야 할까요? 그렇지 않습니다. HPJ 파일을 열어 보면 [ALIAS]란 항목이 있고 내용은 다음과 같습니다.

[ALIAS]

HIDR_MAINFRAME = main_index

HIDD_ABOUTBOX = HID_APP_ABOUT

HID_HT_SIZE = HID_SC_SIZE

HID_HT_HSCROLL = scrollbars

HID_HT_VSCROLL = scrollbars

HID_HT_MINBUTTON = HID_SC_MINIMIZE

HID_HT_MAXBUTTON = HID_SC_MAXIMIZE

AFX_HIDP_INVALID_FILENAME         = AFX_HIDP_default

AFX_HIDP_FAILED_TO_OPEN_DOC       = AFX_HIDP_default

AFX_HIDP_FAILED_TO_SAVE_DOC       = AFX_HIDP_default

AFX_HIDP_ASK_TO_SAVE              = AFX_HIDP_default

AFX_HIDP_FAILED_TO_CREATE_DOC     = AFX_HIDP_default

AFX_HIDP_FILE_TOO_LARGE           = AFX_HIDP_default

AFX_HIDP_FAILED_TO_START_PRINT    = AFX_HIDP_default

AFX_HIDP_FAILED_TO_LAUNCH_HELP    = AFX_HIDP_default

AFX_HIDP_INTERNAL_FAILURE         = AFX_HIDP_default

AFX_HIDP_COMMAND_FAILURE          = AFX_HIDP_default

AFX_HIDP_PARSE_INT                = AFX_HIDP_default

AFX_HIDP_PARSE_REAL               = AFX_HIDP_default

AFX_HIDP_PARSE_INT_RANGE          = AFX_HIDP_default

AFX_HIDP_PARSE_REAL_RANGE         = AFX_HIDP_default

AFX_HIDP_PARSE_STRING_SIZE        = AFX_HIDP_default

AFX_HIDP_FAILED_INVALID_FORMAT    = AFX_HIDP_default

AFX_HIDP_FAILED_INVALID_PATH      = AFX_HIDP_default

AFX_HIDP_FAILED_DISK_FULL         = AFX_HIDP_default

AFX_HIDP_FAILED_ACCESS_READ       = AFX_HIDP_default

AFX_HIDP_FAILED_ACCESS_WRITE      = AFX_HIDP_default

AFX_HIDP_FAILED_IO_ERROR_READ     = AFX_HIDP_default

AFX_HIDP_FAILED_IO_ERROR_WRITE    = AFX_HIDP_default

AFX_HIDP_STATIC_OBJECT            = AFX_HIDP_default

AFX_HIDP_FAILED_TO_CONNECT        = AFX_HIDP_default

AFX_HIDP_SERVER_BUSY              = AFX_HIDP_default

AFX_HIDP_BAD_VERB                 = AFX_HIDP_default

AFX_HIDP_FAILED_MEMORY_ALLOC      = AFX_HIDP_default

AFX_HIDP_FAILED_TO_NOTIFY         = AFX_HIDP_default

AFX_HIDP_FAILED_TO_LAUNCH         = AFX_HIDP_default

AFX_HIDP_ASK_TO_UPDATE            = AFX_HIDP_default

AFX_HIDP_FAILED_TO_UPDATE         = AFX_HIDP_default

AFX_HIDP_FAILED_TO_REGISTER       = AFX_HIDP_default

AFX_HIDP_FAILED_TO_AUTO_REGISTER  = AFX_HIDP_default

[ALIAS]란 가명을 이야기합니다. ID_FILE_OPEN과 ID_FILE_SAVE가 같은 항목을 사용한다면 HID_FILE_SAVE=HID_FILE_OPEN이라고 설정하여 HID_FILE_S- AVE는 HID_FILE_OPEN의 가명으로 설정합니다. 결국 HID_FILE_SAVE 항목의 도움말은 HID_FILE_OPEN 도움말 항목을 같이 사용하는 것입니다. 본 도움말 예제 Ex1112는 Wizard에서 제공해 준 afxcore.rtf,afxprint.rt를 수정했습니다.

(잔소리)

길고 장황한 PART1이 이제 종료가 되었습니다. 본 PART1만 이해하셔도 프로그램을 작성하는데 어려움이 없습니다. 본장까지 공부하셨다면 필자의 생각에는 이제 하나의 프로그램을 정하고 직접 작성해 가는것이 좋을듯합니다. 다은 PART 부터는 프로그래밍 테크닉입니다. 테크닉이란 실전에서 사용할때 빠르게 배울수 있습니다. 그냥 책나두고 예제 작성하듯 해가면 별로 늘지 않습니다. 본 PART 까지가 윈도우 프로그래밍의 기본 이론을 배우게 된것이기 때문에 다음 PART 부터는 두서없이 필요한 부분 먼저 보면서 프로그래밍 해나나가는 것이좋습니다.

필자가 프로그래밍을 할때는 기본 이론을 배워 놓고는 하나의 프로그램을 정해 놓고 그것을 작성할려고 도전하는 방법을 이용했습니다. 그렇게 하니까 몇가지 모르는 테크닉 이라는 장벽이 있더군요. 이때 그부분만 책을 뒤져 보고 그내용만 이해하고 바로 프로그램에 적용했습니다.

사실 어느세월에 본책 다읽고 프로그래밍 합니까? 그러다가 프로그램 한번 해보지도 못하고 세월만 흐를지도 모릅니다. 필자가 본책을 쓴목적은 필자의 책을가지고 줄그으면서 공부하라는 것이 아닙니다. 프로그램 작성하다가 □음 이부분을 어떻게 하지□ 하고 책을 찾아보고,예제를 본다음, 필요한 부분만 그대로 따라해가지고 구현을 한다음 결과가 나오면 □아하 이렇게 하는구나□ 하고 테크닉을 배우면서 나가시라는의미입니다. 다시 말씀드리지만 Visual C++ 에는 이론적 배경이 없습니다.

구현방법또한 무수하게 많습니다. 어느것이 정도가 아닙니다. 결과가 나오면 장땡입니다. 중요한것은 기존에 있는 라이브러리를 이용하여 빠르게 프로그래밍 하면서 자신만의 알고리듬을 구축하는것입니다. 그것이 어쩌면 프로그래머의 밥줄일수도 있습니다. 자신만의 알고리듬을 구축하지 못하고 남의 라이브러리만 죽어라고 이용하면서 수년을 눈물젖은 커피를 마시면서 시간을 허비하고, 나중에 후회하는 필자처럼 되지 않기를 바라는 마음입니다.

(잔소리 끝)