Rich Edit Control в необработанном Win32

Действительно ли документация для Rich Edit Controls такая плохая (неправильная?), Как кажется? Прямо сейчас я вручную вызываю LoadLibrary ("riched20.dll"), чтобы отобразить Rich Edit Control. Документация по 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);

person user16408    schedule 17.09.2008    source источник


Ответы (4)


Используя MFC, элементы управления RichEdit просто работают.

Загрузка с помощью InitCommonControlsEx () - ICC_USEREX_CLASSES не загружает RichEdit AFAIK, он вам не нужен, поскольку он выполняет только «стандартные» общие элементы управления, которые не включают richedit. Очевидно, вам нужно вызвать это только для включения «визуальных стилей» в Windows, а не для работы RichEdits.

Если вы используете 2008, вы хотите включить Msftedit.dll и использовать вместо него MSFTEDIT_CLASS (иногда MS - мусор для обратной совместимости).

docs действительно предполагают, что вы делать это правильно для программирования Win32.

person gbjbaanb    schedule 17.09.2008
comment
Нет, вы все еще можете использовать его для приложений ANSI, но он поддерживает уведомление WM_UNICHAR для отправки текста Unicode в / из него в приложении ANSI. - person gbjbaanb; 18.09.2008
comment
MSFTEDIT_CLASS только для приложений Unicode: Да. В VC2012 MFC MSFTEDIT_CLASS используется, если программа скомпилирована с _UNICODE. Если _UNICODE не определен, используется RICHEDIT_CLASS. - person linquize; 17.05.2013

Много лет назад я столкнулся с той же проблемой, и да, ответ заключался в том, чтобы загрузить .dll вручную. Причина, насколько я помню, в том, что класс окна RichEdit зарегистрирован в DllMain файла riched20.dll.

person Brannon    schedule 17.09.2008
comment
Причина не в этом (другие статически связанные библиотеки DLL также регистрируют свои классы в DllMain). Причина в том, что Microsoft предоставляет разные версии RichEdit (частично несовместимые) в разных библиотеках DLL. Они хотят, чтобы вы загрузили DLL вручную, чтобы выбрать именно ту версию, которая вам нужна. - person Krishty; 27.04.2021

Нет ли библиотеки импорта (возможно, riched20.lib), на которую вы можете ссылаться. Тогда вам не придется загружать его «вручную» во время выполнения. Так работают все стандартные элементы управления. VS автоматически добавляет ссылку на user32.lib при создании проекта.

person Ferruccio    schedule 17.09.2008
comment
К сожалению, в настоящее время Windows SDK поставляется без riched20.lib. MS заявляет здесь, что для динамической загрузки библиотеки. - person Krishty; 25.04.2021

Я думаю, вам нужно вызвать CoInitializeEx, прежде чем создавать какие-либо общие элементы управления.

LoadLibrary не требуется. Если вы установите ссылку на правильный файл .lib, exe-загрузчик позаботится о таких деталях за вас.

person Nils Pipenbrinck    schedule 17.09.2008
comment
CoInitializeEx () необходим для инициализации COM. Это не требуется для общих элементов управления win32. Возможно, вы думали об InitCommonControlsEx (). - person Ferruccio; 17.09.2008