Меню+фокус
От: __Ranger  
Дата: 11.04.04 16:07
Оценка:
Каким образом можно повторить поведение виндовых менюшек? Т. е при появлении моего окна фокус должен оставаться неизменным.
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re: Меню+фокус
От: Frostbitten Россия  
Дата: 11.04.04 19:48
Оценка:
Здравствуйте, __Ranger, Вы писали:

__R>Каким образом можно повторить поведение виндовых менюшек? Т. е при появлении моего окна фокус должен оставаться неизменным.

При создании окна включите WS_EX_NOACTIVATE в dwExStyle (extended window style).
Re[2]: Меню+фокус
От: __Ranger  
Дата: 12.04.04 04:55
Оценка:
Здравствуйте, Frostbitten, Вы писали:

F>При создании окна включите WS_EX_NOACTIVATE в dwExStyle (extended window style).

Да, есть такой стиль, но, к сожалению, работает лишь под 2000/XP. Какой-нибудь более универсальный метод?
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re: Меню+фокус
От: c-smile Канада http://terrainformatica.com
Дата: 12.04.04 05:12
Оценка:
Здравствуйте, __Ranger, Вы писали:

__R>Каким образом можно повторить поведение виндовых менюшек? Т. е при появлении моего окна фокус должен оставаться неизменным.


EnableWindow(hWnd,FALSE);
ShowWindow(hWnd,SW_SHOWNA);

Это если ничего больше делать ненадо. Т.е. пассивные окна типа tooltip.
Если же нужно делать чего-то еще придется стучать в бубен.
Re[2]: Меню+фокус
От: __Ranger  
Дата: 12.04.04 05:42
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это если ничего больше делать ненадо. Т.е. пассивные окна типа tooltip.

CS>Если же нужно делать чего-то еще придется стучать в бубен.

Не катит, поскольку в окне могут быть элементы управления. Как бы в бубен постучать(можно и ногой)?
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[3]: Меню+фокус
От: Lopcom  
Дата: 12.04.04 09:10
Оценка:
__R>Не катит, поскольку в окне могут быть элементы управления. Как бы в бубен постучать(можно и ногой)?

Ну поскольку по умолчанию всплывающее меню является модальным окном (если не установлен стиль MNS_MODELESS), то у него есть собственный цикл обработки сообщений. Поэтому оно может получать сообщения (клава + мышь) даже не имея фокуса и оставаясь пасивным. Также при создании можно захватывать мышь и отслежвать её.

Далее, если верить исходникам виндовс, то меню при получении WM_ACTIVATE, делает активным предыдущее окно и отдаёт ему фокус обратно.
Re[4]: Меню+фокус
От: __Ranger  
Дата: 12.04.04 09:27
Оценка:
Здравствуйте, Lopcom, Вы писали:

__R>>Не катит, поскольку в окне могут быть элементы управления. Как бы в бубен постучать(можно и ногой)?


L>Ну поскольку по умолчанию всплывающее меню является модальным окном (если не установлен стиль MNS_MODELESS), то у него есть собственный цикл обработки сообщений. Поэтому оно может получать сообщения (клава + мышь) даже не имея фокуса и оставаясь пасивным. Также при создании можно захватывать мышь и отслежвать её.


L>Далее, если верить исходникам виндовс, то меню при получении WM_ACTIVATE, делает активным предыдущее окно и отдаёт ему фокус обратно


Тогда другая проблема — ко мне не будет приходить WM_KILLFOCUS, и не понятно как отслеживать переключение на другие окна.
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[5]: Меню+фокус
От: Lopcom  
Дата: 12.04.04 18:18
Оценка:
__R>Тогда другая проблема — ко мне не будет приходить WM_KILLFOCUS, и не понятно как отслеживать переключение на другие окна.

Что имеется ввиду под "переключение на другие окна"? Для меню всё просто, оно просто исчезает, если юзер щёлкает где-либо вне его, и отследить такое событие для меню и закрыть себя очень просто. А вот какую функциональность хотите вы, не совсем понятно. Опишите более подробно.
Re[6]: Меню+фокус
От: __Ranger  
Дата: 13.04.04 10:30
Оценка:
Здравствуйте, Lopcom, Вы писали:

__R>>Тогда другая проблема — ко мне не будет приходить WM_KILLFOCUS, и не понятно как отслеживать переключение на другие окна.


L>Что имеется ввиду под "переключение на другие окна"? Для меню всё просто, оно просто исчезает, если юзер щёлкает где-либо вне его, и отследить такое событие для меню и закрыть себя очень просто.


В обработке WM_KILLFOCUS и надо его скрывать, но оно ко мне не придет, т.к фокуса у моего окна нет. Возможно, есть другой способ определить переключения на другие окна?
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[7]: Меню+фокус
От: asheff Украина  
Дата: 13.04.04 13:43
Оценка:
Здравствуйте, __Ranger, Вы писали:


L>>Что имеется ввиду под "переключение на другие окна"? Для меню всё просто, оно просто исчезает, если юзер щёлкает где-либо вне его, и отследить такое событие для меню и закрыть себя очень просто.


__R>В обработке WM_KILLFOCUS и надо его скрывать, но оно ко мне не придет, т.к фокуса у моего окна нет. Возможно, есть другой способ определить переключения на другие окна?


Я лично такие варианты обрабатываю:
1. Тыкнули мышкой в клиентскую область окна твоего приложения (WM_LBUTTONDOWN и так далее)
2. Тыкнули мышкой в неклиентскую область окна твоего приложения (WM_NCLBUTTONDOWN и так далее)
3. Переключились в другое приложение (WM_ACTIVATEAPP)
4. Нажали клавишу (которую я не обрабатываю специальным образом)

Вроде хватает, чтобы более-менее нормально работало окошко автокомплита
... << RSDN@Home 1.1.0 stable >>
Re[8]: Меню+фокус
От: __Ranger  
Дата: 13.04.04 17:00
Оценка:
Здравствуйте, asheff, Вы писали:

A>3. Переключились в другое приложение (WM_ACTIVATEAPP)


WM_ACTIVATE ко мне тоже не приходит
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[9]: Меню+фокус
От: Lopcom  
Дата: 14.04.04 04:37
Оценка:
A>>3. Переключились в другое приложение (WM_ACTIVATEAPP)

__R>WM_ACTIVATE ко мне тоже не приходит


Ну например такой вариант:
1) Захватываем окно (SetCapture)
2) Отслеживаем WM_LBUTTONDOWN
Если координаты курсора GET_X_LPARAM(lParam) и GET_Y_LPARAM(lParam)
лежат за пределами окна, то закрываем окно.

Таким образом, если пользователь щёлкнет где-либо за пределами окна,
это будет означать активность пользователя за пределами окна, что
должно приводить к его закрытию, как в случае меню.
Re[10]: Меню+фокус
От: __Ranger  
Дата: 14.04.04 06:01
Оценка:
Здравствуйте, Lopcom, Вы писали:

L>Ну например такой вариант:

L>1) Захватываем окно (SetCapture)

Это было бы замечательно, но
Only the foreground window can capture the mouse. When a background window attempts to do so, the window receives messages only for mouse events that occur when the cursor hot spot is within the visible portion of the window.
У меня как раз foreground.

Судя по всему, мне светят хуки...
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[10]: Меню+фокус
От: __Ranger  
Дата: 14.04.04 06:26
Оценка:
Описался, как раз не foreground.
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[11]: Меню+фокус
От: asheff Украина  
Дата: 14.04.04 08:05
Оценка:
Здравствуйте, __Ranger, Вы писали:

__R>Судя по всему, мне светят хуки...


Я тоже так раньше думал Но в действительности все оказалось проще

Советую посмотреть:
1) MSDN раздел Keyboard Input
2) WM_MOUSEACTIVATE
3) MSDN раздел Messages and Message Queues, в частности функции PeekMessage, GetMessage, TranslateMessage, DispatchMessage;
4) пример в Platform SDK — ищи fakemenu.c
5) плюс то что я тебе ранее говорил

Удачи!
... << RSDN@Home 1.1.0 stable >>
Re[12]: Меню+фокус
От: __Ranger  
Дата: 16.04.04 09:45
Оценка:
Здравствуйте, asheff, Вы писали:

A>Здравствуйте, __Ranger, Вы писали:


