2009-11-15 2 views

답변

0

제어 글꼴을 설정하는 일반적인 방법을 사용하여 글꼴을 설정합니다. CreateFont로 만든 HFONT를 사용하여 창 초기화에서 WM_SETFONT 메시지를 보냅니다. 예 :

SendDlgItemMessage(hDlg, IDC_STATIC, WM_SETFONT, (WPARAM)hFont, TRUE);

그렇다면 WM_CTLCOLORSTATIC 알림을 사용하여 실제 색상을 설정해야합니다.

 
case WM_CTLCOLORSTATIC: 
if(GetDlgItem(hDlg, IDC_STATIC) == (HWND)lParam) 
{ 
    HDC hDC = (HDC)wParam;
SetBkColor(hDC, GetSysColor(COLOR_BTNFACE)); SetTextColor(hDC, RGB(0, 0xFF, 0)); SetBkMode(hDC, TRANSPARENT);
return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
} break;

실제로 솔리드 솔리드를 한 번만 만들고 대화 상자가 사라지면 솔벤트 브러시가 새어 나오기 때문에 삭제해야합니다.

+0

그룹 상자에서는 작동하지 않습니다. 그러나 레이블 (정적 컨트롤)에 대해 작업하고 있습니다. 설명서에있는 내용은 입니다. 정적 컨트롤 또는 읽기 전용 또는 비활성화 된 편집 컨트롤은 컨트롤을 그릴 때 WM_CTLCOLORSTATIC 메시지를 부모 창으로 보냅니다. 그룹 상자가 적합한 지 확실하지 않습니다. 재미있는 점은 비록 중단 점을 설정하면 색이 변하지 않아도 어떤 이유로 제어 (그룹 상자)에 대한 메시지가 전송되고 있다고 생각하기 때문입니다. – Rahul

+0

정말 작동하지 않습니까? 실행중인 내 작은 테스트 응용 프로그램에 잘 작동합니다. 이상한 abit 수 있습니다. 브러시가 맞지 않으면 예를 들어 아무것도하지 않습니다. – tyranid

+0

Vista에서 어떤 차이라도 만들 수 있습니다. – Rahul

3

WM_CTLCOLORSTATIC은 그룹 상자 제목의 색상을 제어하는 ​​올바른 방법입니다.

그러나 더 이상 작동하지 않습니다. 응용 프로그램에서 버전 6 comctl 라이브러리를 포함하는 매니페스트를 사용하는 경우 Groupbox 컨트롤은 더 이상 브러시를 가져 오기 위해 WM_CTLCOLORSTATIC을 부모에게 보내지 않습니다. 대화 상자 컨트롤이 Windows 95 컨트롤처럼 못생긴, 사각형 및 회색으로 보이면 XP 스타일을 사용할 수 없으며 그룹 상자의 색을 제어 할 수 있습니다. 하지만 그건 끔찍한 희생이야! : P

다음으로 대부분의 표준 컨트롤은 그림을 제어하기 위해 부모 (대화 상자)에 WM_CTLCOLORxxx 메시지를 보냅니다. 컨트롤을 식별하는 유일한 방법은 컨트롤 ID를 찾는 것입니다. 컨트롤에 특정 색이나 글꼴이 필요하다는 것을 나타내는 식별자를 컨트롤에 할당하는 것이 좋습니다. 즉, 빨간색 텍스트가 필요한 컨트롤에는 IDC_STATIC을 사용하지 마십시오. 숫자를 IDC_DRAWRED 또는 일부 ID로 설정합니다.

WM_CTLCOLOR 메시지가 올바른 제어인지 여부를 테스트하려면 사용하지 마십시오. GetDlgItem은 특정 ID로 대화 상자의 첫 번째 컨트롤 핸들을 반환하기 때문에 컨트롤이 하나만 칠해집니다.

case WM_CTLCOLORSTATIC: 
    if(GetWindowLong((HWND)lParam, GWL_ID) == IDC_RED) 
    return MakeControlRed((HDC)wParam); 

당신은 항상 *는 WM_CTLCOLORxxx 메시지에서 HBRUSH를 반환해야 -. 당신이 정말로 단지 HDC가 전달되면서 '변조'할 경우에도 당신이 당신의 대화 PROC에서 유효한 브러시를 반환하지 않는 경우 다이얼로그 윈도우 프로시 저는 여러분이 메시지를 전혀 처리하지 않고 DefWindowProc에 넘겨 준다고 생각합니다. 그러면 여러분이 만든 HDC의 모든 변경 사항이 재설정됩니다. 브러시를 만드는 대신 시스템에 표준 ui 요소를 그리는 대기 상태의 브러시 캐시가 있습니다. GetSysColorBrush

물론, 항상 HBRUSH를 반환 할 필요는 없습니다. 응용 프로그램에서 xp 테마 스타일을 사용하도록 설정 한 경우 때때로 null을 반환 할 수 있습니다. - xp 테마 대화 상자의 색상이 배경색이 다르기 때문에 (특히 탭 컨트롤에서) syscolor 브러시를 반환하면 밝은 배경에 못생긴 회색 상자가 나타납니다. - 특정 경우 대화 관리자가 null을 반환하고 DC에서 변경 내용을 다시 설정할 수 없게합니다.

+0

그래서 WM_CTLCORxxx 내가 내가 WM_CTLCOLORMSGBOX WM_CTLCOLOREDIT WM_CTLCOLORLISTBOX WM_CTLCOLORBTN WM_CTLCOLORDLG WM_CTLCOLORSCROLLBAR WM_CTLCOLORSTATIC – Rahul

+0

당신의 문제가 있습니다 내 winuser.h에 표시되는 모든 찾고 있어요 그룹 상자 - 그들은 새로운 CTLCOLOR을 추가하지 않은 것 같습니다 메시지. 귀하의 옵션은 다음과 같습니다 : - 소유자 - 그룹 상자 그리기 - 피타. 또는 텍스트가없는 그룹 상자 위에 일반 정적 텍스트를 사용하십시오. 또는 Spy ++로 창을보고 아직 발송되지 않은 새로운 메시지가 있는지 확인할 수 있습니다. –

+0

그래서 .NET에서 fore color를 설정하여이 작업을 수행 할 수 있다면 커버 아래에 그려진 소유자가 그룹 상자를 그렸을 것이라고 추측 할 수 있습니까? – Rahul