■■■如何跨越多个窗体画一条线?■■■

goomoo 2003-02-17 09:49:59
如何跨越多个窗体画一条线?就象DreamWeaver中的拖动target标志到目标文件时画出的一条直线。

注意这些窗体有可能不是同一个应用程序的。
...全文
76 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
goomoo 2003-02-17
  • 打赏
  • 举报
回复
送给大家一段源码:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
opx,opy,lpx,lpy:integer; //opx:origion point x lpx:last piont x
startDraw:boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
opx:=mouse.CursorPos.X;
opy:=mouse.CursorPos.Y;
lpx:=mouse.CursorPos.x;
lpy:=mouse.CursorPos.Y;
startDraw:=true;
timer1.Enabled:=true;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
startDraw:=false;
timer1.Enabled:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
dc:hdc;
c:TCanvas;
begin
dc:=getDC(0);
c:=TCanvas.Create;
try
c.Handle:=dc;
c.Pen.Mode:=pmNotXor;
c.MoveTo(opx,opy);
c.LineTo(lpx,lpy);
//c.MoveTo(opx,opy); //这句注释掉和不注释调效果不同
c.LineTo(mouse.CursorPos.x,mouse.CursorPos.Y);
lpx:=mouse.CursorPos.x;
lpy:=mouse.CursorPos.Y;
finally
c.free;
end;
end;

end.

sysu 2003-02-17
  • 打赏
  • 举报
回复
是了,应该是GetDC(0)。;)
zwjchina 2003-02-17
  • 打赏
  • 举报
回复
把dc:=getdc(getDeskTopWindow)改为
dc := GetDC(0)
goomoo 2003-02-17
  • 打赏
  • 举报
回复
我已搞定了。 :)
goomoo 2003-02-17
  • 打赏
  • 举报
回复
好像不行,我是这样写的:

procedure TForm1.Button1Click(Sender: TObject);
var
dc:hdc;
c:TCanvas;
begin
dc:=getdc(getDeskTopWindow); //将getDesktopWindow改成form1.handle则可以在窗体上画线。
c:=TCanvas.Create;
try
c.Handle:=dc;
c.MoveTo(0,0);
c.LineTo(600,400);
finally
c.free;
end;
end;
goomoo 2003-02-17
  • 打赏
  • 举报
回复
谢谢! 我试试先。
sysu 2003-02-17
  • 打赏
  • 举报
回复
GetDC(GetDesktopWindow)

5,379

社区成员

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

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