【问题标题】:Rich Edit Control in raw Win32原始 Win32 中的富编辑控件
【发布时间】:2010-09-10 06:28:06
【问题描述】:

Rich Edit Controls 的文档是否真的像看起来那样糟糕(错误?)?现在我手动调用 LoadLibrary("riched20.dll") 以显示富编辑控件。 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);

【问题讨论】:

    标签: windows winapi richedit


    【解决方案1】:

    是否有可以链接到的导入库(可能是riched20.lib)。这样您就不必在运行时“手动”加载它。这就是所有标准控件的工作方式。 VS 在你创建项目时自动添加对 user32.lib 的引用。

    【讨论】:

    • 不幸的是,现在的 Windows SDK 没有riched20.lib。 MS 声明 here 必须动态加载库。
    【解决方案2】:

    我认为您必须在创建任何常用控件之前调用 CoInitializeEx。

    不需要 LoadLibrary。如果您链接到正确的 .lib 文件,exe-loader 将为您处理这些详细信息。

    【讨论】:

    • CoInitializeEx() 需要初始化 COM。 win32 常用控件不需要它。您可能一直在考虑 InitCommonControlsEx()。
    【解决方案3】:

    使用 MFC,RichEdit 控件可以正常工作。

    使用 InitCommonControlsEx() 加载 - ICC_USEREX_CLASSES 不加载 RichEdit AFAIK,您不需要它,因为它只加载不包括 Richedit 的“标准”通用控件。显然你只需要调用它来启用 Windows 中的“视觉样式”,而不是让 RichEdits 工作。

    如果您使用的是 2008,则您希望包含 Msftedit.dll 并改用 MSFTEDIT_CLASS(MS 有时为了向后兼容是垃圾)。

    docs 确实建议您为 Win32 编程做正确的事情。

    【讨论】:

    • 不,您仍然可以将它用于 ANSI 应用程序,但它确实支持 WM_UNICHAR 通知,以便在 ANSI 应用程序中向/从它发送 unicode 文本。
    • MSFTEDIT_CLASS 仅适用于 unicode 应用程序:是的。在 VC2012 MFC 中,如果程序使用 _UNICODE 编译,则使用 MSFTEDIT_CLASS。如果 _UNICODE 未定义,则使用 RICHEDIT_CLASS。
    【解决方案4】:

    很多年前,我也遇到过同样的问题,是的,答案是手动加载 .dll。原因,据我所知,RichEdit 窗口类注册在riched20.dll 的DllMain 中。

    【讨论】:

    • 这不是原因(其他静态链接的 DLL 也在 DllMain 中注册它们的类)。原因是微软在不同的 DLL 中提供了不同版本的 RichEdit(部分不兼容)。他们希望您手动加载 DLL,以便选择您需要的确切版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2011-07-09
    • 2020-12-14
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多