2013-09-28 5 views
4

Я пишу программу WinAPI на основе C, которая имеет элемент управления вкладкой в ​​клиентской области главного окна. Этот элемент управления вкладками отлично работает, за исключением того, что на вкладках есть какая-то проблема с рендерингом. Названия вкладок отображаются в смелых, unaliased шрифтов, и, следовательно, тратить много экрана недвижимости: Вот что вкладки выглядят, как, по существу, любое другое приложение: WinAPI Tab Bar Rendering

Я использую этот код, чтобы настроить мой контроль таблеток:

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

Вам необходимо установить шрифт в элементе управления вкладкой, используя SendMessage() с сообщением WM_SETFONT. Вы можете использовать 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 $? –

+0

@TristanSeifert, что-то, что я обнаружил давно. Я сразу понял, в чем проблема, когда я увидел ваш скриншот. В моих старых проектах я использовал 'GetStockObject (DEFAULT_GUI_FONT)'. После того, как я опубликовал ответ, я вернулся и читал статьи MSDN, и он сказал, что «SystemParametersInfo» является предпочтительным способом, поэтому редактирование. –

+0

@TristanSeifert, это на самом деле то, что вы обычно видите с большинством всех элементов управления, особенно статических меток, которые вы, кажется, используете. Я удивлен, что вы не видите эту проблему на своих других элементах управления. –