я знаю, что безоконные элементы управления — это не волшебство. Безоконный элемент управления может иметь фокус ввода (например, Internet Explorer). Фокус ввода — это не что иное, как рисование:
и когда пользователь начинает нажимать клавиши, реагируя соответствующим образом. Вы знаете, что нажатия клавиш предназначены для этого сфокусированного элемента управления, потому что этот элемент управления имеет фокус.
В случае с моим окном (Windows) мне нужно знать, что мой безоконный дочерний элемент управления (давайте притворимся, что он является потомком TGraphicControl) получает события клавиатуры. Поэтому во время OnKeyDown
, OnChar
, OnKeyUp
моей формы мне нужно было бы притвориться, что они переходят к моему дочернему элементу управления без окон.
Что я могу сделать, но это боль.
Но тогда пользователь, вероятно, захочет использовать навигацию Tab, и мне придется каким-то образом перехватить обычную обработку порядка элементов управления вкладками Delphi и зацепиться за себя, чтобы сказать, что эта штука является следующим (и предыдущим) в порядке табуляции.
Что я могу сделать, но это боль.
А еще есть ActiveControl
, который ничего не понимает, кроме TWinControl
. Так что, если Delphi когда-нибудь попытается выяснить, у кого есть фокус, она сойдет с ума. Так что мне пришлось бы иметь альтернативную реализацию ActiveControl.
Что я могу сделать, но это боль.
Другими словами: это слишком много работы? я борюсь со всем, чем является Delphi, и все это для того, чтобы иметь несколько десятков безоконных элементов управления, доступных через ввод с клавиатуры? Дизайнеры Delphi никогда не думали об использовании интерактивных безоконных элементов управления, и если я попытаюсь сделать это сейчас, я просто застряну в хартлокер?
Delphi дала мне возможность добровольно помочь мне, но я выбрал путь боли.
Требуется некоторое дополнительное объяснение безоконных элементов управления.
Не каждый элемент управления, с которым вы взаимодействуете, должен быть элементом управления Windows. Вполне возможно сфокусироваться и отправить ввод с клавиатуры на элемент управления, который не является окном Windows.
Например, почти каждый элемент управления, который вы видите в окне браузера Internet Explorer, является элементом управления без окон. На следующем снимке экрана вы можете увидеть элемент управления edit, который вы можете ввести, и кнопку, которая (на этом снимке экрана) имеет фокус:
Вы можете видеть пунктирный прямоугольник фокуса, а кнопка имеет голубоватый оттенок (что в Windows указывает на наличие фокуса).
Если бы я нажал Пробел, когда кнопка Google Search
была в фокусе, я бы нажал кнопку. Причина, по которой это работает, заключается в том, что Microsoft написала целую библиотеку элементов управления для виджетов. Эти элементы управления выглядят и работают (почти) точно так же, как обычные общие элементы управления — они являются почти точными клонами общих элементов управления Windows, вплоть до применяемых тем.
Mozilla Firefox и Google Chrome также используют библиотеку элементов управления виджетов. Они не используют встроенные оконные элементы управления Microsoft, а вместо этого используют библиотеку графических интерактивных безоконных виджетов.
И если у вас есть подходящая среда разработки, то виджеты без окон работают точно так же, как «обычные» оконные элементы управления. GTK+ — это библиотека виджетов, а Glade — это IDE, которая позволяет размещать элементы управления в этой библиотеке виджетов.
я не знаю, в какой среде разработки были созданы Firefox, Chrome или Blender, но их виджеты поддерживают элементы управления без окон.
Итак, теперь на мой вопрос.
Если я не ошибаюсь, мне кажется, что хотя Delphi поддерживает базу TControl
(которая имеет ширину, высоту и может рисовать сама), она не может получать фокус клавиатуры. Мне кажется, что Borland никогда не проектировала Delphi VCL как общую библиотеку виджетов. Единственное доказательство, которое я должен поддержать, это то, что ActiveControl
формы является TWinControl:
property ActiveControl: TWinControl;
Это не означает, что Delphi может или должна быть ограничена оконными элементами управления. Библиотека виджетов VCL может быть расширена для поддержки выделения элементов управления без окон.
Но, возможно, Delphi уже поддерживает элементы управления без окон, а я просто этого не понимаю? Есть ли в Delphi уже установленный механизм для поддержки выделения фокуса TControl
? Но я достаточно умный парень, и я почти уверен, что Delphi VCL не может делать то, что могут другие библиотеки виджетов.
Что затем приводит к другому вопросу: сколько работы потребуется для подкласса форм и тому подобного для его поддержки? Есть ли кто-то еще, возможно, кто-то из TeamB, кто намного умнее меня, кто уже попробовали и пришли к выводу, что это невозможно?
я спрашиваю сейчас, заранее, если попытка добавить поддержку управления без окон почти невозможна (то есть бесполезна) - так что я не трачу недели на это впустую. я пытаюсь использовать знания сообщества разработчиков Delphi.
я задаю вопрос.