原始Win32中的Rich Edit控件
Rich Edit控件的文档真的像看起来一样糟糕(错误吗?)?现在,我正在手动调用LoadLibrary(" riched20.dll")以便显示Rich Edit控件。 Rich Edit的文档在使用Rich Edit控件的第一个代码示例中未能很好地说明这一点。
它谈到了调用InitCommonControlsEx()以添加视觉样式,但是没有提及要传递的标志。
有没有更好的方式来加载Rich Edit控件?
http://msdn.microsoft.com/zh-cn/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);
解决方案
回答
没有可以链接到的导入库(也许是riched20.lib)。这样,我们就不必在运行时"手动"加载它。这就是所有标准控件的工作方式。创建项目时,VS会自动向user32.lib添加引用。
回答
我认为我们必须在创建任何常用控件之前调用CoInitializeEx。
不需要LoadLibrary。如果我们链接了正确的.lib文件,则exe-loader将为我们处理这些详细信息。
回答
使用MFC,RichEdit控件可以正常工作。
使用InitCommonControlsEx()ICC_USEREX_CLASSES加载不会加载RichEdit AFAIK,我们不需要它,因为它仅包含"标准"通用控件,其中不包含richedit。显然,我们只需要调用此选项即可在Windows中启用"视觉样式",而无需使RichEdits正常工作。
如果我们使用的是2008,则要包含Msftedit.dll并改为使用MSFTEDIT_CLASS(MS有时是向后兼容的垃圾)。
文档确实建议我们正确地进行Win32编程。
回答
很多年前,我遇到了同样的问题,是的,答案是手动加载.dll。据我所记得,其原因是RichEdit窗口类在riched20.dll的DllMain中注册。