控件拖动位置的问题 ( 积分: 100 )

怎么自定义cursor 资源?
 
《突破delphi6.0编程实例五十讲》中国水利水电出版社里面第7讲“程序中可以自由移动的控件”有介绍!网上有电子文档下载
 
哪个网址呀?
 
不好意思,是我弄错了。
看看这样行不行,代码你需要整理一下拉,我没整理。
也许这种方法不好,但能达到你说的效果
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;

procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
procedure drawRectOnForm(x1,y1,x2,y2 : integer);
procedure clearRectOnForm(x1,y1,x2,y2: integer);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

var
xMouse,yMouse : integer;

xOld,yOld,xDownOld,yDownOld : integer;
{$R *.DFM}

procedure TForm1.clearRectOnForm(x1, y1, x2, y2: integer);
begin
with Canvas do
begin
pen.Color := form1.Color;
Pen.Style := psSolid;
Brush.Style := bsClear;
Rectangle(x1,y1,x2,y2);
end;
end;

procedure TForm1.drawRectOnForm(x1, y1, x2, y2 : integer);
begin
with Canvas do
begin
pen.Color := clgraytext;
Pen.Style := psDot;
Brush.Style := bsClear;
Rectangle(x1,y1,x2,y2);
end;
end;



procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
panel1.Left := X- xMouse;
panel1.Top := Y- yMouse;
panel1.EndDrag(true);
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if source is tpanel then
begin
//self.Canvas.
clearRectOnForm(xOld,yOld,xDownOld,yDownOld);
drawRectOnForm(X - xMouse ,Y - yMouse ,
X - xMouse + panel1.Width,
Y - yMouse + panel1.Height);
xOld := x - xMouse;
yOld := y - yMouse;
xDownOld := X - xMouse + panel1.Width;
yDownOld := Y - yMouse + panel1.Height;
accept := true;
end;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
xMouse := X;
yMouse := y;
panel1.BeginDrag(true);
end;

end.
 
主要是我的窗口有listview,就是为了不挡着listview的信息,所以才要上面的panel可以拖动,画的办法好象不行吧
 
http://www.ibook8.com/Software/Catalog17/10948.html
 
怎么不行呢,是在窗体的canvas上画的,对listview该没有影响的
 
就是窗口被listview全部覆盖了
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Point: TPoint;
begin
// if not MoveEnd then Exit;
Refresh;
Point := Mouse.CursorPos;
Point := ScreenToClient(Point);

self.canvas.Pen.Color := clBlack;
self.canvas.Pen.Style := psDash;
self.canvas.Pen.Width := 1;

Self.Canvas.MoveTo(Point.x, Point.y);
Self.Canvas.LineTo(Point.x + Panel1.Width, Point.y);
Self.Canvas.MoveTo(Point.x + Panel1.Width, Point.y);
Self.Canvas.LineTo(Point.x + Panel1.Width, Point.y + Panel1.Height);
Self.Canvas.MoveTo(Point.x + Panel1.Width, Point.y + Panel1.Height);;
Self.Canvas.LineTo(Point.x, Point.y + Panel1.Height);
Self.Canvas.MoveTo(Point.x, Point.y + Panel1.Height);
Self.Canvas.LineTo(Point.x, Point.y);
end;
//随手写了下,再结合Panel操作下就行了。
 
to Imk:
我就是下载的www.ibook8上面浏览pdg格式的超星阅览器,但还是说格式不对呢?
 
如果是虚线被listview挡住了可以选择在屏幕上画,如果是pannel被挡住了可以用BringToFront呀
 
怎么在屏幕上画呀?我在这方面了解得很少
 
GetDC(0)然后开始画吧 [:D]
 
to AK_2004:
怎么在屏幕上画呀?
 
在屏幕上画倒容易,关键是要清除移动的痕迹还不知道怎么做
画的话可以这样
procedure TForm1.drawRectOnForm(x1, y1, x2, y2 : integer);
var
cCanvas : Tcanvas;
DC : HDC;
begin
cCanvas := Tcanvas.Create;
try
DC := GETDC(0);
try
cCanvas.Handle := DC;
with cCanvas do
begin
pen.Color := clgraytext;
Pen.Style := psDot;
Brush.Style := bsClear;
Rectangle(x1,y1,x2,y2);
end;
finally
ReleaseDC(0,DC);
end;
finally
cCanvas.Free;
end;
end;
 
我也不晓得!我有书!也在网上下了个电子的!但没用过,现在把里面的程序放到上面你参考:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button1EndDrag(Sender, Target: TObject; X, Y: Integer);
procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
x_panel,y_panel,x_button,y_button : integer;

implementation

{$R *.dfm}


procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
x_button := x;
y_button := y;
end;

procedure TForm1.Button1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
button1.Left := x_panel + x_button;
button1.Top := y_panel + y_button;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
x_panel := x;
y_panel := y;
end;

procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
x_panel := x;
y_panel := y;
end;

end.
这个程序是实现在panel上拖动一个button,我已经运行了,还行。
 
to ak_2004:
我知道,新画的时候用背景色重画原来的就行了。[:D]
 
哦,对了,清除痕迹的问题解决了
现在就是坐标转化问题,等下我把代码改好了发给你
 
好的,我觉得坐标这样好些:
panel1.left:=panel1.left+(mouse.CursorPos.X-oldpanel1left)

oldpanel1left也是mouse.CursorPos.X来得到
 
继承下来,写在控件里就更完美了。
 
顶部