Нет, вы не можете заставить окна распознавать несколько точек фокусировки клавиатуры внутри одного дескриптора окна, поскольку каждый элемент управления с дескриптором окна либо имеет, либо не имеет фокус клавиатуры. «Внутренний фокус» между несколькими элементами управления зависит от вас.
Как вы уже знали, самый простой способ сделать это - иметь несколько субэлементов управления со своими собственными оконными дескрипторами, как вы и сказали:
TMyThreeEditControls = class(TControl) // parent has no window handle!!!!
protected
FEdit1:TEdit;
FEdit2:TEdit;
FEdit3:TEdit;
...
end
В описанной выше ситуации родительский элемент управления - это TControl, он создает несколько подэлементов управления, в моем примере выше все три имеют свои собственные дескрипторы окон, и, таким образом, Windows может отображать фокус клавиатуры, когда вы нажимаете клавишу Tab, и обрабатывать фокус мыши как часть функциональности библиотеки общих элементов управления Windows.
Короче говоря, «составной» подход, когда вы включаете в свой основной элемент управления субобъекты (другие элементы управления), от которого вы пытаетесь отойти, фактически является единственным способом, позволяющим Windows выполнять большую часть работы.
С другой стороны, то, что вы, возможно, ищете, это не способ рисования самого элемента управления, а некоторый код, позволяющий создать видимость, что он сфокусирован, в ваших собственных пользовательских процедурах рисования, если это то, чем вы являетесь ищите, вы должны заглянуть в исходный код VCL или эту ссылку на about.com для примеров того, как сказать Windows нарисовать прямоугольник фокуса и т. д. Ссылка about.com является имитацией и не использовать реальный код Windows для рисования фокуса с учетом темы Windows.
Обновление: возможно, что вы также ищете способ определить, находятся ли координаты мыши в указанном прямоугольнике (прямоугольник представляет собой кнопку в вашем случае) и, если это так, нарисовать "горячее состояние" «для кнопки. Есть больше подзадач, которые необходимо выполнить, если вы хотите создать элемент управления самостоятельно, я рекомендую вам изучить существующие элементы управления, такие как TStringGrid и TCategoryButtons, в исходном коде VCL, чтобы увидеть код обработки MouseMove, MouseDown и MouseUp, который вам понадобится. делать то, что вы пытаетесь сделать. В частности, исходный код StringGrid - это способ увидеть, как «клавиша табуляции» может использоваться в одном элементе управления с одним дескриптором окна, поскольку в этом элементе управления клавиша табуляции может использоваться (если включены правильные параметры) для перемещаться по всем ячейкам в сетке строк, как если бы каждая была отдельным элементом управления, даже если это все один элемент управления.