WinAPI RichEdit背景色修改、编译警告及宏定义问题求助
RichEdit控件相关问题解决方案
问题1:使用RICHEDIT_CLASS创建的RichEdit控件如何修改背景色?
普通Edit控件通过WM_CTLCOLOREDIT消息修改背景色,但RichEdit控件本质是STATIC类的派生控件,系统会向父窗口发送WM_CTLCOLORSTATIC消息,且必须返回持久化的画刷才能生效。具体修改步骤:
- 定义全局画刷变量:
HBRUSH g_hBrush;
- 在窗口创建阶段初始化画刷(比如
WM_CREATE消息中):
case WM_CREATE: { Create_Main(hwnd); g_hBrush = CreateSolidBrush(RGB(100,200,100)); break; }
- 在窗口过程中替换原
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;
- 程序退出时销毁画刷(
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
相关产品推荐
相关产品推荐

