在我的应用程序中,我使用标签,我自己的组件,如Google Chrome排序。每个选项卡都引用一个资源管理器组件,因此它基本上是一个标签式浏览器/资源管理器。我的问题是我想使用 CTRL + TAB 和 CTRL + SHIFT + TAB 导航标签。设置forms.KeyPreview无济于事,因为tab键是特殊键。我怎样才能以简单的方式添加对导航愿望的支持。如果需要,我可以修改组件。如果有帮助,我的组件基于TCustomControl。
亲切的问候 Roy M Klever
答案 0 :(得分:5)
Tab,与箭头键一样,enter和escape是对话框导航中使用的特殊键。当控件想要接收这些键时,它必须通过响应WM_GETDLGCODE来指示。喜欢下面这段代码。然后,当按下Tab键时,您将收到KeyDown事件。
procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
procedure TYourControl.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
inherited;
Msg.Result := Msg.Result or DLGC_WANTTAB;
end;
PS:确保您的控件具有焦点,或者您根本不会收到任何内容(如果CanFocus然后是SetFocus;在MouseDown中)。
答案 1 :(得分:4)
您可以管理组件中的CM_DIALOGKEY消息,以拦截 Ctrl + Tab 和 Ctrl + Shift + 标签。
procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
检查此示例
procedure TYourComponent.CMDialogKey(var Message: TCMDialogKey);
begin
if (Focused) and (Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then
begin
if GetKeyState(VK_SHIFT) then
GoBackwardPage()//you must write this method
else
GoForwardPage()//you must write this method
Message.Result := 1;
end
else
inherited;
end;