MFC使用SetWindowTheme报错

#include <Windows.h>
#include <Uxtheme.h>
BOOL CBatGridCharger::OnInitDialog()
{
...
HWND hSatateWnd = GetDlgItem(IDC_C_DISABLE_LOW_TEMP_PRO)->GetSafeHwnd();
SetWindowTheme(hSatateWnd, _T(""), _T(""));
...
}
HBRUSH CBatGridCharger::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
....
    case IDC_C_DISABLE_LOW_TEMP_PRO:
        {
            pDC->SetTextColor(RGB(255, 0, 0));//不生效   
        }
....

}
error LNK2001: 无法解析的外部符号 __imp__SetWindowTheme@12

需要引用UxTheme.dll?
项目场景需要动态改变check box的标签颜色,在WM_CTLCOLOR直接SetTextColor不生效(改变text ctrl颜色是可以的),网上说要加SetWindowTheme,但是编译不过去。
求SetWindowTheme使用方法 或 check box改变标签颜色方案,感谢。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在使用 MFC 中的 SetWindowTheme 函数时报错 "LNK2001: 无法解析的外部符号 __imp__SetWindowTheme@12",这通常是由于链接器无法找到 UxTheme.dll 库导致的。

要解决此问题,您需要在项目中明确引用 UxTheme.dll 并链接到您的应用程序中。请按照以下步骤进行操作:

  1. 在 Visual Studio 中打开您的 MFC 项目。
  2. 在解决方案资源管理器中,右键单击您的项目,然后选择 "属性"。
  3. 在属性对话框中,选择 "配置属性" > "链接器" > "输入"。
  4. 在 "附加依赖项" 字段中,添加 "UxTheme.lib"。
  5. 确保 "附加依赖项" 中的其他库的引用也是正确的。
  6. 单击 "确定" 保存更改。

现在,编译您的项目应该不再报 "LNK2001: 无法解析的外部符号 __imp__SetWindowTheme@12" 错误,并且应该能够成功链接 UxTheme.dll 库。

关于更改复选框标签颜色的方案,您可以尝试使用自定义绘制的方法。以下是一个示例:

HBRUSH CBatGridCharger::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    if (nCtlColor == CTLCOLOR_STATIC)
    {
        CWnd* pStaticWnd = GetDlgItem(IDC_C_DISABLE_LOW_TEMP_PRO);
        if (pWnd == pStaticWnd)
        {
            // 自定义绘制复选框标签颜色
            pDC->SetTextColor(RGB(255, 0, 0));
            pDC->SetBkMode(TRANSPARENT);
            hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
        }
    }

    return hbr;
}

在上述代码中,我们在 OnCtlColor 函数中检查控件的标识符是否与复选框标签的标识符相匹配(IDC_C_DISABLE_LOW_TEMP_PRO),如果匹配,我们就可以使用 SetTextColor 来设置标签的文本颜色,并使用 SetBkMode 设置背景透明。最后,我们返回透明画刷以绘制背景。

请注意,这种方法是通过自定义绘制来实现的,并不依赖于 SetWindowTheme 函数。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

【以下回答由 GPT 生成】

对于使用SetWindowTheme函数出现LNK2001错误的问题,可以通过添加uxtheme.lib库来解决。下面是解决方法:

首先,确保你的项目已经正确引入了uxtheme.h头文件,如果没有,可以在代码开头添加#include <Uxtheme.h>

然后,在项目设置中添加uxtheme.lib库的依赖项。打开项目属性页,在左侧面板中选择“链接器”,然后选择“输入”,在右侧的“附加依赖项”中添加uxtheme.lib。保存并重新编译项目,这样就能够成功链接到SetWindowTheme函数。

关于在WM_CTLCOLOR消息中改变复选框标签颜色的问题,SetTextColor函数对标签文本颜色的更改不起作用是因为在默认情况下,MFC使用COLOR_WINDOWTEXT属性来绘制控件的文本颜色。要改变复选框标签的颜色,你可以在WM_CTLCOLOR消息中使用自定义的绘制代码。

下面是一种改变复选框标签颜色的示例代码:

HBRUSH CBatGridCharger::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hBrush = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    switch (pWnd->GetDlgCtrlID())
    {
        case IDC_C_DISABLE_LOW_TEMP_PRO:
            pDC->SetTextColor(RGB(255, 0, 0)); // 设置文本颜色为红色
            break;
        // 添加其他控件的处理

    }

    return hBrush;
}

在上面的示例代码中,我们首先调用了CDialogEx::OnCtlColor函数来处理控件的默认绘制操作。然后,我们通过检查控件的ID来确定要更改颜色的控件,比如IDC_C_DISABLE_LOW_TEMP_PRO。最后,我们使用pDC->SetTextColor函数设置文本颜色为红色。如果你有其他需要更改颜色的控件,可以在switch语句中添加相应的处理。

希望这些解决方案能够帮助你解决问题。如果你还有其他疑问,请随时向我提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^