Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335

После создания диалога MessageBox-ы перестают закрываются

23.08.2012, 10:14. Показов 2078. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю основное окно, не показываю его (без ShowWindow), инициализирую WinSock2, затем в WM_CREATE создаю диалог-немодальный (и в InitInstance пробовал), где уже выводятся MessageBox. Дело в том, что после создания диалога MessageBox перестают закрываются. На кнопки не реагирует совсем :< Пытался указывать и handle главное окна, и диалога, и 0, ничего :<

Вот стандартная функция инициализации :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; 
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
MessageBox(hWnd, _T("Can't initialaze WinSock library"), _T("Error"), MB_OK); // работает
   if (!hWnd)
   {
      return FALSE;
   }
   UpdateWindow(hWnd);
 
   hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_NETSETTINGS), hWnd, DlgProc);
MessageBox(hDlg, _T("Can't initialaze WinSock library"), _T("Error"), MB_OK); // Хренас-два
   return TRUE;
}
Так же есть ли разница, какой использовать messagebox в WndProc? Имею ввиду, если у меня есть две переменный HWND - одна глобальная при инициализации, другая локальная в самой функции WndProc. Вот messagebox'ы. Одинаковы ли они?
MessageBox(hWndInProc, _T("Can't initialaze WinSock library"), _T("Error"), MB_OK);
MessageBox(hWnd, _T("Can't initialaze WinSock library"), _T("Error"), MB_OK);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.08.2012, 10:14
Ответы с готовыми решениями:

После создания диалога остальные окна неактивны
Всем привет После того как создается диалог, все остальные окна отказываются работать и &quot;отвечать&quot; на какие-либо нажатия...

MessageBox, созданный из диалога, не реагирует на нажатия кнопок
Шестая студия. MessageBox, созданный из диалога, не реагирует на нажатия кнопок. В чём может быть дело? В проекте: —...

Два раза открывается MessageBox.Show после второго вызова MessageBox
Здравствуйте! Подскажите пожалуйста... Мне вот надо было сделать диалоговое окно для ввода данных для бегущей строки. Кроме этого,...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
23.08.2012, 10:23
Во-первых, попробуй на чистом проекте (без инициализаций WinSock2, просто создание окна, по WM_CREATE - вызов CreateDialog, на диалоге - кнопка, выбрасывающая MessageBox), если проблема воспроизводится - показывай код. У меня повторить не получилось.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.08.2012, 10:46  [ТС]
Таки да, где-то ошибка в этом коде.
InitInstance
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; 
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }
   UpdateWindow(hWnd);
 
   hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_NETSETTINGS), hWnd, DlgProc);
   MessageBox(hDlg, _T("Can't initialaze WinSock library"), _T("Error"), MB_OK);
    ShowWindow(hDlg, TRUE);
 
   return TRUE;
}

DlgProc
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
INT_PTR CALLBACK DlgProc(HWND hDlgProc, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    BOOL ServerStatus;
 
    switch (message)
    {
    case WM_INITDIALOG :
        SetDlgItemText(hDlgProc, IDC_IP, _T("127.0.0.1"));
        SetDlgItemInt(hDlgProc, IDC_PORT, 23423, FALSE);
        SetDlgItemInt(hDlgProc, IDC_USERSMAX, 10, FALSE);
        //ShowWindow(hDlgProc, TRUE);
        ServerSocket = INVALID_SOCKET;
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
        case IDB_START :
            ServerStatus = -1;//ServerStart();
            switch (ServerStatus)
            {
            case SERVER_ERROR_PORT :
                MessageBox(hDlgProc, _T("Can't get a port"), _T("Error"), MB_OK);
                break;  
            case SERVER_ERROR_BIND :
                MessageBox(hDlgProc, _T("Can't bind to the socket"), _T("Error"), MB_OK);
                break;
            case SERVER_ERROR_SOCKET :
                MessageBox(hDlgProc, _T("Can't create a socket"), _T("Error"), MB_OK);
                break;
            case SERVER_ERROR_THREAD :
                MessageBox(hDlgProc, _T("Can't start a thread"), _T("Error"), MB_OK);
                break;
            case SERVER_SUCCESS :
                SetWindowText(hDlgProc, ServerWorking);
                break;
            }
            break;
        case IDB_STOP :
            ServerStop();
            ServerStatus = FALSE;
            SetWindowText(hDlgProc, ServerIdle);
            break;
        case IDM_EXIT:
            DestroyWindow(hDlgProc);
            break;
        default:
            return DefWindowProc(hDlgProc, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hDlgProc, &ps);
        EndPaint(hDlgProc, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hDlgProc, message, wParam, lParam);
    }
    return 0;
}

Вот что нашел - если ShowWindow, относящуюся к диалогу поставить в InitInstance после messagebox (он лишь для проверки там), то первый messagebox отрабатывает нормально, а остальные (те, что вызываются в DlgProc) уже не работают. Если showwindow оставить в инициализации диалога, то не отрабатывает и первый messagebox.
Так же тут видно, что я уже в конец запутался в hDlg и hDlgProc :< Не важно, что использовать? Они ведь на одно и то же указывают?

Добавлено через 4 минуты
Нашел ответ. Дело в .. копипасте.. Поставил DefWindowProc функцию в Dialog >_<"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2012, 10:46
Помогаю со студенческими работами здесь

Функция создания диалога в DLL
Доброе утро! В библиотеке пишу функцию function OpenDlg(filterStr: string): string; var opnDlg: TOpenDialog; begin ...

Как сделать камеру дочерним объектом после создания другого объекта, или отображение сцены после создания самой камеры?
Есть кнопка при нажатии на неё создается куб ( с помощью Instantiate) как сделать камеру дочерним объектом после того как создался куб на...

Папки не закрываются после открытия
Здравствуйте! Помогите пожалуйста разобраться! Новый ПК, м/плата Gigabate GA-H81M-S1. Установила Windows XP SP3. При входе в систему...

Программы закрываются сразу после открытия
Собственно вся проблема написана в заголовке. Как решить данную проблему?

Программы закрываются сразу после открытия
В заголовке изложена вся суть проблемы. Надеюсь на вашу помощь:)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru