Следующий код возвращает 0 в wnd
, но сразу после CreateDialog
возникает ошибка ERROR_SUCCESS
. Диалог не появляется, и я не понимаю, как это возможно. Это консольный проект, и диалог создается в vs2013, если это актуально.
#include <windows.h>
#include "resource.h"
int main(){
HWND wnd = CreateDialog(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL);
ShowWindow(wnd, SW_SHOWDEFAULT);
UpdateWindow(wnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Должно быть, это какая-то действительно глупая ошибка, но я этого не вижу.
2 ответа
Сначала вам нужно будет инициализировать библиотеку расширенного редактирования - если библиотека не загружена, элемент управления не будет зарегистрирован и создание диалогового окна завершится ошибкой.
См. Примечание по адресу http://msdn.microsoft.com /en-us/library/windows/desktop/hh298375(v=vs.85).aspx о вызове LoadLibrary
. Это необходимо сделать до создания диалога.
В качестве альтернативы установка стиля DS_NOFAILCREATE
должна позволить создать диалоговое окно, хотя элемент управления Rich Edit не будет отображаться.
GetLastError
вернет ERROR_CANNOT_FIND_WND_CLASS
- если нет, то, вероятно, нет.
Если бы такая же проблема возникла, мой диалог не появлялся, на самом деле отсутствовала загрузка элемента управления RichText2.0.
Вот как я исправил, он должен поддерживать любую версию Windows.
Добавьте это в свой проект
#include <richedit.h> // To use richedit control
//Load RichText4.1 or 2.0/3.0 or 1.0 (last resort) Control first. (3 different DLL's for full support).
//
// FUNCTION: IsWinXPSp1Min()
//
// PURPOSE: Return TRUE if operating sytem is Windows XP SP1 or later.
// Windows XP SP1 is the minimum system required to use a richedit v4.1 but only
// when UNICODE is defined.
//
BOOL IsWinXPSp1Min()
{
OSVERSIONINFO osvi = { sizeof(osvi) };
if (!GetVersionEx(&osvi))
{
return FALSE;
}
// Determine if system is Windows XP minimum
if (osvi.dwMajorVersion >= 5 && osvi.dwMinorVersion >= 1)
{
// Now check if system is specifically WinXP and, if so, what service pack
// version is installed.
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
{
// The following test assumes that the szCSDVersion member of the
// OSVERSIONINFO struct's format will always be a string like
// "Service Pack x", where 'x' is a number >= 1. This is fine for SP1
// and SP2 but future service packs may have a different string
// descriptor.
TCHAR* pszCSDVersion = L"Service Pack 1";
if (osvi.szCSDVersion < pszCSDVersion)
{
return FALSE;
}
}
return TRUE;
}
return FALSE;
}
//
// FUNCTION: GetRichEditClassName()
//
// PURPOSE: Load the proper version of RichEdit and return the class name.
//
PCWSTR GetRichEditClassName()
{
HINSTANCE hLib;
// Try to load latest version of rich edit control. Since v4.1 is available
// only as an UNICODE control on a minimum of Windows XP with service pack 1
// installed, use preprocessor conditional to ensure that an attempt to load
// Msftedit.dll is only made if UNICODE is defined.
#if defined UNICODE
if (IsWinXPSp1Min())
{
// Try to get richedit v4.1, explicitly use wide character string as this
// is UNICODE only.
hLib = LoadLibrary(L"msftedit.dll");
if (hLib)
{
return MSFTEDIT_CLASS;
}
}
#endif
// Cannot get latest version (v4.1) so try to get earlier one
// Rich Edit Version 2.0/3.0
hLib = LoadLibrary(L"riched20.dll");
if (hLib)
{
// Version 2.0/3.0 is good
return RICHEDIT_CLASS;
}
// Rich Edit Version 1.0
hLib = LoadLibrary(L"riched32.dll");
if (hLib)
{
// Version 1.0 is good
return L"RichEdit";
}
// Cannot get any versions of RichEdit control (error)
return L"";
}
Файл resource.h
#define IDC_RICHEDIT 3990
Создайте фактический элемент управления RichEdit
// // FUNCTION: OnInitRichEditDialog(HWND, HWND, LPARAM) // // PURPOSE: Process the WM_INITDIALOG message // BOOL OnInitRichEditDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
RECT rc = { 20, 20, 160, 250 };
HWND hRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE, GetRichEditClassName(),
L"RichEdit Control",
ES_MULTILINE | ES_AUTOHSCROLL | WS_HSCROLL | ES_AUTOVSCROLL |
WS_VSCROLL | WS_CHILD | WS_VISIBLE,
rc.left, rc.top, rc.right, rc.bottom,
hWnd, reinterpret_cast<HMENU>(IDC_RICHEDIT), g_hInst, 0);
if (hRichEdit)
{
SendMessage(hRichEdit, WM_SETFONT, reinterpret_cast<WPARAM>(g_hFont), TRUE);
}
return TRUE; }
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
RichEdit20A
.LoadLibrary
. В качестве альтернативы установка стиля DS_NOFAILCREATE должна разрешить создание диалогового окна, хотя элемент управления расширенным редактированием не будет отображаться.Riched20.dll
помогла, спасибо! Жаль, что визуальная студия не сказала бы что-нибудь об этом. Отправьте это как ответ, и я приму это. Кстати, это было невероятное предположение :D