波塞冬~ 2023-09-19 17:14 采纳率: 50%
浏览 19
已结题

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改变标签颜色方案,感谢。

  • 写回答

2条回答 默认 最新

  • Leodong. 2023-09-19 17:25
    关注

    该回答通过自己思路及引用到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 函数。


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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月27日
  • 已采纳回答 9月19日
  • 创建了问题 9月19日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)