概要
在下面的行中调用时,使用实例化的 GUI 菜单栏会AppendMenu消失。CreateWindowW
CreateWindowW(L"Edit", L"...", WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL, 200, 152, 100, 50, hWnd, NULL, NULL, NULL);
此调用CreateWindowW创建一个文本输入框。
以下两个图像显示了带有 (1) 和没有 (2) 注释掉上述代码行的 GUI 窗口。
代码
#include <Windows.h>
#include <sal.h>
constexpr auto FILE_DROPDOWN_ID = 1;
constexpr auto HELP_POPUP_ID = 2;
constexpr auto LOAD_DROPDOWN_ID = 3;
constexpr auto LOAD_TSD_NO_OFFSET = 4;
constexpr auto FILE_MENU_EXIT = 5;
constexpr auto CHANGE_TITLE = 6;
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
void AddMenus(HWND);
void AddControls(HWND);
void AddMenusAndControls(HWND);
HMENU hMenu;
//int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow) {
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) {
//MessageBox(NULL, L"Upconverter Start up", L"Please load your file", MB_OK);
WNDCLASSW wc = { 0 };
wc.hbrBackground = (HBRUSH)COLOR_WINDOW; // Define window background
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hInstance = hInstance;
wc.lpszClassName = L"myWindowClass";
wc.lpfnWndProc = WindowProcedure;
if (!RegisterClassW(&wc)) // Pass as reference because arg is type pointer
return -1;
CreateWindowW(L"myWindowClass", L"My Window Name", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 200, 500, 500,
NULL, NULL, NULL, NULL);
// Event driven loop
MSG msg = { 0 };
while (GetMessage(&msg, NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg)
{
case WM_COMMAND: // Triggered for every button or menu item. Tells us that something has been clicked.
switch (wp) // This switch statement governs the resultant behavior of a button press on the main window.
{
//case FILE_DROPDOWN_ID:
//MessageBeep(MB_DEFBUTTON1);
case HELP_POPUP_ID:
MessageBeep(MB_DEFBUTTON2);
case FILE_MENU_EXIT:
DestroyWindow(hWnd);
case LOAD_DROPDOWN_ID:
MessageBeep(MB_ICONINFORMATION);
break;
case CHANGE_TITLE:
break;
}
case WM_CREATE:
//AddControls(hWnd);
//AddMenus(hWnd);
AddMenusAndControls(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefMDIChildProcW(hWnd, msg, wp, lp);
}
}
void AddMenusAndControls(HWND hWnd) {
hMenu = CreateMenu();
HMENU hFileMenu = CreateMenu();
HMENU hSubMenu = CreateMenu();
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, L"File");
AppendMenu(hFileMenu, MF_STRING, LOAD_DROPDOWN_ID, L"New");
AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Open Submenu");
AppendMenu(hSubMenu, MF_STRING, CHANGE_TITLE, L"Change Title");
AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL);
AppendMenu(hFileMenu, MF_STRING, FILE_MENU_EXIT, L"Exit");
AppendMenu(hMenu, MF_STRING, HELP_POPUP_ID, L"Help");
CreateWindowW(L"static", L"Enter text here: ", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 200, 100, 100, 50, hWnd, NULL, NULL, NULL);
CreateWindowW(L"Edit", L"...", WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL, 200, 152, 100, 50, hWnd, NULL, NULL, NULL); // WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL
SetMenu(hWnd, hMenu);
}
void AddMenus(HWND hWnd) {
hMenu = CreateMenu();
HMENU hFileMenu = CreateMenu();
HMENU hSubMenu = CreateMenu();
AppendMenu(hSubMenu, MF_STRING, CHANGE_TITLE, L"Change Title");
AppendMenu(hFileMenu, MF_STRING, LOAD_DROPDOWN_ID, L"New");
AppendMenu(hFileMenu, MF_POPUP, (UINT_PTR)hSubMenu, L"Open Submenu");
AppendMenu(hFileMenu, MF_SEPARATOR, NULL, NULL);
AppendMenu(hFileMenu, MF_STRING, FILE_MENU_EXIT, L"Exit");
AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, L"File");
AppendMenu(hMenu, MF_STRING, HELP_POPUP_ID, L"Help");
SetMenu(hWnd, hMenu);
}
void AddControls(HWND hWnd) {
CreateWindowW(L"static", L"Enter text here: ", WS_VISIBLE | WS_CHILD | WS_BORDER | SS_CENTER, 200, 100, 100, 50, hWnd, NULL, NULL, NULL);
CreateWindowW(L"Edit", L"...", WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL, 200, 152, 100, 50, hWnd,
NULL, NULL, NULL); // WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL
}
讨论
我怀疑它与hWnd允许覆盖窗口内容的窗口句柄有关。所以我改变了之前的两遍hWnd
case WM_CREATE:
AddControls(hWnd);
AddMenus(hWnd);
到单个函数调用。
case WM_CREATE:
AddMenusAndControls(hWnd);
但这没有效果。它也可能与SetMenu但以何种方式有关,我不确定。我尝试将呼叫移动到也没有效果SetMenu的不同线路。AddMenusAndControls
这里发生了什么?
感谢您的帮助。

