pal4yth Ответов: 2

Не удается закрыть окно сообщения


я использую vs2010, создаю приложение win32, добавляю диалоговый ресурс idd_dialog1 . запустите exe-файл, нажмите кнопку ОК ,затем покажите окно сообщения ,но я не могу закрыть messagebox, он не отвечает на мои клики.

вот мой код:
 #include "stdafx.h"
#include "testdlg.h"
 
#define MAX_LOADSTRING 100
 
// 全局变量:
HINSTANCE hInst;                                // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
 
BOOL                InitInstance(HINSTANCE, int);
INT_PTR CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    MSG msg;
 
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!IsDialogMessage(msg.hwnd,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // 将实例句柄存储在全局变量中
 
   hWnd =CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WndProc);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
INT_PTR CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);

        switch (wmId)
        {
        case IDOK:
            MessageBox(hWnd,_T("can no close!"),_T("confused!"),MB_OK);
            break;
        case IDCANCEL:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);

        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


Что я уже пробовал:

я использую функцию isdialogmessage, но она не имеет никакого эффекта.

[no name]

Попробуйте с помощью этой функции MessageBox(null,в то _t("не закрывать!"),То _t("перепутал!"),MB_OK);

2 Ответов

Рейтинг:
2

Richard MacCutchan

Ваш пример создает немодальный диалог, который требует другой обработки, чем модальный тип. Видеть немодальное диалоговое окно[^] относительно деталей.


Tacitonitus

Он уже обрабатывает его как немодальное диалоговое окно - можете ли вы сказать "DefWindowProc"?

Рейтинг:
1

Tacitonitus

Ну, на первый взгляд кажется, что в вашем коде нет ничего плохого. Однако:

1) читать (или перечитывать) Функция GetMessage (Windows) - в частности, там, где говорится: "избегайте такого кода" (подсказка: у вас есть код "вот так").
2) убейте случай WM_PAINT - он ничего не делает.
3) Добавьте регистр для сообщения WM_INITDIALOG в обработчик диалогового окна и перенесите в него вызовы ShowWindow() и UpdateWindow ().

И последнее, но не менее важное: обработка цикла GetMessage-это сложная вещь. Функция GetMessage () может возвращать -1 при ошибке - ваш код с этим не справляется. Кроме того, msg.hwnd может быть NULL, который ваш код также не обрабатывает.

Похоже, что большая часть кода, который вы показали, взята непосредственно из примеров, предоставленных онлайн Microsoft - ну, это не значит, что код действительно работает - я просто оставлю его на этом.

Конечно, это всего лишь предположения. Возможно, происходит что-то еще, о чем я не могу знать..