Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Как то рассматривал я "умный" вопрос про то как не рисовать точки вокруг слайдера при получении им фокуса(ибо похабство) /topic/736404&hl= Код я тогда как бы себе тогда придумал: детский, громоздский, идиотский и т.п. Нарисовал, так сказать, "пользовательский контрол" (очень показательный кстати пример убийства времени + нуль новых знаний ) Все проще... Внедряя xp/Vista стили методом манифеста понял что это решается автоматически, т.е. даже при XP-классический стиль кнопки уже не выглядят в точечках: но одно но. Как правильно заметил Antonariy, Код: plaintext С манифестом получается так: если я запустил окно мышкой, то все выглядит "прилично". Если клавиатурой, то "с точками-указателями на фокус". Все вроде корректно. Но я наблюдал как делает "нормальное" приложение. Если вывели окно мышкой, то фокусы не показываются (что красиво ,да и незачем). Но при первом нажатии какого-нибудь "TAB" они сразу появляются и это разумно. В моем же случае если "точки" изначально не вызвали (запуск с мышки), то они уже не появятся, хоть обожмись клавиатурой. И если на XP по теням рядом с кнопками еще можно понять где находимся(для многих элементов) , то на Висте это понять (где фокус) уже малореально. Есть идеи, как этот "интерфейс" правильно реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 01:06 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
http://forum.vingrad.ru/forum/topic-278854.html Вот еще такое же описание проблемы, но к сожалению не руководство к действию. Вид/глючность винды, язык программирования, x86/x64 точно ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 04:33 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Да не мистика какая-то, элементарное приложение из одной формы + 2 кнопки + чекбокс +манифест + запускаем мышкой + не появляется focus rectangle (а он должен появляться при первом нажатии TAB) и вопросов таких в google много, а ответа не вижу должна же быть какая-то маленькая хитрость (какая-нибудь API напр. которая активирует отображение этого focus rectangle), ведь если запустить приложение ENTER то все работает... ну запихну эту API в form_load в конце концов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 12:22 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Не тривиально, но не безнадежно. http://www.vbmonster.com/Uwe/Forum.aspx/vb/30910/XP-Vista-Visual-Styles-Focus-Rectangle Решение(рабочее): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но один вопрос остался. Как узнать что User принялся за клавиатуру и начал щелкать ТАБами/стрелками? Потому как любителю мышек этот focus rectangle visibility наф... не нужен (и негативно сказывается на зрении и настроении юзера, испытывал на себе), должно быть так Код: plaintext 1. 2. 3. Боюсь KeyPress/Down в общем случае не помогут. И попытки их прописывать для всех Controls идиотизм и трата времени. Сабклассить форму? Если сабклассить то на что реагировать? Понимаю что опять морока(если сабклассить), но по крайне мере для "ключевых" форм такую роскошь можно позволить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 15:59 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
глобальный хук на клавиатуру спасёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 16:17 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Konst_Oneглобальный хук на клавиатуру спасёт Это как? Намека на элементы кода не дадите? Совсем "глобально" как бы тоже не надо. Надо в рамках отображаемой формы (окна). 1)Загрузилась без фокусов (если не оговорено иное, т.е. запуск с клавы) 2) Щелкнули (в рамках формы, а не "вообще") характерными клавишами, сработал приведенный код, появились фокусы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 17:17 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
если только в рамках открытого активного окна, то у него есть свойтво в дизайнере форм: Код: plaintext ну а дальше: Код: plaintext 1. 2. PS примеры глобального хука на клавиатуру можно поискать в инете, сам таким не занимался, т.к. считаю, что это неправильный подход ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 17:20 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Konst_One, KeyPreview=True не знал, полезная штука спасибо. Но проблема в том что Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) перехватывается системой и не срабатывает, и именно тогда, когда TAB или "стрелочки" переводят фокус к другому элементу, т.е. молчит именно в те моменты когда нам надо чтоб оно "сказало" об этом. Вот нарисуйте > 1 элемента на чистой форме (чтоб было куда прыгать) и сделайте как предложили: Код: plaintext 1. 2. 3. Msgbox=9 вы не получите, а оставьте одну кнопку и получите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 17:41 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
если фокус внутри какого-либо контрола на форме, то естественно нужно обрабатывать уже события этого контрола, поэтому для TAB особый случай, тк у микрософта - это переход фокуса на следующий контрол. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 17:50 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
погуглите на предмет использования этих ф-й: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 17:55 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
По барабану, можете каждую кнопку мучить Код: plaintext 1. 2. >поэтому для TAB особый случай, тк у микрософта - это переход фокуса на следующий контрол. о том и речь. И именно это и надо отследить 1) особый случай имел место быть 2) особый случай был инициирован с клавиатуры Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 18:08 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Konst_Oneпогуглите на предмет использования этих ф-й: Код: plaintext 1. 2. 3. 4. 5. Такое ощущение что это не оно, тогда уж GetKeyState(TAB)+КакоеОкноВФокусе(), но это уж слишком, примерно то же самое что слайдер в рамку упаковывать чтоб точек не видеть. Должно быть какое-нибудь более красивое и правильное решение... Сдается мне, что какая-нибудь простенькая обработка в WinProc формы может отследить желаемое событие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 18:39 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Ну в принципе рабочий вариант я нашел. Только код надо прописывать в событие каждого TAB-значащего контрола на форме. Считаю сигналом к действию потерю фокуса любым TABstop-элементом вследствии нажимания TAB; стрелка вверх; стрелка вниз; стрелка вправо; стрелка влево -ничего не упустил? В тестовом варианте код приведен ниже. Но у меня на одной форме напр. не 5 контролов а 256++ за счет массивов, из них наверняка сотня для которых код надо писать. Крыша не съедет? У меня допустим нет. А у VB? Если этот код нормальный? (безобидный и не вызовет Crash) Это вопрос #1 то Можно ли его объединить хотя бы для всех элементов? Это вопрос #2. Пока воздержусь от "внедрение" в Application. Мнение экспертов? Код: 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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2010, 22:15 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Собственно, вот "короткий" код: Код: 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. 34. 35. 36. 37. 38. Есть недостатки по сравнению с предыдущим вариантом. В предыдущем варианте 1) программа реагирует только на смену фокуса между элементами 2) и интересуется не клавиатурой ли это вызвано В этом варианте: 1) программа реагирует на любой ввод с клавиатуры 2) и проверяет не критические(на основании только нашей "базы знаний") ли клавиши там жали и иногда делает преждевременный вывод (в текстовом поле user может использовать стрелки для редактирования текста). Хотя анализ "правильной" (но не микрософтовской) проги показал, что она идет по второму пути (неправильному и короткому), Outlook Express же все делает правильно, т.е. как в моем длинном первом варианте. Т.е. если существует способ записать ( КАК???) код в виде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ...а с другой стороны, опять блин, крутить непрерывно хук, кот. может быть никогда и не выстрелит (хорошо если не в crash варианте), тоже не дело... Konst_One, спасибо, по сути эти два кода суть реализации ваших двух идей-намеков (оба рабочие). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 00:29 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
да , работу провёл основательную как я уже писал, я не олюблю глобальные перехваты клавиш, поэтому всё-таки склоняюсь к первому твоему варианту, хоть он и трудоёмкий, но более стабильный. ещё есть мысль попробовать обращаться к событиям контролов через VBControlExtenter c WithEvents . т.е. попробовать загнать при инициалицации формы все твои контролы в свою коллекцию и присвоить объектной переменной с обработкой событий. как-то так: Код: plaintext и обрабатывать нужные события этого контрола. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 11:11 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Konst_One, ну да, начал сейчас внедрять второй метод в Application. дополняя ваши мысли (да и мои) про стабильность.. Во-первых указанная неточность обработки стрелок. Во-вторых требует рихтовки в процессе внедрения. Хук конечно не так чтоб совсем глобальный (если щелкаете табами в окне чужого приложения, то это не перехватывается, тьфу-тьфу). Но допустим есть главное окно Form1 И окно поднастроек Form2, вызываемое по принципу Form2.Show 1 Логично предположить что по Form1 юзер ходит мышкой, а в Form2 использует TAB для перехода между текстовыми полями, ибо ввод с клавиатуры все одно требуется. Если писать код для Form2 в виде: Код: plaintext 1. 2. 3. 4. 5. 6. чтоб этого не произошло, надо извращаться Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Писать 200 блоков кода (и помнить всегда об этом) конечно желания нет. Хотя если реализуемо то о чем написали, все равно придется писать 200 строк (хоть и не блоков) добавления элементов в коллекцию и (опять же) помнить об этом. А нельзя сделать как-то так Код: plaintext 1. 2. Или тогда уж Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 13:01 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
у формы есть коллекция Conntrols: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 13:07 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Ну это мы в тупик приехали ( в силу моей увы безграмотности в нек. ключевых вопросах, не люблю и не понимаю слово класс). 1)Во первых тогда мне надо Код: plaintext 1. 2. 3. 4. MsgBox ctl.Name имена выводит Что есть HaveEvent (event) и есть ли такое в природе? 2) Во вторых Dim MyCols as MyNewCollection 'class собственной коллекции наверно надо писать какой-то модуль класса MyNewCollection, туда еще чего-то писать, понятия не имею чего Интуиция подсказывает, что Event=LostFocus согл. потребностям, но понятия не имею как 3) Чего присваивать этой самой VBControlExtender Попытка сделать "на дурака" Set Myctl = Me.Controls провалилась, как и предполагал собственно. допускаю что Set Myctl =MyCols но у меня темный лес в пункте 2. 4)Private WithEvents Myctl As VBControlExtender Вижу после точки Myctl.SetFocus ...это хоть немного обнадеживает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 13:52 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
ничего страшного в классах и коллекциях нет. по крайней мере это намного проще изысков управления событиями чужих окон через API ЗЫ попробуйте Add-In Class Builder и примерчики посмотрите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 14:01 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Не ну ё Ну использую я два класса, посмотрел на них (как на примерчики) Нарисовал вот эту ересь в качестве MyNewCollection (Class Module) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Ругается, скотина, на MyCols.Add ctl че-то там Not Set, панимаешь ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 14:54 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Dim MyCols As New MyNewCollection и это только начало пути ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 14:56 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
А, во как, ну тогда Set Myctl = MyCols =>Type Mismatch Може ну его... энтот путь Может, согласно классикам лучше "Мы пойдем другим путем..." ? Konst_One, ну если знаете, не томите.. не думаю что там больше нескольких строчек кода... фраза "начало пути" меня правда пугает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 15:17 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Да нет, в баню наверно, пусть будет второй метод. Старался, накатал этот класс, как сумел: Вот отсюда чуть содрал: http://vbcity.com/forums/t/31429.aspx Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Делаем так: Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Супер, блин: Sub FocusRectangles() - срабатывает на потерю фокусов всеми перечисленными типами элементов (не так уж много типов). А конструкция If (GetKeyState(vbKeyTab) < 0) Or (GetKeyState(vbKeyLeft) < 0) Or _ (GetKeyState(vbKeyUp) < 0) Or (GetKeyState(vbKeyRight) < 0) Or (GetKeyState(vbKeyDown) < 0) не срабатывает : кто-то чего-то перехватил, кто-то чего-то не успел: все, весь труд коту под хвост, ибо та фишка ради которой все делалось не работает. Зол как собака. Проделать такой путь, чтобы опять прийти к той же свинье, которая жрет ТАБы и стрелки, т.е. именно необходимый "особый случай". Думаю пусть будет второй метод. Лучшее враг хорошего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 19:19 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Все, разобрался. Код: plaintext 1. 2. А ведь сам упрекал 2 года назад одного оч. уважаемого C++ разработчика с мировым именем год назад в том что убивает объект раньше чем объект возвращает результат, причем человека год пришлось убеждать в том что прав я а не он. Так работает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Искренне надеюсь что классы ресурсов не жрут и не стреляют. Так? Тогда пусть болтаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2010, 20:44 |
|
||
|
Клавиатурный "фокус" при использовании xp/Vista стилей (с манифестом)
|
|||
|---|---|---|---|
|
#18+
Не могу понять, зачем в формах Option Explicit все кому не лень лепят. В модуле да, всегда ставлю. А в форме по традиции не ставлю, еще сломается чего нибудь. На работу кодов это вроде не влияет. P.S. По теме: на вооружение взял все-таки свой крайний вариант, внедряем-с потихоньку. "Второй" вариант с хуком клавиатуры везде где успел уже впихнуть, отключил. (Основная мотивировка все-таки: ложное срабатывание на стрелки) Konst_One спасибо, екстендер конечно ну его, но идею вашу кажется реализовал. Еще конечно чуть беспокоит то, что в моем варианте в экземпляре класса всегда куча пустых Public WithEvents (кроме одного) и бесчисленное множество экземпляров (по числу элементов) постоянно "на взводе". И надо ли их убивать при form_unload На Terminate я кстати забил и просто пишу Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2010, 00:40 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36526574&tid=2160029]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 157ms |

| 0 / 0 |
