КомандБар(или МенюБар?) - это не дочернее окно?

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
Const_ptr
Новенький (0 lvl)
Сообщения: 7
Зарегистрирован: Сб июл 21, 2007 12:35

КомандБар(или МенюБар?) - это не дочернее окно?

Сообщение Const_ptr » Сб июл 21, 2007 12:44

Делалось всё на wm2003se smartphone. Такчто это не совсем КПК.
КомандБар(или МенюБар?) - это не дочернее окно чтоли?
Проблема: Есть окно. Нужно обрабатывать только его сообщения.

В MSDN написано:
The GetMessage function only retrieves messages associated with the window identified by the hWnd parameter or any of its children

И это действительно так .Но для командБара это почемуто не работает.

Тоесть если задать в GetMessage не НУЛЛ в качестве ХВНД, а ХВНД
окна, то сообщения КоммандБара не обрабатываются. Он вобще не реагирует на нажатие кнопок.

Причём ЛистВью, который я тоже создаю на моём окне работает нормально.

Может быть, то что я скажу сейчас в порядке вещей, но у меня это вызывает сомнения:
HWND, который я получаю при создании главного окна не совпадаес с HWND, который приходит
в функцию LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),
этого же окна. И если я при создании КоммандБара в структуре SHMENUBARINFO в качестве hwndParent
Указываю HWND, который получил при создании окна - КоммандБар вообще не создаётся.
А вот если указать тот HWND, который приходит в функцию, то создаётся. Это нормально?

И что делать?

sshd
Нобелевский лауреат (7 lvl)
Сообщения: 2159
Зарегистрирован: Вс мар 19, 2006 15:55

Сообщение sshd » Сб июл 21, 2007 12:53

Const_ptr писал(а):HWND, который я получаю при создании главного окна не совпадаес с HWND, который приходит
в функцию LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),
этого же окна
совпадает
Const_ptr писал(а):И если я при создании КоммандБара в структуре SHMENUBARINFO в качестве hwndParent
Указываю HWND, который получил при создании окна - КоммандБар вообще не создаётся
создаётся
Const_ptr писал(а):The GetMessage function only retrieves messages associated with the window identified by the hWnd parameter or any of its children

И это действительно так .Но для командБара это почемуто не работает.
menubar - это не child твоего окна.
Samsung GT-S8500 + MicroSD 8Gb

Const_ptr
Новенький (0 lvl)
Сообщения: 7
Зарегистрирован: Сб июл 21, 2007 12:35

Сообщение Const_ptr » Сб июл 21, 2007 16:20

совпадает
создаётся
Вот создал простой проэкт в Visual Studio 2005
>>http://ifolder.ru/2742283 (11.74 кб)
Что я там неправильно делаю?

sshd
Нобелевский лауреат (7 lvl)
Сообщения: 2159
Зарегистрирован: Вс мар 19, 2006 15:55

Сообщение sshd » Сб июл 21, 2007 17:19

Const_ptr
WM_CREATE вызывается _до_ выхода из CreateWindow, соответственно g_hWnd внутри WM_CREATE будет ещё не инициализирован.
и в SHCreateMenubar надо соответственно передавать то, что нужно, а не g_hWnd, в котором неизвестно что.
а вообще, если это пофиксить, то прога работает.
Samsung GT-S8500 + MicroSD 8Gb

Const_ptr
Новенький (0 lvl)
Сообщения: 7
Зарегистрирован: Сб июл 21, 2007 12:35

Сообщение Const_ptr » Сб июл 21, 2007 18:04

menubar - это не child твоего окна.
WM_CREATE вызывается _до_ выхода из CreateWindow
Спасибо за разъяснение.

И тогда у меня следующий вопрос:
Нужно создать модальное окно(не используя DialogBox).
Что бы это сделать, нужно, как я понимаю, обрабатывать messageloop
в этом окне.
На этом модальном окне есть меню бар. Дак вот как так обрабатывать messageloop и для меню бара и для окна одновременно?

Т.к если указать в messageloop модального окна в функцию GetMessage NULL как HWND, то будут обрабатываться также и сообщения вызывающего(немодального) окна, даже если оно запрещено функцией EnableWindow.

