繁体   English   中英

WIN32:C++,为什么在WM_CLOSE上调用Messagebox function 程序死机

[英]WIN32:C++, why is calling the Messagebox function on WM_CLOSE The program is freezing

我正在学习如何使用 Visual C++ 创建 Windows 桌面应用程序。 我正在创建一个什么都不做的简单 window,当我按下关闭按钮时,我想显示一个消息框以确认我真的想在关闭 window 之前关闭它。 因此,当我收到 WM_CLOSE 消息时,我尝试使用消息框 function 执行此操作,但由于某种原因,程序冻结并且无法关闭。 对不起,有人可以帮帮我吗? 来源如下。 谢谢您的帮助。

#include<Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

TCHAR szClassName[] = TEXT("winapp");       

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) {                                                       
    MSG msg;
    BOOL bRet;
    if(!InitApp(hCurInst))
        return FALSE;
    if (!InitInstance(hCurInst, nCmdShow))
        return FALSE;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            MessageBox(NULL, TEXT("GetMessageエラー"), TEXT("Error"), MB_OK);
            break;
        }
        else {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }
    }
    return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst) {
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;     
    wc.lpfnWndProc = WndProc;   
    wc.cbClsExtra = 0;      
    wc.cbWndExtra = 0;                  
    wc.hInstance = hInst;               
    wc.hIcon = (HICON)LoadImage(                
        NULL,                                   
        MAKEINTRESOURCE(IDI_APPLICATION),   
        IMAGE_ICON,                             
        0,                                          
        0,                                  
        LR_DEFAULTSIZE | LR_SHARED);            
    wc.hCursor = (HCURSOR)LoadImage(        
        NULL,           
        MAKEINTRESOURCE(IDC_ARROW),                 
        IMAGE_CURSOR, 
        0, 
        0,
        LR_DEFAULTSIZE | LR_SHARED);        
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    wc.lpszMenuName = NULL;                     
    wc.lpszClassName = szClassName;             
    wc.hIconSm = (HICON)LoadImage(                  
        NULL,
        MAKEINTRESOURCE(IDI_APPLICATION), 
        IMAGE_ICON,
        0, 
        0, 
        LR_DEFAULTSIZE | LR_SHARED);

    return (RegisterClassEx(&wc));
}

BOOL InitInstance(HINSTANCE hInst, int nCmdShow) {
    HWND hWnd;                          
    hWnd = CreateWindow(
        szClassName,                    
        TEXT("Winapp"),                     
        WS_OVERLAPPEDWINDOW,            
        CW_USEDEFAULT,                  
        CW_USEDEFAULT,  
        CW_USEDEFAULT,      
        CW_USEDEFAULT,      
        NULL,                   
        NULL,                       
        hInst,          
        NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
    int id;

    switch (msg){
    case WM_CLOSE:
        id = MessageBox(hWnd,TEXT("終了してもよろしいですか?"),TEXT("終了確認"),MB_YESNO | MB_ICONQUESTION);
        if(id==IDYES){
            DestroyWindow(hWnd);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return (DefWindowProc(hWnd, msg, wp, lp));
    }
    return 0;
}

尝试在您的程序中明确使用 unicode。 例如使用 MessageBoxW 而不是 MessageBox 和 L"终了してもよろしいですか?" 而不是 TEXT("终了してもよろしいですか?") 并稍微更改您的 windowproc:


#include<Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

TCHAR szClassName[] = TEXT("winapp");       

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) {                                                       
    MSG msg;
    BOOL bRet;
    if(!InitApp(hCurInst))
        return FALSE;
    if (!InitInstance(hCurInst, nCmdShow))
        return FALSE;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            MessageBoxW(NULL, L"GetMessageエラー", L"Error", MB_OK);
            break;
        }
        else {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }
    }
    return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst) {
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;     
    wc.lpfnWndProc = WndProc;   
    wc.cbClsExtra = 0;      
    wc.cbWndExtra = 0;                  
    wc.hInstance = hInst;               
    wc.hIcon = (HICON)LoadImage(                
        NULL,                                   
        MAKEINTRESOURCE(IDI_APPLICATION),   
        IMAGE_ICON,                             
        0,                                          
        0,                                  
        LR_DEFAULTSIZE | LR_SHARED);            
    wc.hCursor = (HCURSOR)LoadImage(        
        NULL,           
        MAKEINTRESOURCE(IDC_ARROW),                 
        IMAGE_CURSOR, 
        0, 
        0,
        LR_DEFAULTSIZE | LR_SHARED);        
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
    wc.lpszMenuName = NULL;                     
    wc.lpszClassName = szClassName;             
    wc.hIconSm = (HICON)LoadImage(                  
        NULL,
        MAKEINTRESOURCE(IDI_APPLICATION), 
        IMAGE_ICON,
        0, 
        0, 
        LR_DEFAULTSIZE | LR_SHARED);

    return (RegisterClassEx(&wc));
}

