至资深的Delphier--请问一个Delphi控件何时能在设计期得到消息,何时不能?(200分)

  • 主题发起人 主题发起人 BaKuBaKu
  • 开始时间 开始时间
B

BaKuBaKu

Unregistered / Unconfirmed
GUEST, unregistred user!
我对一个问题始终很迷惑:
比如说 TStringGrid, 它的间接父类是 TCustomControl, 应该说对所有
消息都是一视同仁的。
我们都知道,TStringGrid 在设计期能改变列宽,这是通过响应
WM_MOUSEDOWN 和 WM_MOUSEMOVE 实现的。
现在问题是:为什么点击标题列与标题列的边缘并拖动鼠标能激活
TStringGrid 的代码,实现列宽度的改变,诸如画一条 Xor 的细线等。但是
点击Grid的白色网格却不能激活 TStringGrid 的代码?(本来应该改变Grid的
焦点框的)
换句话说,是不是 WM_MOUSEDOWN 消息是有选择性地传给控件的?但是
标题区与活动区根本上是一致的,都是在TCustomControl的空白Canvas上画
出来的。
不知道我是否表达清楚了我的意思。谢谢!
BaKuBaKu.
 
不是"有选择性地传给控件",而是控件"有选择地处理"消息,你看看
TCustomGrid.MouseDown的过程代码,注意一下BeginRowDrag,
BeginColumnDrag开始前的if语句是怎么判断鼠标点击位置的.
 
对不起坛主,我好像没有看到选择性处理的代码。
能否说的更详细一点?
 
else if (goColMoving in Options) and <font color=red>(CellHit.Y >= 0) and
(CellHit.Y < FixedRows)</font> and (CellHit.X >= FixedCols) then
begin
FMoveIndex := CellHit.X;
FMovePos := FMoveIndex;
if BeginColumnDrag(FMoveIndex, FMovePos, Point(X,Y)) then
begin

 
坛主,上述代码区分了设计期和运行期吗?
为什么设计期不能激活上述代码呢?
BaKuBaKu.
 
设计期也可以调整列宽度呀! 不明白你的意思.
 
我觉得你做的控件所处理的消息,一般都会在设计期处理的(当然,除了
运行期的属性), 除了一些特殊的消息,(我也不清楚)
 
各位,看来我还是没有表达清楚我的意思。再说一次吧:
在运行期,当点击活动网格时,可以看到,鼠标点到哪里,焦点框就跟到哪里。
当点击标题栏的交界处时,可以拖动鼠标改变列宽。这一点很明确。
而在设计期,当点击标题栏的交界处时,点击事件也可以同样被控件处理,即
改变列宽。但是当点击活动网格时,点击事件却被 Delphi 的 IDE 得到,相应的
动作变成了在设计窗体上移动控件的位置。
难道在设计期,同样的点击事件,有的能被控件处理,有的就被 Delphi IDE
截获了吗?
From: BaKuBaKu.
 
呵呵
给我分吧. 我从EX-EX买来的答案:
截取CM_DESIGNHITTEST.
其中LParam为鼠标位置.
如果想在设计期您的控件能处理鼠标消息(主要是LBUTTONDOWN, LBUTTONUP,
MOUSEMOVE)的话, 则Message.Result :=1, 否则Message.Result := 0
测试过, 还真是那么回事.
我问这个问题主要是为了做一个能带异类ScrollBar(不规则形状)的
ScrollBox, 用windows标准的ScrollBar无法做到.为了这个ScrollBox
能在设计期响应鼠标而问的.
 
可以用(csDesigning in ComponentState)
判断一个控件是否在设计状态
然后做不同的处理

又:还有个叫IsDesignMsg的函数
Determines when the designer should handle a Windows message.

IsDesignMsg(Controls:: TControl* Sender, Messages::TMessage &Message) = 0;
function IsDesignMsg(Sender: TControl; var Message: TMessage): Boolean;

Description

IsDesignMsg is called for each message sent to a component in the designer. This method returns True if the message is a design message, meaning one the designer should handle for the component.
 
Another_eYes 的答案我看了,的确如此。
多谢 Another_eYes 与参与的各位的热心解答。
下面给 Another_eYes 送上 170 分,其他各位每人10分。

下次有捞分的机会可要通知我哦。
From: BaKuBaKu.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部