delphi – 无法在设计时单击自定义控件
发布时间:2020-12-15 09:40:22 所属栏目:大数据 来源:网络整理
导读:我正在Delphi XE2中构建一个自定义控件(继承自TCustomControl)(并在我的其他控件中遇到此问题),在设计时,我无法单击它们.我知道它与鼠标捕获有关,捕获鼠标事件并在设计时间内处理它们的方式与运行时间不同,但我不知道如何正确适应这一点.换句话说,在我能想到
我正在Delphi XE2中构建一个自定义控件(继承自TCustomControl)(并在我的其他控件中遇到此问题),在设计时,我无法单击它们.我知道它与鼠标捕获有关,捕获鼠标事件并在设计时间内处理它们的方式与运行时间不同,但我不知道如何正确适应这一点.换句话说,在我能想到的许多工作中,我无法确定哪一种是正确的(或最有效的)方式.
我敢肯定必须有一些非常简单的标准,很可能使用ControlStyle或CreateParams但不知道是什么. 在这个特定的控件中(我在这个问题上没有看到模式),我正在捕获包括WM_NCHITTEST和WM_LBUTTONDOWN的消息.在设计时,控件100%处于活动状态,就好像它是运行时一样,而单击时,它则执行运行时代码. 我感觉它在我的命中测试消息处理程序中,所以这是代码(重命名的一些东西): procedure TMyCustomControl.WMNCHitTest(var Message: TWMNCHitTest); var P: TPoint; Poly: TPoints; X: Integer; I: TMyCollectionItem; Ch: Bool; //Need to improve invalidation begin Ch:= False; P:= ScreenToClient(Point(Message.Pos.X,Message.Pos.Y)); for X := 0 to Items.Count - 1 do begin I:= Items[X]; Poly:= I.Points; FMouseIndex:= -1; FMouseState:= bmNone; if PointInPolygon(P,Poly) then begin //checks if point is within polygon FMouseIndex:= X; FMouseState:= bmHover; Ch:= True; Break; end; end; if Ch then Invalidate; end; 还有我的控件的构造函数(剥离): constructor TMyCustomControl.Create(AOwner: TComponent); begin inherited; ControlStyle:= ControlStyle - [csDesignInteractive]; end; 解决方法
但当然你是对的.您没有在WM_NCHITTEST处理程序中返回任何内容.调用处理程序时,你的Mmessage.Result为’0′(HTNOWHERE),而你没有为其分配任何其他内容.
要么在某个时候调用继承,要么实现你的逻辑并为你认为是控件内部的点返回(设置Message.Result)HTCLIENT. 它已经是运行时所需的行为,你可以包括一个设计时检查(但我想你应该做的所有计算是有原因的): if csDesigning in ComponentState then Msg.Result := HTCLIENT; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |