|
|
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
win32api, vc2005sp1 пишу кнопку, которая основана на некотором базом классе, назовем его BaseWnd, у которого подменяю стандартную оконную процедуру на свою и разруливаю сообщения. Выглядит это приблизительно так: 1. у кнопки на этапе создания подменяется стандартная процедура обработки на мою BaseWindowProc(). События поступающие в эту процедуру генерят вызовы виртуальных функций BaseWnd, которые переопределены в классе кнопки Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 2. В процедуре BaseWindowProc ловим сообщения Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 3. У кнопки срабатывает при получении этого сообщения функция OnLButtonDown Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вопрос я думаю уже понятен :-) Должно ли уже в этом моменте окно иметь фокус если системой зафиксировано нажатие кнопки? Насколько я знаю WM_SETFOCUS асинхронное сообщение и для того чтобы оно пошло по назначению окно не должно изменить свою Z позицию, но в этот момент у меня ничего подобного не происходит. СПАСИБО (даже если дочитали до сюда) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2007, 10:30:46 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
Cerebrum пишет: > LRESULT MyButton::OnLButtonDown(UINT nFlags, RPoint point) > { > // у кнопки установлен стиль WS_TABSTOP? > DWORD dw = GetStyle(); // доп. функция на основе GetWindowLong > if(dw & WS_TABSTOP) > MessageBox("стиль WS_TABSTOP установлен", *0*, *0*); > // а фокус есть? > if(::GetFocus() != m_hWnd /*<- хэндл этого окна*/) > MessageBox("Упс! где он?", *0*, *0*); > return 0L: > } > Должно ли уже в этом моменте окно иметь фокус если системой > зафиксировано нажатие кнопки? Что такое фокус ввода ? Это - текущее окно приложения, в которое направляется весь ввод клавиатуры и которое получает сообщения типа WM_KEYDOWN/WM_KEYUP/WM_CHAR etc. Обычно, но не обязательно, окно, имеющее фокус ввода, помечается рамкой из пунктирной линии. Нужно отметить, что WM_LBUTTONDOWN - это сообщение мышки, и оно с клавиатурой никак не связано. В системе одно окно может иметь фокус ввода, а другое окно получить WM_LBUTTONDOWN, не имея при этом фокуса ввода. Это нормально. Даже наоборот, как правило, в результате обработки WM_LBUTTONDOWN данное окно и получает фокус ввода (если для него это осмысленно). Обычно это делает DefWindowProc(). Так что вопрос непонятен. Но если на него отвечать, то ответ - нет, не должно. Может иметь, а может и не иметь. > Насколько я знаю WM_SETFOCUS асинхронное сообщение и для того чтобы оно Это как так - "асинхронное" ? Все сообщения вообще-то синхронные. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 00:57:32 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
MasterZiv Так что вопрос непонятен. Но если на него отвечать, то ответ - нет, не должно. Может иметь, а может и не иметь. > Насколько я знаю WM_SETFOCUS асинхронное сообщение и для того чтобы оно Это как так - "асинхронное" ? Все сообщения вообще-то синхронные. Posted via ActualForum NNTP Server 1.4 я о том, что при нажатии кнопки мыши на моем контроле (MyButton) и последующей проверке на наличие фокуса, т.е. я хочу просто проверить, когда буду вызывать перерисовку, стоит ли мне рисовать пунктирную линию или же нет. Если я давлю таб, то фокус кнопка получает, но если нажимаю кнопку мыши, то кнопка остается без него, хотя по логике вещей он автоматически должен у нее появиться и клик трактоваться именно как клик по кнопке с фокусом. По поводу асинхронности (это слово надо было взять в кавычки), но вообще-то где-то на просторах мсдн читал что это сообщение имеет наибольший приоритет в потоках, если найду я приведу цитату. Мой BaseWindowProc фиксирует WM_SETFOCUS при щелчке, но фокус так и остается не присвоенным . В инете я нашел схожую проблему и там объясняли этот факт тем, что любой контрол производный от оконного класса в диалоговом окне не должен получать подобных сообщений, мол это сообщение приходит самому базовому окну, а оно уже распределяет их, либо надо что диалог имел стиль CONTROLPARENT (пробовал - не помогает) Я посчитал нужным добавить в обработчик BaseWindowProc() вот это Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. MasterZiv отдельный респект, ты прямо таки мой, не побоюсь этого слова, кумир в C++ :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 10:25:41 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
Cerebrumя о том, что при нажатии кнопки мыши на моем контроле (MyButton) и последующей проверке на наличие фокуса, т.е. я хочу просто проверить, когда буду вызывать перерисовку, стоит ли мне рисовать пунктирную линию или же нет. Если я давлю таб, то фокус кнопка получает, но если нажимаю кнопку мыши, то кнопка остается без него, хотя по логике вещей он автоматически должен у нее появиться и клик трактоваться именно как клик по кнопке с фокусом.Фокус это системный указатель - в какое окно отправлять нажатия кнопок на клавиатуре. Мышь к фокусу отношения не имеет совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2007, 21:32:58 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
я это понимаю, но когда вы кликаете на кнопке он ведь появляется на ней, если у кнопки стандартное поведение? -------------------------------------------------------------- [не претендую на уникальность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2007, 08:36:23 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
Cerebrum пишет: > последующей проверке на наличие фокуса, т.е. я хочу просто проверить, > когда буду вызывать перерисовку, стоит ли мне рисовать пунктирную линию > или же нет. Если я давлю таб, то фокус кнопка получает, но если нажимаю > кнопку мыши, то кнопка остается без него, хотя по логике вещей он > автоматически должен у нее появиться и клик трактоваться именно как клик > по кнопке с фокусом. Дай обработчику DefWndProc() отработать - он и появится. Если конечно в принципе это окно фокус ввода получает. > По поводу асинхронности (это слово надо было взять в кавычки), но > вообще-то где-то на просторах мсдн читал что это сообщение имеет > наибольший приоритет в потоках, если найду я приведу цитату. У сообщений нет приоритетов. Все через одну очередь обрабатываются. Кроме конечно WM_PAINT - у него "приоритет" ниже, хотя это нельзя назвать приоритетом, просто оно посылается только если в очереди сообщений нет других сообщений. > Мой BaseWindowProc фиксирует WM_SETFOCUS при щелчке, но фокус так и > остается не присвоенным . В инете я нашел схожую проблему и там вызови DefWindowProc(). > объясняли этот факт тем, что любой контрол производный от оконного > класса в диалоговом окне не должен получать подобных сообщений, мол это > сообщение приходит самому базовому окну, а оно уже распределяет их, либо > надо что диалог имел стиль CONTROLPARENT (пробовал - не помогает) Скорее всего бред это, или ты не так излагаешь. > и оно работает, но скорее всего это через зад, поэтому дисскусию не > заканчиваю и скромно рассчитываю на любую светлую мысль от форумчан и не > только. Если BaseWindowProc() - это DefWndProc(), то так и НАДО делать. Но я что-то там в коде не видел вызова. Но смотрел невнимательно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2007, 14:00:19 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
DefWindowProc я вызываю в BaseWindowProc, если результат обработки сообщения отличен от -1 следующим образом Код: plaintext 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. -------------------------------------------------------------- [не претендую на уникальность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2007, 14:25:06 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
Cerebrumя это понимаю, но когда вы кликаете на кнопке он ведь появляется на ней, если у кнопки стандартное поведение?Вопрос на засыпку: Что такое стандартное поведение? Правильный ответ: Вызов DefWindowProc(). Если ты поймаешь WM_LBUTTONDOWN, сделаешь свою собственную обработку, а потом дополнительно вызовешь еще и DefWindowProc для этой WM_LBUTTONDOWN - то система вытащит твое окно на самый верх и отрисует тебе пунктир на кнопке. Если после обработки события ты выйдешь из своей BaseWindowProc не вызывая DefWindowProc то и стандартной обработки (поднятия окна на верх, и передача в него фокуса) не произойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2007, 18:46:00 |
|
||
|
вот такие фокусы
|
|||
|---|---|---|---|
|
#18+
White Owl Cerebrumя это понимаю, но когда вы кликаете на кнопке он ведь появляется на ней, если у кнопки стандартное поведение?Вопрос на засыпку: Что такое стандартное поведение? Правильный ответ: Вызов DefWindowProc(). Если ты поймаешь WM_LBUTTONDOWN, сделаешь свою собственную обработку, а потом дополнительно вызовешь еще и DefWindowProc для этой WM_LBUTTONDOWN - то система вытащит твое окно на самый верх и отрисует тебе пунктир на кнопке. Если после обработки события ты выйдешь из своей BaseWindowProc не вызывая DefWindowProc то и стандартной обработки (поднятия окна на верх, и передача в него фокуса) не произойдет. под стандартным я понимаю формулу клик по кнопке = перемешение фокуса на кнопку + нажатие кнопки + всякая активация окна кнопки и прояие сопутствующие клику месседжи а не так как у меня клик = перемещение фокуса (WM_SETFOCUS) еще один клик = нажатие кнопки идею насчет DefWindowProc я понял, пробовал - не получилось, ыозможно из-за нагромождения всяческих ловушек в целях понять куда оно девается, попробую еще раз... всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2007, 19:30:46 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34737198&tid=2028340]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
3ms |
| others: | 213ms |
| total: | 337ms |

| 0 / 0 |
