2013-09-28 8 views
4

주 창 클라이언트 영역에 탭 컨트롤이있는 C 기반 WinAPI 프로그램을 작성하고 있습니다. 이 탭 컨트롤은 탭에서 어떤 종류의 렌더링 문제가있는 것을 제외하고는 훌륭하게 작동합니다. 탭의 제목이 굵게, unaliased 글꼴 렌더링, 따라서 화면 공간을 많이 낭비됩니다 여기 하는 탭이 기본적으로 다른 모든 응용 프로그램에서 같이 작업은 다음과 같습니다 WinAPI 탭 표시 줄 렌더링

내가 설정하려면이 코드를 사용하여 내 탭 컨트롤 :

RECT rcClient, rcTool, rcTab; 
TCHAR tabTitleTmp[256]; // Temp string buffer 

HWND hTool = GetDlgItem(hWnd, IDC_MAIN_TOOL); 
GetWindowRect(hTool, &rcTool); 
int iToolHeight = rcTool.bottom - rcTool.top; 

// Get parent's client rect 
GetClientRect(hWnd, &rcClient); 

// Create tab control 
HWND hwndTab = CreateWindowEx(NULL, WC_TABCONTROL, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 
    0, iToolHeight, rcClient.right, rcClient.bottom - iToolHeight, hWnd, (HMENU) IDC_MAIN_TAB, 
    hInst, NULL); 

// Create tab items 
TCITEM tie; 
tie.mask = TCIF_TEXT | TCIF_IMAGE; 
tie.iImage = -1; 
tie.pszText = tabTitleTmp; 

// Set up tabs 
for(int i = 0; i < 8; i++) { 
    LoadString(hInst, IDC_TAB_GENERAL + i, tabTitleTmp, sizeof(tabTitleTmp)/sizeof(tabTitleTmp[0])); 
    TabCtrl_InsertItem(hwndTab, i, &tie); 
} 

누구든지이 문제를 해결할 수 있습니까? 아직 Google에서 찾지 못했지만 WinAPI 자체의 버그 일 수 있다고 생각하기 시작했습니다. 모든 응답 주셔서 감사합니다!

편집 : 컨트롤을 만들기 전에 내 프로그램 시작 부분에서 InitCommonControlsEx()를 호출하여 공통 컨트롤 클래스를 등록합니다.

답변

4

WM_SETFONT 메시지와 함께 SendMessage()을 사용하여 탭 컨트롤에서 글꼴을 설정해야합니다. GetStockObject(DEFAULT_GUI_FONT)을 사용하여 기본 GUI 글꼴을 얻을 수 있습니다. SystemParametersInfo()을 사용하여 기본 글꼴을 얻거나 CreateFont()을 사용하여 다른 글꼴을 설정할 수 있습니다.

NONCLIENTMETRICS ncm; 
ncm.cbSize = sizeof(NONCLIENTMETRICS); 
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, NULL); 
HFONT hFont = CreateFontIndirect(&ncm.lfMessageFont); 
SendMessage(hwndTab, WM_SETFONT, (WPARAM)hFont, true); 
+0

그래, 맞아! 호기심에서, 이것은 당신이 스스로 발견 한 것입니까, 아니면 M $ docs에 깊이 묻혀 있습니까? –

+0

@TristanSeifert, 내가 오래 전 발견 한 것. 귀하의 스크린 샷을 보았을 때 문제가 무엇인지 즉시 알았습니다. 내 오래된 프로젝트에서'GetStockObject (DEFAULT_GUI_FONT)'를 사용하고있었습니다. 대답을 게시 한 후 MSDN 기사를 읽었으며 'SystemParametersInfo'가 선호되는 방식이므로 편집했습니다. –

+0

@TristanSeifert, 이것은 실제로 대부분의 모든 컨트롤에서 볼 수있는 것, 특히 사용하고있는 것처럼 보이는 정적 라벨입니다. 나는 당신이 당신의 다른 통제에서도이 문제를 보지 않고 있다는 사실에 놀랐습니다. –