网站大量收购独家精品文档,联系QQ:2885784924

VCL中消息处理初探.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

VCL中消息处理初探

TObject是基类,所以我们先看一下TObject的DISPATCH方法。Dispatch根据传入的message来寻找相应的消息处理

方法,如果找不到的话,就继续向上到父类的消息处理方法表中寻找响应的处理方法,一直到找到为止,如果找到顶还没有,则调用DefaultHandle来处理该消息。message可以是任何的类型,Dispatch假设message的头两位是消息的ID,它就是根据ID来寻找消息处理方法的。虽然任何类型的message都可以被接受,但是TObject的子类还是希望传入的message参数是TMessage的记录类型或其他证明的记录类型。

以下声明和注释摘自与system.pas:

{TObject.DispatchacceptsanydatatypeasitsMessageparameterT.hefirst2bytesofthedataaretakenasthemessageidtosearchforintheobjectsmessagemethods.TDispatchMessageisanexampleofsuchastructurewithawordfieldforthemessageid.

TDispatchMessage=recordMsgID:Word;

end;

类的继承关系如下:

TObject-TPersistent-TComponent-TControl

TControl是所以可视化组件的父类,TControl提供了一个新的方法,WndProc:procedureTControl.WndProc(varMessage:TMessage);

var

Form:TCustomForm;KeyState:TKeyboardState;WheelMsg:TCMMouseWheel;begin

//如果处在设计期

if(csDesigninginComponentState)thenbegin

Form:=GetParentForm(Self);//得到拥有该组件的窗体

if(Formnil)and(Form.Designernil)andForm.Designer.IsDesignMsg(Self,Message)thenExit/消/息由窗体来处理

end;

//窗体可以为其拥有的组件来处理键盘消息。

if(Message.Msg=WM_KEYFIRST)and(Message.Msg=WM_KEYLAST)thenbegin

Form:=GetParentForm(Self);

if(Formnil)andForm.WantChildKey(Self,Message)thenExit;end

//关于鼠标的消息

elseif(Message.Msg=WM_MOUSEFIRST)and(Message.Msg=WM_MOUSELAST)thenbegin

//如果组件不可以接受和处理双击消息,就将双击消息映射为单击消息。ifnot(csDoubleClicksinControlStyle)then

caseMessage.Msgof

WM_LBUTTONDBLCLK,WM_RBUTTONDBLCLK,WM_MBUTTONDBLCLK:

Dec(Message.Msg,WM_LBUTTONDBLCLK-WM_LBUTTONDOWN);

end;

caseMessage.Msgof

WM_MOUSEMOVE:Application.HintMouseMessage(Self,Message);/如/果是鼠标移动的消息,则出现hint窗口

WM_LBUTTONDOWN,WM_LBUTTONDBLCLK://如果是左键被按下,或者双击,如果是自动拖动模式,则开始拖动,并将左键按下的状态加入组件的状态。

begin

ifFDragMode=dmAutomaticthenbegin

BeginAutoDrag;

Exit;

end;

Include(FControlState,csLButtonDown);end;

WM_LBUTTONUP:

Exclude(FControlState,csLButtonDown);/如/果是左键放开,则将左键按下的状态剔除。

else

withMousedo

ifWheelPresentand(RegWheelMessage

文档评论(0)

mph + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海谭台科技有限公司
IP属地湖北
统一社会信用代码/组织机构代码
91310115MA7CY11Y3K

1亿VIP精品文档

相关文档