Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дочерние окна предопределённых классов

584
06 июля 2016 года
brodotsky
33 / / 25.01.2004
Я создаю дочернее окно предопределённого класса, допустим, ComboBox.
Создаю без использования ресурсов, динамически, с использованием функции CreateWindow.
Вопрос: как мне обрабатывать сообщения от этого дочернего окна?
Ведь в оконную функцию родительского окна не попадают сообщения от дочернего окна,
а оконную функцию дочернего окна я явным образом не объявляю - окно-то предопределённого класа.
Где обрабатывать сообщения?
1.8K
07 июля 2016 года
Kuzya
184 / / 19.03.2008
ну сделай сначала родительское окно и её оконную процедуру, создавая свои дочерние окна, указывай им своё род.окно.
584
07 июля 2016 года
brodotsky
33 / / 25.01.2004
Цитата: Kuzya
ну сделай сначала родительское окно и её оконную процедуру, создавая свои дочерние окна, указывай им своё род.окно.

Ты не понял, Кузя.

Создать создать родительское окно - не проблема:

 
Код:
MainWindow=CreateWindow (WndClass.lpszClassName,"",
                         WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
                         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT
                         NULL,NULL,Instance,NULL);
Создать дочернее окно - тоже не проблема:
 
Код:
ChildWindow=CreateWindow ("COMBOBOX","",
                          WS_CHILD | WS_VISIBLE,
                          0,0,50,100,
                          MainWindow,NULL,Instance,NULL);
Проблема в том, как обрабатывать сообщения от дочернего окна. Где это делать?
В оконной функции главного окно не получится - туда не попадают сообщения от дочернего окна.
Оконной функции дочернего окна у меня в коде нет, она где-то в системе, потому что окно предопределённого класса.
89K
07 июля 2016 года
mosquit
3 / / 07.07.2016
Попадают, в WM_COMMAND. При этом lParam указывает на комбобокс, от которого пришло сообщение.
В оконной процедуре главного окна добавляем:
Код:
case WM_COMMAND:
        {
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
            HWND h = (HWND)lParam;
            switch (wmId)
            {
            //...
            // обрабатываем другие команды
            //...
            case 0:
                switch(wmEvent)
                {
                    case CBN_SELCHANGE :
                        {
                        int cbindex=ComboBox_GetCurSel((HWND)lParam);
                        char buf[128];
               
                        // Выводим индекс:
                        itoa(cbindex, buf, 16);
                        MessageBoxA(NULL, buf, "Combo index", MB_OK);
                       
                        // Выводим текст:
                        ComboBox_GetLBText((HWND)lParam,cbindex,buf);
                        MessageBoxW(NULL,(LPCWSTR)buf, L"Combo text", MB_OK);

                        break;
                }
                default:
                    break;
            }
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
Смотрим результат.
89K
07 июля 2016 года
mosquit
3 / / 07.07.2016
Прошу прощения, скобка потерялась при копировании.
Но думаю, идея понятна.
584
08 июля 2016 года
brodotsky
33 / / 25.01.2004
Для диалоговых окон работает WM_COMMAND. А для обычных окон, по-моему, нет. Проверю.
1.8K
08 июля 2016 года
Kuzya
184 / / 19.03.2008
создавать динамические окна при этом не понимать "зачем" они, мне кажется нонсенсом, даже когда окна создаются динамически, нужно для них "запасти" - идентификаторы, код для обработки их сообщений, в общем, мы должны понять что тебе надо и чего ты хочешь, тогда и поможем.
584
08 июля 2016 года
brodotsky
33 / / 25.01.2004
Чего-то я напутал, что что-то не работает.
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.
Код:
switch (Message)
  {...
   case WM_COMMAND:
     switch (LOWORD (WP))
       {case COMMAND1:
          ...
        break;
        case COMMAND2:
          ..
        break;
        case 0:
          switch HIWORD (WP)
            {case CBN_SELCHANGE:
               ...
             break;
             case CBN_DBLCLK:
               ...}}
   break;
   ...}
89K
11 июля 2016 года
mosquit
3 / / 07.07.2016
Цитата: brodotsky
Чего-то я напутал, что что-то не работает.
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.

О чем я и говорю.

7
24 июля 2016 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: brodotsky
Всё работает через WM_COMMAND и не важно, простое окно или диалоговое.

Естественно, оно так и должно работать. Тип окна неважен же.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог