핵심 API로 배우는 윈도우 프로그래밍 4장을 공부하고 정리한 내용입니다.
글꼴을 변경하는 공용대화상자를 만든다
메뉴에 글꼴 변경 탭을 추가한 후 ID_FONTDLG 로 아이디를 지정해준다.
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
CHOOSEFONT FONT;
static COLORREF fColor;
HFONT hFont, OldFont;
static LOGFONT LogFont;
switch (iMsg)
{
case WM_CREATE:
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hFont = CreateFontIndirect(&LogFont);
OldFont = (HFONT)SelectObject(hdc, hFont);
SetTextColor(hdc, fColor);
TextOut(hdc, 10, 10, _T("HelloWorld"), 10);
SelectObject(hdc, OldFont);
DeleteObject(hFont);
EndPaint(hwnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_FONTDLG:
memset(&FONT, 0, sizeof(CHOOSEFONT));
FONT.lStructSize = sizeof(CHOOSEFONT);
FONT.hwndOwner = hwnd;
FONT.lpLogFont = &LogFont;
FONT.Flags = CF_EFFECTS | CF_SCREENFONTS;
if (ChooseFont(&FONT) != 0)
{
fColor = FONT.rgbColors;
InvalidateRgn(hwnd, NULL, TRUE);
}
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
바뀐 글꼴을 화면에 출력하는것은 브러쉬를 이용하는것과 같다
현재 글꼴을 저장해준후 새 글꼴로 화면에 출력하고 다시 기존 글꼴로 돌아온다.
ID_FONTDLG가 호출되면 글꼴을 변경하는 공용대화상자가 출력되서 글꼴정보를 받아와 저장한다.
색상을 변경하는 대화상자를 호출해보자
색상이 바뀌는것을 보기 위해 원을 하나 출력한 후 색상을 바꿔줄 것이다.
마찬가지로 색생 변경 탭을 생성한 후 아이디를 ID_COLORDLG 로 설정해 준다.
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
CHOOSECOLOR COLOR;
static COLORREF tmp[16], color;
HBRUSH hBrush, OldBrush;
int i;
switch (iMsg)
{
case WM_CREATE:
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
hBrush = CreateSolidBrush(color);
OldBrush = (HBRUSH)SelectObject(hdc, hBrush);
Ellipse(hdc, 10, 20, 200, 200);
SelectObject(hdc, OldBrush);
DeleteObject(hBrush);
EndPaint(hwnd, &ps);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_COLORDLG:
for (i = 0; i < 16; i++)
{
tmp[i] = RGB(rand() % 256, rand() % 256, rand() % 256);
}
memset(&COLOR, 0, sizeof(CHOOSECOLOR));
COLOR.lStructSize = sizeof(CHOOSECOLOR);
COLOR.hwndOwner = hwnd;
COLOR.lpCustColors = tmp;
COLOR.Flags = CC_FULLOPEN;
if (ChooseColor(&COLOR) != 0)
{
color = COLOR.rgbResult;
InvalidateRgn(hwnd, NULL, TRUE);
}
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
tmp[16] 배열은 무엇이길래 랜덤한 색상코드를 16가지나 반복해서 저장해주는가?
무려 사용자 지정 색의 초기값을 직접 설정해준다!
원의 색깔이 잘 바뀌는 것을 볼 수 있다.
'핵심 API로 배우는 윈도우 프로그래밍' 카테고리의 다른 글
핵심 API로 배우는 윈도우 프로그래밍 연습문제 4장 1~3번 (0) | 2022.11.12 |
---|---|
[windowAPI] 제4장 윈도우 각종 메뉴 구성 - 3 (0) | 2022.10.23 |
[windowAPI] 제4장 윈도우 각종 메뉴 구성 (0) | 2022.10.19 |
핵심 API로 배우는 윈도우 프로그래밍 연습문제 3장 10번(실패) (0) | 2022.10.01 |
핵심 API로 배우는 윈도우 프로그래밍 연습문제 3장 9번 (0) | 2022.09.29 |