WinAPI 选项卡栏呈现

Tri*_*ert 5 winapi

我正在编写一个基于 C 的 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);
}
Run Code Online (Sandbox Code Playgroud)

有谁知道这个问题的解决方案?我还没有在谷歌上找到它,我开始认为这可能只是 WinAPI 本身的一个错误。感谢您的任何回复!

编辑:在创建任何控件之前,我在程序的开头调用了 InitCommonControlsEx(),因此注册了公共控件类。

Dre*_*pin 5

您需要使用设置选项卡控件上的字体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);
Run Code Online (Sandbox Code Playgroud)