Конечно, можно использовать модальный диалог, но хотелось бы именно создавать модальное окно самому.

sshd
Нобелевский лауреат (7 lvl)
Сообщения: 2159
Зарегистрирован: Вс мар 19, 2006 15:55

Сообщение sshd » Сб июл 21, 2007 21:45

Const_ptr писал(а):Т.к если указать в messageloop модального окна в функцию GetMessage NULL как HWND, то будут обрабатываться также и сообщения вызывающего(немодального) окна, даже если оно запрещено функцией EnableWindow.
именно так.
т.е. ноль в качестве hwnd.
должны обрабатываться все сообщения
Samsung GT-S8500 + MicroSD 8Gb

Const_ptr
Новенький (0 lvl)
Сообщения: 7
Зарегистрирован: Сб июл 21, 2007 12:35

Сообщение Const_ptr » Сб июл 21, 2007 23:43

должны обрабатываться все сообщения.
Да неее... А мне какраз надо обрабатывать не все, а только модального окна и его менюбара.
А главное окно, которое вызывает это модальное, должно зависнуть на это время, а после закрытия модального окна должно продолжить работу.
Т.е в ГЛАВНОМ окне такая штука:

Код: Выделить всё

   	case IDM_KKK:{
                   ShowModalWindow(hinstance)
	       MessageBox(hWnd,L"Закрыто",L"Всё!",MB_OK);
	break;
            }
Дак вот Мессадж бокс должен вызываться только после закрытия модального окна, а если в мессаджлупе модального окна в параметр ХВНД передать НУЛЛ, то мессаджбокс вызовется ещё до закрытия модального окна, а МНЕ ЭТО НЕ НАДО!
Дак как же обрабатывать мессаги для модального окна и его менюбара НЕ ОБРАБАТЫВАЯ мессаги ГЛАВНОГО окна?

sshd
Нобелевский лауреат (7 lvl)
Сообщения: 2159
Зарегистрирован: Вс мар 19, 2006 15:55

Сообщение sshd » Вс июл 22, 2007 00:45

Const_ptr писал(а):Да неее... А мне какраз надо обрабатывать не все, а только модального окна и его менюбара
что-то не представляю, зачем такое может быть нужно.
Const_ptr писал(а):А главное окно, которое вызывает это модальное, должно зависнуть на это время, а после закрытия модального окна должно продолжить работу
вообще-то зависшее окно - это ненормальная ситуация.
в десктопной винде в таких случаях винда будет в task manager'е писать "не отвечает".
Const_ptr писал(а):Дак вот Мессадж бокс должен вызываться только после закрытия модального окна, а если в мессаджлупе модального окна в параметр ХВНД передать НУЛЛ, то мессаджбокс вызовется ещё до закрытия модального окна
это каким образом, интересно знать?
чудес не бывает. если выполняется код, находящийся в другой функции, то каким образом поток вдруг оттуда вывалится и выдаст сообщение?
Samsung GT-S8500 + MicroSD 8Gb

Const_ptr
Новенький (0 lvl)
Сообщения: 7
Зарегистрирован: Сб июл 21, 2007 12:35

Сообщение Const_ptr » Вс июл 22, 2007 12:16

ОУУОУОУОУОУОУОООООЙ.
sshd
Слушай, спасибо тебе... Блин. Разобрался наконец. Теперь уже
даже и незнаю, как так у меня получалось :) . Короче запутался я.
Ну спасибо, что помог.

Но всё-таки значит обрабатывать только одно окно и его менюбар, не обрабатывая др. окно тогоже приложения нельзя? Или всё-таки можно?

sshd
Нобелевский лауреат (7 lvl)
Сообщения: 2159
Зарегистрирован: Вс мар 19, 2006 15:55

Сообщение sshd » Вс июл 22, 2007 15:20

Const_ptr писал(а):Но всё-таки значит обрабатывать только одно окно и его менюбар, не обрабатывая др. окно тогоже приложения нельзя? Или всё-таки можно?
да можно-то всё что угодно, но только зачем?
Samsung GT-S8500 + MicroSD 8Gb

Закрыто

Вернуться в «Программирование для КПК»