!!!!强烈关注!!动态创建问题中的异常现象,一般人我不告诉他哦。。:-)动态创建的可移动Image,为什么拖动后会在Image上出现一个小的windows关闭

  • 主题发起人 主题发起人 HaiGxj
  • 开始时间 开始时间
H

HaiGxj

Unregistered / Unconfirmed
GUEST, unregistred user!
!!!!强烈关注!!动态创建问题中的异常现象,一般人我不告诉他哦。。:-)动态创建的可移动Image,为什么拖动后会在Image上出现一个小的windows关闭,但是在创建第二个后就没有这种情况!带有源码!!急寻DFW相助,,杀光日本猪! (50分)<br />unit resizeandpull;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure ManipulateControl(Control: TControl; Shift: TShiftState; X, Y, Precision: integer);
var
SC_MANIPULATE: Word;
begin
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最左侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (X<=Precision) and (Y>Precision) and (Y<Control.Height-Precision)
then begin
SC_MANIPULATE := $F001;
Control.Cursor := crSizeWE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最右侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=Control.Width-Precision) and (Y>Precision) and (Y<Control.Height-Precision)
then begin
SC_MANIPULATE := $F002;
Control.Cursor := crSizeWE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最上侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>Precision) and (X<Control.Width-Precision) and (Y<=Precision)
then begin
SC_MANIPULATE := $F003;
Control.Cursor := crSizeNS;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的左上角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X<=Precision) and (Y<=Precision)
then begin
SC_MANIPULATE := $F004;
Control.Cursor := crSizeNWSE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的右上角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=Control.Width-Precision) and (Y<=Precision)
then begin
SC_MANIPULATE := $F005;
Control.Cursor := crSizeNESW ;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的最下侧**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>Precision) and (X<Control.Width-Precision) and (Y>=Control.Height-Precision)
then begin
SC_MANIPULATE := $F006;
Control.Cursor := crSizeNS;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的左下角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X<=Precision) and (Y>=Control.Height-Precision)
then begin
SC_MANIPULATE := $F007;
Control.Cursor := crSizeNESW;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的右下角**********************************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>=Control.Width-Precision) and (Y>=Control.Height-Precision)
then begin
SC_MANIPULATE := $F008;
Control.Cursor := crSizeNWSE;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//光标在控件的客户区(移动整个控件)******************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (X>5) and (Y>5) and (X<Control.Width-5) and (Y<Control.Height-5)
then begin
SC_MANIPULATE := $F009;
Control.Cursor := crSizeAll;
end
else begin
SC_MANIPULATE := $F000;
Control.Cursor := crDefault;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if Shift=[ssLeft] then
begin
ReleaseCapture;
Control.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
Imagex : TImage;
begin
Imagex := TImage.Create(self);
Imagex.Parent := self;
Imagex.Left := 50;
Imagex.Top := 100;
Imagex.Picture.LoadFromFile('d:/1.bmp');
Imagex.OnMouseMove := Form1.Button1.OnMouseMove;
//Image 控件不能直接移动,需要用到下面的修改
form1.docksite:=true;
Imagex.DragKind:=dkdock;
Imagex.DragMode:=dmautomatic;
////////////////////////////////////////////////
Imagex.Stretch := true;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
ManipulateControl((Sender as TControl), Shift, X, Y, 10);
end;

end.
 
UP有分!! 急寻高手啊~~
 
好像因为图像无窗口句柄无法响应WM_SIZING 消息,
在拖动时delphi自动加上了一个窗口,用来响应消息,如果把image换成其它有句柄的控件的话就不会有问题了,如您拖动按钮等
 
拖奇数次没有“关闭”按钮
拖偶数次则有
我也想知道是为什么?
 
必须用Image控件,没办法,摆脱各位大侠帮帮忙
 
关日本猪什么事?
 
代码我不会,杀猪狗不如的东西有倒是有兴趣.

:( 又在灌水了
 
好,,欢迎参加杀猪大会!! 遍发英雄贴,邀天下英雄!
 
问题出在下面的代码: (VCL的Controls单元)
这是拖动结束要泊靠时调用的,用来取鼠标处的泊靠点。
function GetDockSiteAtPos(MousePos: TPoint; Client: TControl): TWinControl;
begin
Result := nil;
if (DockSiteList = nil) or
not (Application.AutoDragDocking xor ((GetKeyState(VK_CONTROL) and not $7FFF) <> 0)) then
Exit;
QualifyingSites.Clear;
for I := 0 to DockSiteList.Count - 1 do
begin
Site := TWinControl(DockSiteList);
if (Site <> Client) and Site.Showing and Site.Enabled and
IsWindowVisible(Site.Handle) and (not IsSiteChildOfClient) and
[u[red]]((Client.HostDockSite <> Site) or (Site.VisibleDockClientCount > 1)) //就在这里 [/red][/u]then
begin
CanDock := True;
Site.GetSiteInfo(Client, R, MousePos, CanDock);
if CanDock and PtInRect(R, MousePos) then
QualifyingSites.AddSite(Site);
end;
end;
if QualifyingSites.Count > 0 then
Result := QualifyingSites.GetTopSite;
if (Result <> nil) and not ValidDockTarget(Result) then
Result := nil;
end;
刚开始时,Image的HostDockSite等于nil,此时此方法将返回Form1。放下后Image.HostDockSite就被设置成Form1了,下次再拖就不能通过上面注释的那句判断,将返回nil,也就是说鼠标下没有泊靠点,于是Image将变成浮动状态。当再创建一个Image之后并拖放一次,Form1的VisibleDockClientCount将变成2,因此就可以通过判断,返回Form1作为鼠标下的泊靠点。

这就是原因。
 
wenzheng2k, !大侠。你真是好牛!
原因知道了,可是我邀问你一个蠢蠢的问题,怎么解决了??
可以自己给Image设一个泊靠点么?
 
我试了一下,
我的怎么都可以啦,
建了十个都可以呀,
恐怕一百个都可以呢,
如果有人打赌我就建他三百个。
呵呵~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
Netsoft大侠, 不会吧:-)
我就是不行啊,我在Delphi7下面做的。。:-)
 
Netsoft, 可以把你做的给我发一个么??大侠,救命咯!!:-)
 
不好意思啦,
我的是在Delphi5下,
个人见解:
既然第一个建立成功,那第二个也一定会成功的啦,都是TButton Click产生的呀,一样的代码。
看来D5真的很好耶,
呵呵~~~~~~~~~~~~~~~~~~~
 
5555,没有办法,我也不知道怎么去改了。。大侠你在那里啊:-)
 
一定要用DOCK吗?
 
合合。。。
 
wlmmlw 大侠,请问您是否有更好的方法,:-) 请不吝告解~
 
1。可以修改VCl源码,把那句判断注释掉。
2。可以不用泊靠。自己响应Drag,Drop事件,来设置Image的位置。
 

Similar threads

I
回复
0
查看
741
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部