WM_SETFONT

인수

wParam : 폰트의 핸들. NULL일 경우 시스템 폰트를 사용한다.

lParam : 폰트를 변경한 후 컨트롤을 다시 그릴 것인지 아닌지를 지정한다. 이 값이 TRUE이면 컨트롤은 자기 자신을 다시 그린다. WM_CREATE나 WM_INITDIALOG에서 폰트를 변경한다면 굳이 다시 그릴 필요가 없으므로 이 인수는 FALSE로 준다.

설명

컨트롤의 폰트를 변경한다. 표준 컨트롤 및 공통 컨트롤은 기본적으로 시스템 폰트로 텍스트를 출력하며 대화상자에 있는 컨트롤의 경우 대화상자의 폰트와 같은 폰트를 사용한다. 실행중에 컨트롤의 글꼴을 변경하고자 한다면 폰트 오브젝트를 먼저 만든 후 이 메시지로 폰트의 핸들을 전달하면 된다.

컨트롤의 폰트를 변경하는 가장 좋은 때는 대화상자가 WM_INITDIALOG 메시지를 받았을 때, 또는 오버랩드 윈도우의 경우 WM_CREATE 메시지를 받았을 때이다. 즉, 컨트롤이 생성된 직후, 화면에 보이기 직전에 폰트를 바꾸어야 화면 떨림도 없고 다시 그릴 필요도 없어 가장 좋다. 물론 실행중에라도 폰트를 자유롭게 변경할 수 있지만 폰트 변경에 의해 컨트롤이 다시 그려져야 하므로 보기에 좋지 않다. 컨트롤의 텍스트 출력에 사용할 폰트는 컨트롤의 부모가 생성해야 하며 다 사용하고 난 후에 직접 파괴해 주어야 한다.

실행중에 컨트롤의 폰트를 바꾼다고 해서 컨트롤의 크기가 바뀌는 것은 아니다. 따라서 폰트를 변경할 필요가 있는 컨트롤은 미리 변경될 폰트의 크기에 맞는 충분한 크기로 생성할 필요가 있다. 그렇지 않으면 컨트롤의 텍스트가 컨트롤 바깥으로 삐져 나와 잘릴 수가 있다.

리턴

없다.

예제

예제 1

다음 예제는 에디트 컨트롤의 폰트를 실행중에 변경한다.

HWND hEdit;
HFONT hFont;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	TCHAR Mes[]="좌우 마우스 버튼을 누르면 에디트의 글꼴을 변경합니다";

	switch(iMessage) {
	case WM_CREATE:
		hEdit=CreateWindow("edit",NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,
			10,10,400,200,hWnd,(HMENU)0,g_hInst,NULL);
		hFont=CreateFont(20,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,
			VARIABLE_PITCH | FF_ROMAN,"궁서");
		SendMessage(hEdit,WM_SETFONT,(WPARAM)hFont,(LPARAM)FALSE);
		SetWindowText(hEdit,"글꼴 변경 테스트 중");
		SetFocus(hEdit);
		return 0;
	case WM_LBUTTONDOWN:
		SendMessage(hEdit,WM_SETFONT,(WPARAM)hFont,(LPARAM)TRUE);
		return 0;
	case WM_RBUTTONDOWN:
		SendMessage(hEdit,WM_SETFONT,(WPARAM)NULL,(LPARAM)TRUE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,250,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		DeleteObject(hFont);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_CREATE에서 에디트 컨트롤에 사용할 궁서 20픽셀의 폰트를 미리 생성해 두었으며 에디트 컨트롤로 WM_SETFONT 메시지를 보내 앞으로 이 글꼴을 사용하도록 하였다. 이 단계에서는 아직 컨트롤이 화면에 보이기 전이므로 다시 그리기를 할 필요가 없으며 따라서 lParam으로는 FALSE를 전달하였다. 마우스 왼쪽 버튼을 누르면 이 폰트로 다시 변경하며 마우스 오른쪽 버튼을 누르면 시스템 폰트로 돌아간다. 이때는 실행중에 폰트를 변경하는 것이므로 lParam은 TRUE로 주어 컨트롤이 자신을 다시 그리도록 해 주어야 한다. WM_DESTROY에서는 폰트를 제거해야 한다.

예제 2

다음 예제는 대화상자의 버튼 컨트롤 폰트를 실행중에 마우스 좌우 버튼을 눌러 변경한다.

HFONT hFont;
BOOL CALLBACK MainDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	switch(iMessage) {
	case WM_INITDIALOG:
		hDlgMain = hDlg;
		hFont=CreateFont(35,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,
			VARIABLE_PITCH | FF_ROMAN,"궁서");
		return TRUE;
	case WM_LBUTTONDOWN:
		SendDlgItemMessage(hDlg,IDC_BUTTON1,WM_SETFONT,(WPARAM)hFont,(LPARAM)TRUE);
		return 0;
	case WM_RBUTTONDOWN:
		SendDlgItemMessage(hDlg,IDC_BUTTON1,WM_SETFONT,(WPARAM)NULL,(LPARAM)TRUE);
		return 0;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hDlg,IDOK);
			DeleteObject(hFont);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}

폰트를 변경하더라도 컨트롤 자체의 크기는 변하지 않기 때문에 아래 그림처럼 텍스트의 일부만 보일 수도 있다. 이럴 때는 변경될 폰트 크기에 맞추어 미리 컨트롤을 크게 만들어 놓거나 아니면 실행중에 폰트 크기에 맞게 컨트롤의 크기도 같이 늘려 주어야 한다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr