如何利用鼠标拖动复选组件?(10分)

Z

zyb

Unregistered / Unconfirmed
GUEST, unregistred user!
如何编程实现用鼠标拖动同时选中
多个组件(鼠标画一矩形,则矩形内的所有组件被选中),
就象DELPHI编辑状态时窗体
上组件的复选那样。
 
感兴趣,关注。
 
笨办法:
在OnMouseDown中记录mousepoint到一个变量中.
在OnMouseMove中画框
在OnMouseUp中用intersectrect判断各个control的boundsrect是否和您拖出来的rect相交
把相交的control到一个数组或者tlist中.
处理表示选中control的特殊显示.
 
to Another_eYes: 那么关键的部分呢?怎样判断2个rect相交?
请继续。
 
function intersectrect(var targetrect: TRect;
rect1: TRect;
rect2: TRect): boolean;
rect1和rect2相交部分生成targetrect,如果失败(rect1或rect2不相交或者有一个是emptyrect)则返回false
 
这个笨方法我也试过,利用Canvas.Rectangle()跟踪鼠标
轨迹画矩形,然后判断Control.RoundRect与所画矩形是否
相交...但本人在处理组件被选中的特殊显示时不知道怎么处理?
请明示!
另外,本人在组件被复选后还要进行相应的鼠标拖动操作,
这方法确实笨得很,记忆中好象听说过有某种简单方法,
但无论如何想不起,请大虾相助!
 
可以使用TStretchHandle控件,
可以在深度历险上找到,
或者到http://166.111.163.3的编程竹叶上找到(深度历险的镜像)
 
我这笨办法特多, 要处理选中的特殊显示用下面的笨办法:
假设您已经把您选中的controls保存到了一个tlist--MyControlList中:
var
dc: HDC;
bmp: TBitmap;
i, j: Integer;
b: PByte;
p: TPoint;
begin
bmp := tbitmap.create;
bmp.pixelformat := pf24bit;
dc := createdc('DISPLAY', nil, nil, nil);
for i := 0 to mycontrollist.count - 1do
begin
with TControl(MyControlList.items)do
begin
p := clienttoscreen(point(0,0));
bmp.width := width;
bmp.height := height;
end;
bitblt(bmp.canvas.handle, 0, 0, bmp.width, bmp.height, dc, p.left, p.top, SRCCOPY);
// 取得原来图象
for i := 0 to bmp.height - 1do
// 处理图象, 反色显示
begin
b := bmp.scanline;
for j := 0 to (bmp.width - 1)*3do
begin
b^ := b^ xor 255;
b := pointer(integer(b)+1);
end;
end;
bitblt(dc, p.left, p.top, bmp.width, bmp.height, bmp.canvas.handle, 0, 0, SRCCOPY);
end;
deletedc(dc);
bmp.free;
end;

要恢复原色只要redrawwindow(form.handle, nil, 0, RDW_ERASE or RDW_ERASENOW or RDW_ALLCHILDREN)即可
 
我有这个handle控件,效果和Delphi的IDE效果一样,要不要?
 
不是控件把,这个东西我也下载过,好象是个软件,有原程序,模拟Delphi的一个Delphi开发环境。
 
有handle这个软件(模仿delphi的),也有独立的handle控件,非常好用!
 
to Another_eYes:
多谢老兄不厌其烦地相助,
但问题的关键是,我在
对组件复选后紧接着还要
进行鼠标拖动操作(类似于WIN95的文件拖动拷贝操作),
那么在鼠标点击反色显示的组件
后,反色效果将消失,又如何办呢?
 
不要算了,反正就10分。
 
分无所谓
要拖动也简单.
刚才我是直接画到screen上的, 现在您先画到全局变量的bmp上, 再把bmp画到screen上呀.
用canvas.brushcopy可以实现透明.
拖动时只要判断鼠标事件OnMouseMove. redrawwindow(...), 在新位置画bmp. 呵呵.
 
to Another_eYes :
虽然你没有提供一个简单的方法,
但就凭老兄你的这分热情,
我也得将分奉上。
今后还请多多提携啊!
 
接受答案了.
 

Similar threads

D
回复
0
查看
746
DelphiTeacher的专栏
D
D
回复
0
查看
748
DelphiTeacher的专栏
D
D
回复
0
查看
595
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部