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

WinAPI RichEdit背景色修改、编译警告及宏定义问题求助

RichEdit控件相关问题解决方案

问题1:使用RICHEDIT_CLASS创建的RichEdit控件如何修改背景色?

普通Edit控件通过WM_CTLCOLOREDIT消息修改背景色,但RichEdit控件本质是STATIC类的派生控件,系统会向父窗口发送WM_CTLCOLORSTATIC消息,且必须返回持久化的画刷才能生效。具体修改步骤:

  1. 定义全局画刷变量:
HBRUSH g_hBrush;
  1. 在窗口创建阶段初始化画刷(比如WM_CREATE消息中):
case WM_CREATE: {
    Create_Main(hwnd);
    g_hBrush = CreateSolidBrush(RGB(100,200,100));
    break;
}
  1. 在窗口过程中替换原WM_CTLCOLOREDIT为WM_CTLCOLORSTATIC,并返回画刷:
case WM_CTLCOLORSTATIC:
    l_hwnd = (HWND)lParam;
    l_hdc = (HDC)wParam;
    if (l_hwnd == hedit) {
        SetTextColor(l_hdc, RGB(0,0,0));
        SetBkColor(l_hdc, RGB(100,200,100));
        return (LRESULT)g_hBrush; // 必须返回画刷给系统
    }
    break;
  1. 程序退出时销毁画刷(WM_DESTROY消息中):
case WM_DESTROY:
    DeleteObject(g_hBrush);
    PostQuitMessage(0);
    break;

问题2:解决MSFTEDIT_CLASS的编译警告

警告原因是MSFTEDIT_CLASS默认是宽字符类型(WCHAR*),而你的工程使用多字节字符集(调用CreateWindowExA),导致类型不兼容。两种解决方式:

方式1:强制类型转换

直接将MSFTEDIT_CLASS转换为多字节字符串指针:

hedit = CreateWindowEx(0, (LPCSTR)MSFTEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);

同时确保加载正确的库:

LoadLibrary(TEXT("Msftedit.dll"));

方式2:切换到Unicode字符集

在编译器设置中开启Unicode字符集,此时CreateWindowEx会自动映射为CreateWindowExW,MSFTEDIT_CLASS的宽字符类型可直接匹配,无需转换。注意字符串常量需加L前缀或用_T宏兼容:

hedit = CreateWindowEx(0, MSFTEDIT_CLASS, L"", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);

问题3:宏定义分支选择RICHEDIT_CLASS出现编译警告的处理

可以用宏定义处理,只需保证每个分支的类名字符串类型与CreateWindowEx的参数类型一致:

示例代码:

#define BRICHED 4

void Create_Main(HWND hwnd)
{
  long ltype = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE;

#ifdef BRICHED
#if BRICHED == 2
    LoadLibrary(TEXT("riched20.dll"));
    hedit = CreateWindowEx(0, RICHEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);
#elif BRICHED == 4
    LoadLibrary(TEXT("Msftedit.dll"));
    hedit = CreateWindowEx(0, (LPCSTR)MSFTEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);
#endif
#else
    hedit = CreateWindow("edit", "MyEdit", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);
#endif

  // 后续代码...
}

通过条件编译分别处理不同版本的RichEdit类名,对MSFTEDIT_CLASS做强制转换即可消除警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:36