.그리드 설정 변경

그리드 관련 변수의 디폴트값을 무난하게 설정했지만 사용자의 취향에 따라 변경할 있도록 해야 한다. 어떤 사람은 그리드를 촘촘하게 지정하기를 바랄 수도 있고 어떤 사람은 그리드 기능은 쓰되 안내선은 보고 싶지 않을 수도 있기 때문이다. 대화상자를 통해 그리드와 관련된 변수를 보여 주고 변경할 있도록 보자. 리소스에는 이미 그리드 편집 대화상자의 템플리트가 작성되어 있다.

템플리트의 모양을 보면 컨트롤과 변수의 대응관계를 쉽게 짐작할 있을 것이다. 정수형과 BOOL 변수의 값을 입력받아야 하므로 에디트와 체크 박스를 사용했으며 에디트는 Number 스타일을 주어 숫자 이외의 문자는 입력하지 못하도록 했다. 대화상자 프로시저는 대화상자에 현재 설정 상태를 보여 주고 사용자가 편집한 값을 다시 변수로 읽어 들이기만 하면 된다.

 

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

{

   switch(iMessage) {

   case WM_INITDIALOG:

      SetDlgItemInt(hDlg,IDC_EDGRIDX,GridX,FALSE);

      SetDlgItemInt(hDlg,IDC_EDGRIDY,GridY,FALSE);

      SetDlgItemInt(hDlg,IDC_EDGRIDLINEX,GridLineX,FALSE);

      SetDlgItemInt(hDlg,IDC_EDGRIDLINEY,GridLineY,FALSE);

      if (bGrid) CheckDlgButton(hDlg,IDC_CHKGRID,BST_CHECKED);

      if (bGridLine) CheckDlgButton(hDlg,IDC_CHKGRIDLINE,BST_CHECKED);

      return TRUE;

   case WM_COMMAND:

      switch (LOWORD(wParam)) {

      case IDOK:

          GridX=GetDlgItemInt(hDlg,IDC_EDGRIDX,NULL,FALSE);

          GridY=GetDlgItemInt(hDlg,IDC_EDGRIDY,NULL,FALSE);

          GridLineX=GetDlgItemInt(hDlg,IDC_EDGRIDLINEX,NULL,FALSE);

          GridLineY=GetDlgItemInt(hDlg,IDC_EDGRIDLINEY,NULL,FALSE);

          bGrid=(IsDlgButtonChecked(hDlg,IDC_CHKGRID)==BST_CHECKED);

          bGridLine=(IsDlgButtonChecked(hDlg,IDC_CHKGRIDLINE)==BST_CHECKED);

          EndDialog(hDlg,IDOK);

          return TRUE;

      case IDCANCEL:

          EndDialog(hDlg,IDCANCEL);

          return TRUE;

      }

      return FALSE;

   }

   return FALSE;

}

 

WM_INITDIALOG에서 변수의 값을 컨트롤로 출력하고 IDOK에서 컨트롤의 값을 다시 변수로 대입하는 전형적인 대화상자 프로시저이다. 메인 메뉴의 안내선 설정 항목이 선택되었을 대화상자를 호출한다. 대화상자는 유일 전역 변수값을 직접 변경하므로 파라미터를 필요는 없다.

 

LRESULT Main_OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   case IDM_TOOL_GRID:

      if (DialogBox(g_hInst,MAKEINTRESOURCE(IDD_GRID),hWnd,GridDlgProc)==IDOK) {

          InvalidateRect(hCanvas,NULL,FALSE);

      }

      break;

 

안내선 설정이 변경되면 캔버스를 무효화하여 다시 그리도록 했다. 그리드의 사용 유무는 화면과 상관이 없지만 안내선 보기 기능이 변경되면 화면도 다시 그려야 하기 때문이다.