原始Win32中的Rich Edit控件

时间:2020-03-05 18:59:25  来源:igfitidea点击:

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中注册。