怎么实现在Panel中对键盘消息的处理呢?(100分)

  • 主题发起人 主题发起人 hhsj
  • 开始时间 开始时间
H

hhsj

Unregistered / Unconfirmed
GUEST, unregistred user!
我以TPanel为基类创建了一个图形分析组件,我想在组件中通过键盘实现对该图形的翻页,滚动等控制,
请问我该怎么实现这些功能呢?请给一段参考代码.
 
自己继承一个控件吧,控件必须有焦点才行的
 
有现成的TScrollBox不用,干嘛非用TPanel呢?
 
你可以响应WM_GETDLGCODE消息以获取对键盘输入的控制。

★★★非标准控件(或子类化的标准控件)如何接收键盘消息:
一个由TCustomControl派生的非标准控件,无法获得输入焦点,欲让其接收
键盘消息的处理方法是:
响应WM_GETDLGCODE消息以获取对键盘输入的控制。

★由TGraphicControl派生的控件不适用此法。

★★★WM_GETDLGCODE消息:
该消息会发送到一与控件关联的对话框过程(窗口过程)。通常系统处理了所
有输入到该控件的箭头消息和TAB键的消息,通过响应WM_GETDLGCODE消息,程序
可获取对特定类型键盘输入的控制并自己处理。
参数:该消息没有参数。
返回值:是以下值之一或其组合,表示要处理哪些输入。
值 含义
DLGC_BUTTON Button.
DLGC_DEFPUSHBUTTON Default push button.
DLGC_HASSETSEL EM_SETSEL messages.
DLGC_RADIOBUTTON Radio button.
DLGC_STATIC Static control.
DLGC_UNDEFPUSHBUTTON Nondefault push button.
DLGC_WANTALLKEYS All keyboard input.
DLGC_WANTARROWS Direction keys.
DLGC_WANTCHARS WM_CHAR messages.
DLGC_WANTMESSAGE All keyboard input
(the application passes this message on to a control).
DLGC_WANTTAB TAB key.
默认行为:DefWindowProc总是返回0;
说明:尽管DefWindowProc总是返回0, 预定义的控件类(标准控件)的窗口过程
会返回合适的代码。因此WM_GETDLGCODE消息及其返回值仅在用户自定义一新对话框
控件或者标准控件子类化时才有用。

实例(参考TCustomGrid的处理Grids.pas):
TCustomGrid = class(TCustomControl)
private
procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
...
end;

procedure TCustomGrid.WMGetDlgCode(var Msg: TWMGetDlgCode);
begin
Msg.Result := DLGC_WANTARROWS;
if goRowSelect in Options then Exit;
if goTabs in Options then Msg.Result := Msg.Result or DLGC_WANTTAB;
if goEditing in Options then Msg.Result := Msg.Result or DLGC_WANTCHARS;
end;

 
TApplicationEvents


procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
case Msg.message of
wm_keydown:
end;
 
我是从Application.OnMessage中跟踪发现,如果产生WM_KEYDOWN消息,
Application其实不往窗口发送WM_KEYDOWN消息,而是发送CN_KEYDOWN消息,
在CNKeyDown中对消息中的状态进行处理,然后把Message.Result赋值,决定
是否向窗口发送WM_KEYDOWN消息。我们可以看到,如果是VK_LEFT, VK_RIGHT,
VK_UP, VK_DOWN这些按键,最后其Message.Result=1,也就是说告诉调用者,
不必往该窗口发送WM_KEYDOWN消息了。
OK,到这里就一切解决了,只需要定义一个CN_KEYDOWN消息响应函数,所有问
题解决。
procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
procedure TWinControl.CNKeyDown(var Message: TWMKeyDown);
begin
Message.Result := 0; //可要可不要,Message.Result缺省为0
end;
具体可以看
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=2176867
 
SS2000说得不错,我的问题也是这样解决的。
 
关注此帖关注此帖关注此帖关注此帖关注此帖关注此帖关注此帖
 
后退
顶部