
도형 타입, 색상 정보, 좌표 정보를 받아 윈도우 창에 도형을 출력한다.
ComboBoxHorizonal ScrollEdit 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;