哪位大侠知道如何捕捉该消息?急,在线等待(50分)

  • 主题发起人 主题发起人 cb422
  • 开始时间 开始时间
C

cb422

Unregistered / Unconfirmed
GUEST, unregistred user!
TLayoutPanel继承TPanel控件,已经完成了移动和改变大小的功能。
现在假设应用程序拥有三个TLayoutPanel控件pnl1, pnl2, pnl3,当用户的鼠标点击其中
pnl1时,能够在pnl1控件上有一个标记表示现在客户选的就是pnl1,如果用户随后点击pnl2
此时pnl2上应该有此标记,而pnl1上没有。如果随后没有点击pnl2或pnl3,则标记总在pnl1
上。
我不知道要完成此功能应该重载TPanel的什么消息或事件,我重载了OnClick事件但是没
有完成此功能。
 
你截获 MouseDown 试一试
 
要在 pnl1, pnl2, pnl3 的 OnClick 事件上写,不是在你的 Panel 上
 
//要在 pnl1, pnl2, pnl3 的 OnClick 事件上写,不是在你的 Panel 上
那到不一定,否则如何实现通用性?
 
to 轻松虎
pnl1,pnl2,pnl3是动态生成的,我在他们的OnClick中写了还是不行:
procedure TForm1.PanelClick(Sender: TObject);
begin
TLayoutPanel(Sender).DrawCorner(clBlack);
end;

procedure TForm1.AddRegion;
begin
FCurrentRegion := TLayOutPanel.Create(Self);
FCurrentRegion.Left := 0;
FCurrentRegion.Top := 0;
FCurrentRegion.Width := 50;
FCurrentRegion.Height := 50;
FCurrentRegion.Parent := ScrollBox1;
FRegions.Add(FCurrentRegion);
FCurrentRegion.Caption.Text := ' Region' + IntToStr(FRegions.Count);
FCurrentRegion.OnEnter := PanelClick;
end;
 
当你的 TLayOutPanel 上面没有可视控件的时候是不会触发 OnEnter 事件的,除非
里面有可视控件并且焦点在上面时,所以你最好把处理函数赋给 OnClick 事件 或者 OnMouseDown
OnClick 事件里这么写
var
i : integer;
begin
with Sender do
for i := 0 to Owner.ComponentCount - 1 do
if Owner.Components is TLayOutPanel then
begin
if Owner.Components = Sender then
TLayoutPanel(Sender).DrawCorner(clBlack)
else
TLayoutPanel(Owner.Components).DrawCorner(clWhite); //看你怎么写了
end
end;
 
to 轻松虎
你说的OnClick是在哪里写,是在TLayoutPanel控件中,还是应用程序的TForm中。
在应用程序的TForm中写OnCLick不能实现该功能
 
在你的 FCurrentRegion,也就是 TLayoutPanel
 
当然在 TLayoutPanel 中写,否则你设计 TLayoutPanel 毫无意义。
 
我的Panel是动态创建的,可能不止有3个,那就不能用procedure pnl1Onclick(Sender: TObject);
我声明了一个PanelClick(Sender: TObject)的函数,在动态生成TLayoutPanel时将pnl1.OnClick := PanelClick,pnl2.OnClick := PanelClick,pnl3.OnClick := PanelCLick.....
但是,我在调试该程序时单击了pnl1,pnl2...没有执行pnl1.OnClick,pnl1.OnClick,不知道为什么?
 
最好在你的 TLayoutPanel.Create 方法里给事件赋值,把事件的处理写在你的构件单元里,在你动态生成每一个 Panel 时执行一次
 
to 轻松虎
我在TLayoutPanel.Create中给OnClick赋值,但是在应用程序中点击Panel没有响应
OnClick,不知道是什么原因?
 
to 轻松虎
我在TLayoutPanel重载了WM_LButtonDown,WM_LButtonUp,,WM_MouseMove三个函数,我认为
就是因为这样就不能响应OnClick,但是不知道为什么?????
 
哈,那你可以在重载函数里用 inherited 调用继承方法就好了
 
你要实现的功能是否是象Delphi编辑器一样的能够拖动和多选在某个容器中的控件,
如果选中某个控件,显示八个点?
如果是这样你应该按如下的方法编这个程序:(当然首先你要知道怎么截取Delphi消息)
WM_LBUTTONDOWN:
mDown:=True; // 设置一个标志
SourceRect:=GetRect(SelectedWindow)
HideGrab(SourceRect); // 隐藏当前选中的控件上八个小窗口
SourceXY:=NowXY; // 记住当前位置
DrawRect(SourceRect) // 绘制一个异或虚线框
WM_MOUSEMOVE:
if mDown Then
Begin
DrawRect(SourceRect) // 首先消除虚线框
OffsetXY:=NowXY-SourceXY; // 计算上次和现在移动的偏移
SourceXY:=NowXY; // 记住现在的偏移
OffsetRect(SourceRect,OffsetXY) // 重新计算位置
DrawRect(SourceRect) // 显示虚线框
End;
WM_LBUTTONUP
if mDown Then
Begin
DrawRect(SourceRect); // 此处一般是用异或的方式画框,到这里正好执行四次消失
OffsetXY:=NowXY-SourceXY;
Left:=NowXY... // 计算此时控件的Left,Top,Width,Height
ShowGrab; // 在选中控件上显示八个小窗口
End;
上面这个方法是实现类似Delphi编辑器中拖动控件和多选的基本方法,要完全实现和Delphi
一致的功能要增加很多东西,而且用截取控件的消息方法已经不够了,必须用OnMessage方法
截取,然后分析消息并处理


 
to TK128
可以说具体点吗
 
对这个消息进行处理不可以么?
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
 
后退
顶部