- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- UG练习图纸大全65张绝对受用.docx
- UL1007线的常用线径规格.docx
- Unit 1 When was it invented?重点知识解析.docx
- unit 2大学英语综合教程答案.docx
- Unit 5 Do you have a soccer ball 教案Section A (1a分析和总结.docx
- Unit 6 It is raining教学设计分析和总结.docx
- Unit 6 In A Nature Park练习题分析和总结.docx
- Unit 10 It’s a nice day isn’t it练习题及答案.docx
- Unit How much is it教案分析和总结.docx
- Unit Look at that elephant教案分析和总结.docx
文档评论(0)