. 컨트롤 검증

ApiEdit가 과연 제대로 컨트롤이 되었는지 간단한 호스트 프로젝트를 만들어서 테스트해보도록 하자. 여기서 만들어 볼 테스트 프로젝트는 논술 고사 프로그램인데 서론, 본론, 결론 세 개의 텍스트 필드를 가진다. 컨트롤이 잘 만들어지고 또 서로 방해없이 잘 동작하는지만 테스트해 볼 것이다.

NonSool이라는 이름으로 빈 프로젝트를 생성한다. ApiEdit.cpp, ApiEdit.h, *.cur 파일을 이 프로젝트로 복사해 오고 소스파일은 프로젝트에 포함시킨다. imm32.lib도 물론 링크시켜야 한다. NonSool.rc 파일을 추가하고 대화상자를 만들어 다음과 같이 디자인하였다.

세 개의 스태틱 컨트롤을 배치했는데 각각 IDC_S1, IDC_S2, IDC_S3 ID를 주었으며 IDOK 버튼의 캡션은 닫기로 변경하였다. 컨트롤의 위치는 실행중에 조정되므로 아무 곳에나 두어도 상관없다. 대화상자의 캡션은 논술 고사로 바꾸고 대화상자의 스타일을 약간 조정한다. 오버랩드 형태로 만들어 크기 조정이 가능하도록 했으며 WS_CLIPCHILDREN 스타일을 주어 차일드 영역은 그리기에서 제외하였다.

커서 리소스를 추가하기 위해 RC 파일을 열어 세 개의 커서 정의문을 복사해 붙인다. NonSool.cpp는 다음과 같이 작성한다.

 

#include <windows.h>

#include "resource.h"

#include "ApiEdit.h"

 

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam);

HINSTANCE g_hInst;

HWND hDlgMain;

CApiEdit h1, h2, h3;

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

     ,LPSTR lpszCmdParam,int nCmdShow)

{

     g_hInst=hInstance;

    

     DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP, MainDlgProc);

    

     return 0;

}

 

BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     switch(iMessage)

     {

     case WM_INITDIALOG:

          hDlgMain = hDlg;

          h1.Create(0,0,0,0,WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,100,hDlg);

          h2.Create(0,0,0,0,WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,101,hDlg);

          h3.Create(0,0,0,0,WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,102,hDlg);

          SetFocus(h1.hWnd);

          return FALSE;

     case WM_SIZE:

          int gap;

          gap=(HIWORD(lParam)-40)/3;

 

          MoveWindow(GetDlgItem(hDlg,IDC_S1),10,10,80,20,TRUE);

          MoveWindow(h1.hWnd,100,10,LOWORD(lParam)-110,gap-5,TRUE);

 

          MoveWindow(GetDlgItem(hDlg,IDC_S2),10,10+gap,80,20,TRUE);

          MoveWindow(h2.hWnd,100,10+gap,LOWORD(lParam)-110,gap-5,TRUE);

 

          MoveWindow(GetDlgItem(hDlg,IDC_S3),10,10+gap*2,80,20,TRUE);

          MoveWindow(h3.hWnd,100,10+gap*2,LOWORD(lParam)-110,gap-5,TRUE);

 

          MoveWindow(GetDlgItem(hDlg,IDOK),LOWORD(lParam)-100,HIWORD(lParam)-30,90,25,TRUE);

          return TRUE;

     case WM_COMMAND:

          switch (LOWORD(wParam))

          {

          case IDOK:

          case IDCANCEL:

              EndDialog(hDlg,0);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

세 개의 ApiEdit를 생성하여 WM_CREATE에서 세 개의 ApiEdit 윈도우를 만들었으며 첫 번째 컨트롤에 포커스를 주었다. WM_SIZE에서 컨트롤의 위치를 적당히 배치하므로 생성할 때의 위치와 크기는 모두 0으로 줘도 상관없다. 실행중의 모습은 다음과 같다.

별 이상없이 프로젝트가 만들어졌으며 ApiEdit는 독립된 컨트롤로 잘 동작한다. 탭키로 컨트롤 사이를 이동하도록 하고 싶으면 CApiEdit::OnCreate에서 bWantTab FALSE로 변경하면 된다. 실행중에 이 속성을 변경할 수 있어야 하는데 ApiEdit는 아직 그런 인터페이스는 제공하지 않는다. 다음 장부터 호스트를 위한 프로그래밍 인터페이스를 작성하게 될 것이다.