__R>>Судя по всему, мне светят хуки...


A>Я тоже так раньше думал Но в действительности все оказалось проще


A>Советую посмотреть:

A>1) MSDN раздел Keyboard Input
A>2) WM_MOUSEACTIVATE
A>3) MSDN раздел Messages and Message Queues, в частности функции PeekMessage, GetMessage, TranslateMessage, DispatchMessage;
A>4) пример в Platform SDK — ищи fakemenu.c
A>5) плюс то что я тебе ранее говорил

A>Удачи!


Видимо предлагается такой вариант:
1. SetCapture на активное окно
2. Затем ставится отдельная вертушка ссобщений while (GetMessage(&msg, NULL, 0, 0)), к-я выбирает сообщения из активного окна, поскольку моё окно отображается SW_SHOWNOACTIVATE и сообщения туда не приходят
3. Фильтруются сообщения

К сожалению, SetCapture вешается только на окна того же процесса, а у меня активное окно может быть любого процесса. Есть, правда, ещё AttachThreadInput, но он, наколько я помню, работает только с клавиатурой
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[13]: Меню+фокус
От: asheff Украина  
Дата: 16.04.04 12:38
Оценка:
Здравствуйте, __Ranger, Вы писали:

__R>1. SetCapture на активное окно

__R>2. Затем ставится отдельная вертушка ссобщений while (GetMessage(&msg, NULL, 0, 0)), к-я выбирает сообщения из активного окна, поскольку моё окно отображается SW_SHOWNOACTIVATE и сообщения туда не приходят
__R>3. Фильтруются сообщения

__R>К сожалению, SetCapture вешается только на окна того же процесса, а у меня активное окно может быть любого процесса. Есть, правда, ещё AttachThreadInput, но он, наколько я помню, работает только с клавиатурой


Честно говоря, я не понял — зачем тебе нужно применять SetCapture, и что означает "у меня активное окно может быть любого процесса".
... << RSDN@Home 1.1.0 stable >>
Re[14]: Меню+фокус
От: __Ranger  
Дата: 16.04.04 12:52
Оценка:
Здравствуйте, asheff, Вы писали:

A>Честно говоря, я не понял — зачем тебе нужно применять SetCapture, и что означает "у меня активное окно может быть любого процесса".


Глянь на это (29 Кб)

http://www.rsdn.ru:80/File/28336/ALight.rar

Переименуй в RAR после закачки
Люди не должны править людьми. Это неестественно. Людьми должны править драконы
Re[15]: Меню+фокус
От: asheff Украина  
Дата: 16.04.04 14:23
Оценка:
Здравствуйте, __Ranger, Вы писали:

__R>Глянь на это (29 Кб)

__R>http://www.rsdn.ru:80/File/28336/ALight.rar

Посмотрел.

Знаеш, я тебе давал рекомендации как сделать окошко типа autocomplete code в MSVS (или например типа popup menu). Там действительно надо, чтобы фокус оставался на прежнем месте.

А в твоем случае — ты переключаешся на другое приложение (твой ALight). Оно становится foreground, а бывшее активное окно — backgroung (со всеми последствиями — типа потери фокуса).
Ты хочеш изменить такое поведение? Чтобы отображалось твое меню, и при этом текущее активное приложение так и оставалось активным? Начнем с того, что примеров такой функциональности я не наблюдал. И не совсем понятно, зачем это надо.

Мне понятно, когда popup menu не забирает на себя фокус. Например, чтобы оставить фокус ввода на редакторе, и при этом юзер может выбрать в popup menu какое-то действие — типа вставить текст из clipboard. Если бы менюшка забирала фокус — то хрен бы было понятно, куда это действие применять.

А в твоем случае, зачем оставлять фокус?
... << RSDN@Home 1.1.0 stable >>
Re[16]: Меню+фокус
От: Аноним  
Дата: 16.04.04 16:24
Оценка:
Здравствуйте, asheff, Вы писали:

A>А в твоем случае, зачем оставлять фокус?


Дело в том, что в диалогах при нажатии на кнопку на тулбаре и появлении меню снимается фокус с диалога, и меню при этом выгдядит чужеродно. Хотел избавится от этого эффекта, но, видимо, не судьба В любом случае спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.