2013-09-28 71 views
4

我正在编写一个基于C的WinAPI程序,它在主窗口的客户区有一个选项卡控件。这个标签控件的效果很好,除了标签出现某种渲染问题之外。标签的标题加粗,混叠的字体渲染,因此浪费了大量的屏幕房地产: 这里的标签是什么样子基本上所有其他应用: 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

您需要使用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,这实际上是你通常看到的大多数所有控件,特别是你似乎正在使用的静态标签。我很惊讶你没有在你的其他控件上看到这个问题。 –