]、。·ˉˇ¨〃々—~‖…’”〕〉》」』〗】∶!"'),.:;?]` 你必须拦截 WM_GETDLGCODE 才能处理方向键的讯息,在 WM_GETDLGCODE 的讯息处理 者中传回
DLGC_WANTARROWS 。如果你不这样做,那方向键的功用就只能用来移动窗口焦点而己。
Max Nilson 的回答:
想要你的构件能够处理方向键,你必须要拦截 CM_WANTSPECIALKEY 构件讯息。 CM_WANTSPECIALKEY
构件讯息提供你比拦截 WM_GETDLGCODE
窗口消息更容易且灵活的判断方法来决定是否需要某些特殊键的讯息。当控制项收到任何一个特殊键时就会送出 CM_WANTSPECIALKEY
构件讯息给控制项。
特殊键包括: VK_TAB 、 VK_LEFT 、 VK_RIGHT 、 VK_UP 、 VK_DOWN 、 VK_RETURN 、 VK_EXECUTE
、 VK_ESCAPE 及 VK_CANCEL 。如果讯息传回值是非零值,这个键就会被送至 KeyPress
方法以供处理,否则这个键的讯息会被送至构件的父控制项,以预设方式来处理。
一个简单的范例:
type
TMyComponent = class (TWinControl)
...
protected
procedure CMWantSpecialKey(var Message: TCMWantSpecialKey); message
CM_WANTSPECIALKEY;
...
end;
procedure TMyComponent.CMWantSpecialKey(var Message: TCMWantSpecialKey);
begin
inherited;
// 我们只想处理向左方向键,其它的特殊键都给 Windows 处理
if Message.CharCode = VK_LEFT then
Message.Result := 1;
end;
CM_WANTSPECIALKEY 构件讯息比 WM_GETDLGCODE
讯息更具有弹性的地方在这儿。我们甚至可以根据是按下的是哪个特殊键才决定是否处理这个键。例如,你的控制项有三张图像,你可以让使用者利用左右方向键来回检视它们,如果翻到最後一张图像再按向右键时,焦点就让它离开构件,剩下的全部都让
Delphi 来处理。