Почему в WINAPI не работает всплывающее меню?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему в WINAPI не работает всплывающее меню?

Сообщение Anonymous »

Сейчас я работаю над настольным приложением для Windows с Windows API. Я новичок в API, поэтому разрабатываю его с помощью визуальной помощи, предоставленной сообществом Visual Studio.
Структура проста: у меня есть главное окно, в которое я помещаю некоторые текстовые поля и меню.
Если я создам окно следующим образом:

Код: Выделить всё

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int cShow) {

MSG msg;
HWND hVentana;

WNDCLASSEX wc;

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = cVentana;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = L"MainWindowClass";
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if (!RegisterClassEx(&wc)) {
MessageBox(NULL, L"Fallo al registrar la clase de ventana.", L"Error", MB_OK | MB_ICONERROR);
return 0;
}

hVentana = CreateWindowEx(0, L"MainWindowClass", L"Emulador", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1600, 900, NULL, NULL, hInst, NULL);

if (!hVentana) {
MessageBox(NULL, L"Fallo al crear la ventana.", L"Error", MB_OK | MB_ICONERROR);
return 0;
}

HMENU hMenu = LoadMenu(hInst, L"IDD_MENU1");     // El menu está definido en resource.rc

SetMenu(hVentana, hMenu);

HWND hTextBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY | ES_AUTOVSCROLL | ES_MULTILINE,
10, 10, 387, 824, hVentana, NULL, GetModuleHandle(NULL), NULL);

HWND hRamBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY | ES_AUTOVSCROLL | ES_MULTILINE,
407, 477, 785, 309, hVentana, NULL, GetModuleHandle(NULL), NULL);

HWND hSearchBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,
407, 796, 785, 38, hVentana, NULL, GetModuleHandle(NULL), NULL);

HWND hTerminalBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY | ES_AUTOVSCROLL | ES_MULTILINE,
407, 60, 785, 405, hVentana, NULL, GetModuleHandle(NULL), NULL);

HWND hRegistrosBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY | ES_AUTOVSCROLL | ES_MULTILINE,
1202, 10, 374, 824, hVentana, NULL, GetModuleHandle(NULL), NULL);

ShowWindow(hVentana, cShow);
UpdateWindow(hVentana);

while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}
Нет проблем.
Изображение

Но если я сделаю это вот так:

Код: Выделить всё

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int cShow) {

MSG msg;
HWND hVentana;
hVentana = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, cVentana);

ShowWindow(hVentana, cShow);
UpdateWindow(hVentana);

while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}
Меню отображается, но если я наведу курсор на какой-либо элемент, опция этого элемента не появится.
Изображение

У меня есть ресурс меню и ресурс диалога:

Код: Выделить всё

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDD_MENU1 MENU
BEGIN
POPUP "Archivo"
BEGIN
MENUITEM "Cargar programa",             ID_LOADPROGRAM
MENUITEM "Cargar campaña",              ID_LOADCAMPAING
MENUITEM "Salir",                       ID_EXIT
END
POPUP "Generar"
BEGIN
MENUITEM "Informe de instrucciones",    ID_GENERAR_INFORMEDEINSTRUCCIONES
MENUITEM "Archivo RAM",                 ID_GENERAR_ARCHIVORAM
END
END

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 1600, 900
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU
CAPTION "Emulador"
MENU IDD_MENU1
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
EDITTEXT        IDC_TEXTBOX,10,10,387,824,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_TABSTOP
EDITTEXT        IDC_RAMBOX,407,477,785,309,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_TABSTOP
EDITTEXT        IDC_SEARCHBOX,407,796,785,38,ES_AUTOHSCROLL | NOT WS_TABSTOP
EDITTEXT        IDC_TERMINALBOX,407,60,785,405,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_TABSTOP
EDITTEXT        IDC_REGISTERSBOX,1202,10,374,824,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_TABSTOP
END
Было бы неплохо иметь все диалоговые окна в файле ресурсов, поэтому, если есть другой способ сделать это, сообщите мне.
ПРИМЕЧАНИЕ. Кроме того, по какой-либо причине, когда я использую первую форму, размеры окна правильные, но если я использую вторую форму, то окно будет больше, чем указанные мной размеры.ПРИМЕЧАНИЕ.>

Подробнее здесь: https://stackoverflow.com/questions/783 ... -in-winapi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»