9/9 컨트롤 실습

정수현·2024년 9월 28일

API Programming

목록 보기
10/10
post-thumbnail

컨트롤 실습

도형 타입, 색상 정보, 좌표 정보를 받아 윈도우 창에 도형을 출력한다.

  • 각 컨트롤 설정
    도형 타입 - ComboBox
    색상(R), (G), (B) - Horizonal Scroll
    좌표 정보 - Edit Control



모달 프로시저 작성

대화상자 기반 프로그램이므로, 대화상자에 해당하는 프로시저를 생성해야 한다.

modal.cpp

INT_PTR CALLBACK Modal_Proce(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch(msg)
  {
  case WM_INITDIALOG:
  {
  }
  case WM_HSCROLL:
  {
  }
  case WM_COMMAND:
  {
  }
  }
  return FALSE;
}

WM_INITDIALOG : 다이얼로그가 시작될 때 동작한다. 각 컨트롤을 초기화한다.

ComboBox 생성 및 초기화

HWND hCombo = GetDlgItem(hdlg, IDC_COMBO1);
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("사각형"));
SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)TEXT("타 원"));
SendMessage(hCombo, CB_SETCURSEL, pshape->type-1, 0);
  • GetDlgItem() 핸들을 생성한다.
  • SendMessage() 목록을 구성한다.

ScrollBar를 생성, 범위 설정 및 초기화

HWND hScroll_r = GetDlgItem(hdlg, IDC_SCROLLBAR1);
HWND hScroll_g = GetDlgItem(hdlg, IDC_SCROLLBAR2);
HWND hScroll_b = GetDlgItem(hdlg, IDC_SCROLLBAR3);

SetScrollRange(hScroll_r, SB_CTL, 0, 255, TRUE);
SetScrollRange(hScroll_g, SB_CTL, 0, 255, TRUE);
SetScrollRange(hScroll_b, SB_CTL, 0, 255, TRUE);

SetScrollPos(hScroll_r, SB_CTL, GetRValue(pshape->color), TRUE);
SetScrollPos(hScroll_g, SB_CTL, GetGValue(pshape->color), TRUE);
SetScrollPos(hScroll_b, SB_CTL, GetBValue(pshape->color), TRUE);
  • SetScrollRange : ScrollBar의 범위를 설정한다.
  • SetScrollPos : ScrollBar

EditControl 초기화

// 스크롤바 우측 에디트 박스 초기화
SetDlgItemInt(hdlg, IDC_EDIT1, GetRValue(pshape->color), 0);
SetDlgItemInt(hdlg, IDC_EDIT2, GetRValue(pshape->color), 0);
SetDlgItemInt(hdlg, IDC_EDIT3, GetRValue(pshape->color), 0);

// 좌표 초기화
SetDlgItemInt(hdlg, IDC_EDIT5, pshape->pt.x, 0);
SetDlgItemInt(hdlg, IDC_EDIT6, pshape->pt.y, 0);

SetDlgItemInt() : EditControl을 초기화한다.

WM_HSCROLL : 스크롤 바의 스크롤을 설정한다.

int value = GetScrollPos((HWND)lParam, SB_CTL);

switch(LOWORD(wParam))
{
case SB_LINELEFT: value = max(0, value-1); break;
case SB_LINERIGHT: value = min(255, value+1); break;
case SB_PAGELEFT: value = max(0, value-10); break;
case SB_PAGERIGHT: value = min(255, value+10); break;
}
  • ScrollBar의 위치(?)를 정수형 변수 value에 받아온다.

  • 양쪽의 화살표를 클릭했을 땐 값이 각각 1씩 늘어나거나 줄어들도록 설정하고,
    양쪽의 바를 클릭했을 땐 값이 각각 10씩 늘어나거나 줄어들도록 설정한다.

SetScrollPos((HWND)lParam, SB_CTL, value, TRUE);
  • 현재 동작시킨 핸들
if((HWND)lParam == hScroll_r) 
  SetDlgItemInt(hdlg, IDC_EDIT1, value, 0);
else if ((HWND)lParam == hScroll_g)
  SetDlgItemInt(hdlg, IDC_EDIT2, value, 0);
else if ((HWND)lParam == hScroll_b)
  SetDlgItemInt(hdlg, IDC_EDIT3, value, 0);
  • 각각의 ScrollBar에 대한 값(RGB)을 오른쪽 EditControl에 나타낸다.

WM_COMMAND : 프로시젖의 동작 부분 구현

switch(msg)
{
case IDC_BUTTON1: 
{
}
case IDC_BUTTON2:
{
}
return TRUE;
}

IDC_BUTTON1 적용 버튼을 눌렀을 때 :

// 도형 타입
int type = (int)SendMessage(hCombo, CG_GETCURSEL, 0, 0);
pshape->type = type + 1;
// 색상 R, G, B
int r = GetScrollPos(hScroll_r, SB_CTL);
int g = GetScrollPos(hScroll_g, SB_CTL);
int b = GetScrollPos(hScroll_b, SB_CTL);
pshape->color = RGB(r,g,b);
// 좌표 x, y
pshape->pt.x = GetDlgItemInt(hdlg, IDC_EDIT4, 0, 0);
pshape->pt.y = GetDlgItemInt(hdlg, IDC_EDIT5, 0, 0);

EndDialog(hdlg, IDC_BUTTON1);

return TRUE;

IDC_BUTTON2 취소 버튼을 눌렀을 때 :

EndDialog(hdlg, IDC_BUTTON2); return TRUE;

0개의 댓글