模拟设计时组件托动、改变大小的问题?<等>

将计就计123 2004-06-15 12:02:18
如何实现运行时能够像设计时一样 点击组件,组件周围出现八个矩形区域
鼠标移到矩形区域上可以托动,改变组件的大小,位置等
...全文
139 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
将计就计123 2004-06-17
  • 打赏
  • 举报
回复
已找到了方法
谢谢各位
tonylk 2004-06-16
  • 打赏
  • 举报
回复
自己处理MouseDown,MouseUp等事件,在MouseDown时动态生成8个小控件(可以用TPanel之类的),并且在鼠标拖动这8个小控件时,自动更新主体。。。。如果要加上多选的功能就更复杂了,一句两句说不清楚的。。
踢踏 2004-06-15
  • 打赏
  • 举报
回复
如果完全按照你所说的去做,难度非常大。
上面的代码只对从TWinControl继承下来的VCL控件有效。
TLabel可以使用TStaticText来替代。
将计就计123 2004-06-15
  • 打赏
  • 举报
回复
谢过楼上的!
我的说明有“点击组件,组件周围出现八个矩形区域”一句,你的没有实现
且对于TLABEL这样的做法是不行的。
踢踏 2004-06-15
  • 打赏
  • 举报
回复
用这个,然后在鼠标的Move事件中使用。

procedure ManipulateControl(WinControl: TWinControl; Shift: TShiftState;
X, Y, Precision: integer);
var SC_MANIPULATE: Word;
begin
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最左侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)
then begin
SC_MANIPULATE := $F001;
WinControl.Cursor := crSizeWE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最右侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)
then begin
SC_MANIPULATE := $F002;
WinControl.Cursor := crSizeWE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最上侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision)
then begin
SC_MANIPULATE := $F003;
WinControl.Cursor := crSizeNS;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的左上角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X<=Precision) and (Y<=Precision)
then begin
SC_MANIPULATE := $F004;
WinControl.Cursor := crSizeNWSE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的右上角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=WinControl.Width-Precision) and (Y<=Precision)
then begin
SC_MANIPULATE := $F005;
WinControl.Cursor := crSizeNESW ;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最下侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)
then begin
SC_MANIPULATE := $F006;
WinControl.Cursor := crSizeNS;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的左下角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X<=Precision) and (Y>=WinControl.Height-Precision)
then begin
SC_MANIPULATE := $F007;
WinControl.Cursor := crSizeNESW;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的右下角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)
then begin
SC_MANIPULATE := $F008;
WinControl.Cursor := crSizeNWSE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的客户区(移动整个控件)******************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>5) and (Y>5) and (X<WinControl.Width-5) and (Y<WinControl.Height-5)
then begin
SC_MANIPULATE := $F009;
WinControl.Cursor := crSizeAll;
end
else begin
SC_MANIPULATE := $F000;
WinControl.Cursor := crDefault;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if Shift=[ssLeft] then
begin
ReleaseCapture;
WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
end;
end;
baseyueliang 2004-06-15
  • 打赏
  • 举报
回复
1、画出来,得自己捕捉焦点
2、使用Windows控件

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