BOOL InitInstance(HINSTANCE hInst, int nCmdShow) {
    HWND hWnd;                          
    hWnd = CreateWindow(
        szClassName,                    
        TEXT("Winapp"),                     
        WS_OVERLAPPEDWINDOW,            
        CW_USEDEFAULT,                  
        CW_USEDEFAULT,  
        CW_USEDEFAULT,      
        CW_USEDEFAULT,      
        NULL,                   
        NULL,                       
        hInst,          
        NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
    int id;

    switch (msg){
    case WM_CLOSE:
        id = MessageBoxW(hWnd,L"終了してもよろしいですか?", L"終了確認",MB_YESNO | MB_ICONQUESTION);
        if(id==IDYES){
            DestroyWindow(hWnd);
        }
        return 0;
        

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
        
    }
    return (DefWindowProc(hWnd, msg, wp, lp));
}

如果您尝试按下关闭按钮,但 MessageBox 没有弹出。 尝试按 ALT 键,看看它是否弹出。 我建议您处理 WM_PAINT 消息以确保处理绘图消息。

代码:

#include<Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

TCHAR szClassName[] = TEXT("winapp");

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) {
    MSG msg;
    BOOL bRet;
    if (!InitApp(hCurInst))
        return FALSE;
    if (!InitInstance(hCurInst, nCmdShow))
        return FALSE;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            MessageBox(NULL, TEXT("GetMessageエラー"), TEXT("Error"), MB_OK);
            break;
        }
        else {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }
    }
    return (int)msg.wParam;
}

ATOM InitApp(HINSTANCE hInst) {
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInst;
    wc.hIcon = (HICON)LoadImage(
        NULL,
        MAKEINTRESOURCE(IDI_APPLICATION),
        IMAGE_ICON,
        0,
        0,
        LR_DEFAULTSIZE | LR_SHARED);
    wc.hCursor = (HCURSOR)LoadImage(
        NULL,
        MAKEINTRESOURCE(IDC_ARROW),
        IMAGE_CURSOR,
        0,
        0,
        LR_DEFAULTSIZE | LR_SHARED);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szClassName;
    wc.hIconSm = (HICON)LoadImage(
        NULL,
        MAKEINTRESOURCE(IDI_APPLICATION),
        IMAGE_ICON,
        0,
        0,
        LR_DEFAULTSIZE | LR_SHARED);

    return (RegisterClassEx(&wc));
}

BOOL InitInstance(HINSTANCE hInst, int nCmdShow) {
    HWND hWnd;
    hWnd = CreateWindow(
        szClassName,
        TEXT("Winapp"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInst,
        NULL);
    if (!hWnd)
        return FALSE;
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
    int id;
    PAINTSTRUCT ps;
    switch (msg) {
    case WM_PAINT:
        BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_CLOSE:
        id = MessageBox(hWnd, TEXT("終了してもよろしいですか?"), TEXT("終了確認"), MB_YESNO | MB_ICONQUESTION);
        if (id == IDYES) {
            DestroyWindow(hWnd);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return (DefWindowProc(hWnd, msg, wp, lp));
    }
    return 0;
}

更多参考: 为什么不显示消息框?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM