Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 5

Не отображается дочернее окно MDI при обработке сообщения WM_COMMAND

31.03.2015, 22:54. Показов 1440. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Нужна помощь.
Не могу понять почему не работает именно в WM_COMMAND! Вызываю окно из WM_CREATE все нормально. Окно появляется.
Вообщем мне надо чтобы при выборе меню появлялось окно. Что я делаю не так?

Вот код
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
...
// класс ChildProc
class ChildProc {
TCHAR szChildClass[MAX_LOADSTRING];
public:
virtual BOOL CreateWindowsChild(HWND);
static LRESULT CALLBACK  WndChildProc(HWND, UINT, WPARAM, LPARAM);
//Структура, которая используется при регистрации клиентского окна 
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wc;
 
    wc.cbSize                   = sizeof(WNDCLASSEX);
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc           = WndChildProc;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = sizeof (HANDLE);
    wc.hInstance        = hInstance; 
    wc.hIcon            = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTCLASS)); 
    wc.hCursor              = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground    = (HBRUSH)(COLOR_WINDOW+1);  
    wc.lpszMenuName = NULL; 
    wc.lpszClassName    = szChildClass; 
    wc.hIconSm      = NULL; 
 
    return RegisterClassEx(&wc); 
}
};
// Метод класса ChildProc создание доч. MDI окна
BOOL ChildProc::CreateWindowsChild(HWND hWndClient)
{
  MDICREATESTRUCT     mdicreate;
  MyRegisterClass(hInstChild);
 
  //Создание дочернего окна
  mdicreate.szClass = szChildClass ;
  mdicreate.szTitle = "База данных клиентов" ;
  mdicreate.hOwner  = hInst;
  mdicreate.x       = CW_USEDEFAULT ;
  mdicreate.y       = CW_USEDEFAULT ;
  mdicreate.cx      = 1000 ;
  mdicreate.cy      = 500 ;
  mdicreate.style   = 0;
  mdicreate.lParam  = 0;
 
  hWndChild = (HWND) SendMessage (hWndClient, WM_MDICREATE, 0, (LPARAM) (LPMDICREATESTRUCT) &mdicreate) ;
  return 0;
}
...
 
...
//функции WndProc
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
        static HWND         hWndClient;
        CLIENTCREATESTRUCT  clientcreate ;
    ChildProc okno1;
 
    switch (message)
    {
    case WM_CREATE:
           clientcreate.hWindowMenu  = GetSubMenu(GetMenu(hWnd), 0);
           clientcreate.idFirstChild = 135 ;
           //Клиентская область MDI
           hWndClient = CreateWindow(_T("MDICLIENT"), _T(""),
           WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE |WS_BORDER,
                              0, 0, 0, 0, hWnd, (HMENU) 0, hInst, (LPSTR) &clientcreate) ;
       // выходим, если клиентское окно не создано
           if (!hWndClient)
            {
              MessageBox(hWnd, _T("Невозможно создать клиентскую область."), _T("Ошибка"), MB_OK);
              DestroyWindow(hWnd);
              break;
            }
           return 0;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);   
        // Выбор пункта меню
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_FILE_NEWACCOUNTBASE:
            //DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, Newbase);
            //break;
            // Создание окна (класс ChildProc)     
        [B]okno1.CreateWindowsChild(hWndClient);[/B]
            return 0;
            // Выход из программы
        case IDM_EXIT:
...
Если так, то все ок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
switch (message)
    {
    case WM_CREATE:
           clientcreate.hWindowMenu  = GetSubMenu(GetMenu(hWnd), 0);
           clientcreate.idFirstChild = 135 ;
           //Клиентская область MDI
           hWndClient = CreateWindow(_T("MDICLIENT"), _T(""),
           WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE |WS_BORDER,
                              0, 0, 0, 0, hWnd, (HMENU) 0, hInst, (LPSTR) &clientcreate) ;
       // выходим, если клиентское окно не создано
           if (!hWndClient)
            {
              MessageBox(hWnd, _T("Невозможно создать клиентскую область."), _T("Ошибка"), MB_OK);
              DestroyWindow(hWnd);
              break;
            }
          // Создание окна (класс ChildProc)   
         [B]okno1.CreateWindowsChild(hWndClient);[/B]
         return 0;
    case WM_COMMAND:
...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.03.2015, 22:54
Ответы с готовыми решениями:

MDI и дочернее окно!
Добрый день! Есть некоторый компонент расположенный в РОДИТЕЛЬСКОМ ОКНЕ MDI. Мне надо что бы он изменялся в зависимости от того...

Не закрывается дочернее окно (mdi)
Друзья привет! Помогите разобраться, есть приложение с множеством дочерних окон и нужно закрыть одно по умолчанию оно сворачивается...

MDI Form: Определить активное дочернее окно
Что то я запутался в создаваемых дочерних окнах Есть форма Form1 которая является главной. в ней создаются дочерние формы: ...

1
0 / 0 / 1
Регистрация: 19.06.2013
Сообщений: 5
03.04.2015, 22:45  [ТС]
Разобрался. Проблема оказалась в имени класса szChildClass. Объясните кто может, в чем ее смысл?

Так не работало:
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
...
#define MAX_LOADSTRING 100
...
TCHAR szChildClass[MAX_LOADSTRING];
...
//Метод класса. Создание дочернего окна
BOOL ChildProc::CreateWindowsChild(HWND hWndClient)
{
  MDICREATESTRUCT     mdicreate;
  MyRegisterClass(hInstChild);
 
  //Создание дочернего окна
  mdicreate.szClass = szChildClass ;
  mdicreate.szTitle = "База данных клиентов" ;
  mdicreate.hOwner  = hInst;
  mdicreate.x       = CW_USEDEFAULT ;
  mdicreate.y       = CW_USEDEFAULT ;
  mdicreate.cx      = 1000 ;
  mdicreate.cy      = 500 ;
  mdicreate.style   = 0;
  mdicreate.lParam  = 0;
 
  hWndChild = (HWND) SendMessage (hWndClient, WM_MDICREATE, 0, (LPARAM) (LPMDICREATESTRUCT) &mdicreate) ;
   //CreateMDIWindow(szChildClass, _T("Unknown Document"), 0, CW_USEDEFAULT,0,CW_USEDEFAULT,0,hWndClient, hInst, 0);
  return 0;
}
А когда я инициализировал массив все заработало
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
...
TCHAR szChildClass[]="MdiChild";
...
//Метод класса. Создание дочернего окна
BOOL ChildProc::CreateWindowsChild(HWND hWndClient)
{
  MDICREATESTRUCT     mdicreate;
  MyRegisterClass(hInstChild);
 
  //Создание дочернего окна
  mdicreate.szClass = szChildClass ;
  mdicreate.szTitle = "База данных клиентов" ;
  mdicreate.hOwner  = hInst;
  mdicreate.x       = CW_USEDEFAULT ;
  mdicreate.y       = CW_USEDEFAULT ;
  mdicreate.cx      = 1000 ;
  mdicreate.cy      = 500 ;
  mdicreate.style   = 0;
  mdicreate.lParam  = 0;
 
  hWndChild = (HWND) SendMessage (hWndClient, WM_MDICREATE, 0, (LPARAM) (LPMDICREATESTRUCT) &mdicreate) ;
   //CreateMDIWindow(szChildClass, _T("Unknown Document"), 0, CW_USEDEFAULT,0,CW_USEDEFAULT,0,hWndClient, hInst, 0);
  return 0;
}
Вообщем я не понимаю как на это влияет имя класса. Почему в первоначальном варианте окно появлялось только в WM_CREATE?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2015, 22:45
Помогаю со студенческими работами здесь

Как развернуть дочернее MDI-окно без анимации?
Подскажите плз, как отключить анимацию при разворачивании дочерних окон в MDI. Дело в том, что моя прога может открывать сразу много...

Как отслеживать открыто ли какое либо дочернее окно MDI и как к ним обращаться?
Как отслеживать открыто ли какое либо дочернее окно MDI и как к ним обращаться? и в нете никак не могу найти ответа на этот вопрос, может...

Дочернее окно копируется в не дочернее(хотя не должно)
При нажатии кнопки появляется окно, но вместо того, что бы отрисоваться как надо, в него копируется дочернее окно главного окна. При...

Свои сообщения при обработке исключений
Делаю проверку заполнения textbox и нужно выдать сообщение, если один из них не заполнен Вот мой код, но он выводит сообщение на каждый...

Как создать дочернее окно при нажатии на кнопку?
Как создать дочернее окно при нажатии на кнопку??? Не получается создать дочернее окно, чтобы оно открывалось при нажатии на кнопку в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru