You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32 API中ChooseFont()对话框颜色设置无效问题求助

解决ChooseFont颜色修改不生效的问题

你的代码已经正确获取了用户选择的颜色,但没有将颜色应用到编辑控件上——WM_SETFONT仅负责设置字体样式,不处理文本颜色。Win32编辑控件的文本颜色需要通过父窗口的WM_CTLCOLOREDIT消息来控制,具体修复步骤如下:

1. 在窗口过程中添加颜色处理逻辑

找到你的窗口过程函数(通常是WndProc),添加以下分支,用于处理编辑控件的绘制:

case WM_CTLCOLOREDIT:
{
    HDC hdcEdit = (HDC)wParam;
    // 设置文本颜色为选中的颜色
    SetTextColor(hdcEdit, g_editcolor);
    // 设置背景色为默认窗口背景色(可根据需求修改)
    SetBkColor(hdcEdit, GetSysColor(COLOR_WINDOW));
    // 返回白色画刷(确保背景绘制正确)
    return (LRESULT)GetStockObject(WHITE_BRUSH);
}

2. 更新ChooseFont后的逻辑

在你现有的代码末尾,添加重绘编辑控件的代码,确保颜色修改立即生效:

// 原代码保留
g_editcolor = cf.rgbColors;
// 新增:让编辑控件重绘,应用新颜色
InvalidateRect(g_hEdit, NULL, TRUE);

完整修改后的代码片段

CHOOSEFONT cf = {sizeof(CHOOSEFONT)};
LOGFONT lf;
GetObject(g_hFont, sizeof(LOGFONT), &lf);
cf.Flags = CF_EFFECTS | CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
cf.hwndOwner = g_hwnd;
cf.lpLogFont = &lf;
cf.rgbColors = g_editcolor;
if (!ChooseFont(&cf))
    return;
HFONT hf = CreateFontIndirect(&lf);
if (hf)
{
    g_hFont = hf;
    SendMessage(g_hEdit, WM_SETFONT, (WPARAM)g_hFont, TRUE);
}
g_editcolor = cf.rgbColors;
// 新增:触发编辑控件重绘
InvalidateRect(g_hEdit, NULL, TRUE);

原理说明

Win32编辑控件的文本颜色不是由字体对象控制的,而是由父窗口在绘制控件时通过WM_CTLCOLOREDIT消息指定。当你选择新颜色后,必须通知控件重绘,父窗口才会用新的颜色值绘制文本。

内容的提问来源于stack exchange,提问作者MannyR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:25:28