. 상태란에 컨트롤 넣기

상태란은 정보를 보여 주기 위한 장치인데 주로 문자열 중심의 정보만 보여 준다. 오너 드로우 파트를 사용하면 그래픽 정보를 보여 줄 수 있지만 부모 윈도우가 직접 그려 주어야 하므로 번거로운 면이 있다. 상태란에 차일드 컨트롤을 생성하면 좀 더 복잡한 모양의 정보를 보여줄 수 있는데 작업 상태를 보여주는 프로그래스 컨트롤이 상태란에 가장 잘 어울리는 컨트롤이다.

방법은 아주 간단하다. 상태란의 차일드로 프로그래스 컨트롤을 만들고 부모 윈도우는 이 컨트롤에 작업 진행 과정을 보여 주면 된다. SB_GETRECT 메시지를 사용하면 파트 하나의 영역을 구할 수 있는데 이 영역에 프로그래스 컨트롤을 만들면 된다. 개념적으로 간단하므로 예제 코드만 보면 쉽게 이해가 될 것이다.

 

#include <commctrl.h>

HWND hState;

HWND hProg;

int Pos;

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

   HDC hdc;

   PAINTSTRUCT ps;

   int SBPart[3];

   RECT prt;

   TCHAR Mes[]="마우스 왼쪽 버튼을 누르면 작업을 시작합니다";

 

   switch(iMessage) {

   case WM_CREATE:

      InitCommonControls();

      hState=CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd,0);

      SBPart[0]=200;

      SBPart[1]=400;

      SBPart[2]=-1;

      SendMessage(hState, SB_SETPARTS, 3, (LPARAM)SBPart);

      SendMessage(hState, SB_SETTEXT,0,(LPARAM)"작업 진행 과정");

      SendMessage(hState, SB_SETTEXT,1,(LPARAM)"일반 상태란");

      return 0;

   case WM_LBUTTONDOWN:

      if (Pos)

          return 0;

      SendMessage(hState,SB_GETRECT,0,(LPARAM)&prt);

      hProg=CreateWindow(PROGRESS_CLASS,NULL,WS_CHILD | PBS_SMOOTH,

          prt.left,prt.top,prt.right-prt.left,prt.bottom-prt.top,

          hState,NULL,g_hInst,NULL);

      Pos=0;

      SendMessage(hProg, PBM_SETRANGE, 0, MAKELPARAM(0,100));

      SendMessage(hProg, PBM_SETPOS, Pos, 0);

      ShowWindow(hProg,SW_SHOW);

      SetTimer(hWnd,0,50,NULL);

      return 0;

   case WM_TIMER:

      if (Pos==100) {

          DestroyWindow(hProg);

          KillTimer(hWnd,0);

          Pos=0;

      } else {

          Pos++;

         SendMessage(hProg, PBM_SETPOS, Pos, 0);

      }

      return 0;

   case WM_PAINT:

      hdc=BeginPaint(hWnd, &ps);

      TextOut(hdc,10,10,Mes,lstrlen(Mes));

      EndPaint(hWnd, &ps);

      return 0;

   case WM_SIZE:

      SendMessage(hState, WM_SIZE, wParam, lParam);

      return 0;

   case WM_DESTROY:

      PostQuitMessage(0);

      return 0;

   }

   return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

세 개의 파트를 만들었다. 평소에는 첫번째 파트에 문자열을 보여 주다가 작업이 시작되면 이 영역에 프로그래스를 만들고 작업 진행 과정을 보여 준다. 예제에서는 마우스 왼쪽 버튼을 누르는 것이 작업 시작을 의미하며 작업은 타이머 메시지로 진행시켰다.

작업이 완료되면 프로그래스는 사라지고 다시 파트 문자열이 보이게 된다. 버튼이나 에디트 등의 컨트롤을 영구적으로 배치하는 것도 물론 가능하다. 단, 부모 윈도우가 통지 메시지를 받기 위해서는 툴바에서 그랬던 것처럼 일단 부모 윈도우의 차일드로 컨트롤을 생성한 후 SetParent 함수로 상태란의 차일드가 되도록 해 주어야 한다.

상태란은 공통 컨트롤 중에는 아주 다루기 쉬운 컨트롤이다. 난이도에 비해 프로그램의 활용성을 높이는데 크게 기여하며 나름대로 응용할만한 곳이 많이 있으므로 적극적으로 활용해 보도록 하자.