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