原始 Win32 中的 Rich Edit 控件
题
Rich Edit Controls 的文档真的像看起来那么糟糕(错误吗?)?现在,我正在手动调用 LoadLibrary("riched20.dll") 以便显示 Rich Edit 控件。Rich Edit 的文档在使用 Rich Edit 控件的第一个代码示例中没有很好地演示这一点。
它讨论了调用 InitCommonControlsEx() 来添加视觉样式,但没有提及要传入哪些标志。
有没有更好的方法来加载 Rich Edit 控件?
http://msdn.microsoft.com/en-us/library/bb787877(VS.85).aspx
这是我可以编写使其工作的唯一代码:
#include "Richedit.h"
#include "commctrl.h"
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_USEREX_CLASSES; //Could be 0xFFFFFFFF and it still wouldn't work
InitCommonControlsEx(&icex); //Does nothing for Rich Edit controls
LoadLibrary("riched20.dll"); //Manually? For real?
hWndRichEdit = CreateWindowEx(
ES_SUNKEN,
RICHEDIT_CLASS,
"",
WS_BORDER | WS_VISIBLE | WS_CHILD,
2, 2, 100, 24,
hWnd, (HMENU) ID_RICH_EDIT, hInst, NULL);
解决方案
使用 MFC,RichEdit 控件就可以工作。
使用 InitCommonControlsEx() 加载 - ICC_USEREX_CLASSES 不会加载 RichEdit AFAIK,您不需要它,因为它只加载“标准”公共控件,其中不包括 richedit。显然,您只需要调用它来启用 Windows 中的“视觉样式”,而不是让 RichEdits 工作。
如果您使用的是 2008,则需要包含 Msftedit.dll 并改用 MSFTEDIT_CLASS(MS 有时在向后兼容性方面很糟糕)。
这 文档 建议您正确地进行 Win32 编程。
其他提示
许多年前,我遇到了同样的问题,是的,答案是手动加载 .dll。据我所知,原因是RichEdit窗口类注册在riched20.dll的DllMain中。
是否没有可以链接到的导入库(可能是 riched20.lib)。然后您就不必在运行时“手动”加载它。这就是所有标准控件的工作原理。创建项目时,VS 会自动添加对 user32.lib 的引用。
我认为在创建任何公共控件之前您必须调用 CoInitializeEx。
不需要 LoadLibrary。如果您链接到正确的 .lib 文件,exe 加载程序将为您处理这些详细信息。