본문 바로가기
핵심 API로 배우는 윈도우 프로그래밍

[windowAPI] 제4장 윈도우 각종 메뉴 구성 - 2

by 딴짓거리 2022. 10. 20.

핵심 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가지나 반복해서 저장해주는가?

 

 

무려 사용자 지정 색의 초기값을 직접 설정해준다!

 

원의 색깔이 잘 바뀌는 것을 볼 수 있다.