【问题标题】:WinAPI Tab Bar RenderingWinAPI 标签栏渲染
【发布时间】:2013-09-28 23:33:43
【问题描述】:

我正在编写一个基于 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);
}

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

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

【问题讨论】:

    标签: winapi


    【解决方案1】:

    您需要使用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);
    

    【讨论】:

    • 是的,就是这样!出于好奇,这只是您自己发现的东西,还是深埋在某些 M$ 文档中?
    • @TristanSeifert,这是我很久以前发现的。当我看到你的截图时,我立即知道问题出在哪里。在我的旧项目中,我使用的是GetStockObject(DEFAULT_GUI_FONT)。在我发布答案后,我回去阅读 MSDN 文章,它说SystemParametersInfo 是首选方式,因此进行了编辑。
    • @TristanSeifert,这实际上是您通常在大多数控件中看到的东西,尤其是您似乎正在使用的静态标签。我很惊讶您在其他控件上也没有看到此问题。
    • 嗯,我明白了。感谢您提供的知识……我对 WinAPI 工作还比较陌生,所以我以后会记住这一点。网上的很多教程似乎都省略了这一步,这可能是我不知道的原因。您希望 WinAPI 为您执行此操作,但是,嗯。
    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多