C++ 为什么单击编辑框会关闭win32窗口(C+;+;)?

C++ 为什么单击编辑框会关闭win32窗口(C+;+;)?,c++,winapi,C++,Winapi,下面的代码应该创建一个带有菜单、静态文本和编辑框的简单窗口,但当我尝试创建编辑框时,它要么根本不运行(没有错误),要么当它运行时,我尝试单击编辑框,窗口关闭。我真的被卡住了,任何帮助都将不胜感激!边注:我是初学者的WiAPi/GUI的C++,请尊重。 #include <Windows.h> #include <iostream> #define FILE_MENU_NEW 1 #define FILE_MENU_OPEN 2 #define FILE_MENU_EXI

下面的代码应该创建一个带有菜单、静态文本和编辑框的简单窗口,但当我尝试创建编辑框时,它要么根本不运行(没有错误),要么当它运行时,我尝试单击编辑框,窗口关闭。我真的被卡住了,任何帮助都将不胜感激!边注:我是初学者的WiAPi/GUI的C++,请尊重。
#include <Windows.h>
#include <iostream>

#define FILE_MENU_NEW 1
#define FILE_MENU_OPEN 2
#define FILE_MENU_EXIT 3

struct WindowPosition
{
    int x, y = 0;
} winPos;

struct WindowSize
{
    int width = 600;
    int height = 500;
} winSize;

HMENU hMenu;

// Window proc function
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
void addMenus(HWND);
void AddControls(HWND);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int ncmdshow)
{
    WNDCLASSW wc = { 0 };

    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hInstance = hInst;
    wc.lpszClassName = L"myWindowClass";
    wc.lpfnWndProc = WindowProcedure;

    if (!RegisterClassW(&wc))
    {
        return -1;
    }

    CreateWindowW(L"myWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, winPos.x, winPos.y, winSize.width, winSize.height,
        NULL, NULL, NULL, NULL);

    // Window 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:
        if (wp == 1)
        {
            MessageBeep(MB_OK);
        }
        else if (FILE_MENU_EXIT)
        {
            DestroyWindow(hWnd);
        }
        break;
    case WM_CREATE:
        addMenus(hWnd);
        AddControls(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }
}

void addMenus(HWND hWnd)
{
    hMenu = CreateMenu();
    HMENU hFileMenu = CreateMenu();

    AppendMenu(hFileMenu, MF_STRING, FILE_MENU_NEW, L"New");
    AppendMenu(hFileMenu, MF_STRING, FILE_MENU_OPEN, L"Open");
    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, 2, L"Help");

    SetMenu(hWnd, hMenu);
}

void AddControls(HWND hWnd)
{
    CreateWindowW(L"static", L"Username: ", WS_VISIBLE | WS_CHILD, 200, 100, 100, 50, hWnd, NULL, NULL, NULL);
    // This is where the problem is... (When I remove the second parameter and put L"Enter Username") the program does not run at all.
    CreateWindowW(L"edit", NULL, WS_VISIBLE | WS_CHILD, 0, 0, 100, 50, hWnd, NULL, NULL, NULL);
}
#包括
#包括
#定义文件\u菜单\u新建1
#定义文件菜单打开2
#定义文件菜单退出3
结构窗口位置
{
int x,y=0;
}winPos;
结构窗口大小
{
整数宽度=600;
内部高度=500;
}winSize;
华浓华浓;
//窗口进程函数
LRESULT回调窗口过程(HWND、UINT、WPARAM、LPARAM);
无效添加菜单(HWND);
无效控制(HWND);
int WINAPI WinMain(HINSTANCE hInst、HINSTANCE hPrevInst、LPSTR args、int ncmdshow)
{
WNDCLASSW wc={0};
wc.hbrBackground=(HBRUSH)彩色窗口;
wc.hCursor=LoadCursor(空,IDC_箭头);
wc.hInstance=hInst;
wc.lpszClassName=L“myWindowClass”;
wc.lpfnWndProc=窗口过程;
如果(!RegisterClassW(&wc))
{
返回-1;
}
CreateWindowW(L“myWindowClass”,L“My Window”,WS|U重叠窗口| WS|U可见,winPos.x,winPos.y,winSize.width,winSize.height,
空,空,空,空);
//窗口循环
MSG={0};
while(GetMessage(&msg,NULL,NULL,NULL))
{
翻译信息(&msg);
发送消息(&msg);
}
返回0;
}
LRESULT回调窗口过程(HWND HWND、UINT msg、WPARAM wp、LPARAM lp)
{
开关(msg)
{
case WM_命令:
如果(wp==1)
{
MessageBeep(MB_OK);
}
else if(文件菜单退出)
{
窗口(hWnd);
}
打破
案例WM_创建:
添加菜单(hWnd);
AddControls(hWnd);
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProcW(hWnd、msg、wp、lp);
}
}
无效添加菜单(HWND HWND)
{
humenu=CreateMenu();
HMENU hFileMenu=CreateMenu();
附录菜单(hFileMenu、MF_字符串、文件_菜单_NEW、L“NEW”);
附录菜单(hFileMenu、MF_字符串、文件_菜单_打开、L“打开”);
AppendMenu(hFileMenu,MF_分隔符,NULL,NULL);
附录菜单(hFileMenu、MF_字符串、文件_菜单_退出、L“退出”);
附录菜单(菜单、菜单弹出菜单、文件菜单、文件菜单);
附录菜单(menu,MF_STRING,2,L“帮助”);
设置菜单(hWnd、hMenu);
}
无效添加控件(HWND HWND)
{
CreateWindowW(L“静态”,L“用户名:”,WS_可见| WS_子项,200、100、100、50、hWnd、NULL、NULL、NULL);
//这就是问题所在…(当我删除第二个参数并输入L“Enter Username”时),程序根本不运行。
CreateWindowW(L“编辑”,NULL,WS_可见,WS_子对象,0,0,100,50,hWnd,NULL,NULL,NULL);
}

使用
else if(文件菜单退出)
时,此结果始终为真。您可以尝试:

case WM_COMMAND:
    if (wp == 1)
    {
        MessageBeep(MB_OK);
    }
    else if (wp == FILE_MENU_EXIT)
    {
        DestroyWindow(hWnd);
    }
    break;
您还可以使用:

case WM_COMMAND:
    switch (wp)
    {
    case FILE_MENU_NEW:
        MessageBeep(MB_OK);
        break;
    case FILE_MENU_EXIT:
        DestroyWindow(hWnd);
        break;
    }
    break;
else if(文件菜单退出)
始终为真。因此砰的一声关上了你的窗户。也许试着把这个常数和。。。