unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
  Brush.Style :=bsClear;//这里的实现方法用Delphi是最简单的了
   Tag:=0;  //使用Form的Tag属性作标志位end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Tag:=1; //置位
Canvas.MoveTo(X,Y); //将Pen的位置移到当前
Canvas.Pen.Width := 8;
Canvas.Pen.Color :=clred;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if Tag=1 then
begin
   Canvas.LineTo(x,y);//画线
end;
end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Tag:=0; //标志位
end;procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=27 then
begin
 form1.WindowState:=wsMinimized;
end;
end;
end.
这段代码是从网上找到的,它只能画在自己的窗体上,我想实现在桌面或其它窗口上涂鸦,请问怎么办?
最好能给出代码!

解决方案 »

  1.   

    你获得其它窗口的句柄,然后就可以调用GDI画了。
      

  2.   

    是的,完全用API,可以在桌面上写字,画图,其实桌面取得DC后,就可以任意作图。
      

  3.   

    getdc(0)就可以获得桌面的句柄
      

  4.   

    getdc(0)就可以获得桌面句柄,不过,不建议在桌面涂鸦,好像是违反什么编程原则的,呵呵
      

  5.   

    设备描述表
    桌面有句柄的哦,GetDeskTopHandle可以获得桌面句柄
      

  6.   

    还是不太懂,我再加100分,谁有代码发给我一份.
    如果谁手里正好有此代码的话
    请发工程文件到我的信箱中.
    [email protected]
      

  7.   

    如果谁手里正好有此代码的话 
    请发工程文件到我的信箱中. 
    [email protected] 
      

  8.   

    一个典型的例子,ZT的
    应该可以看明白了
    program MASK; 
    uses 
     windows, 
     Graphics; {$R *.res} var 
     DC:TCanvas; 
     i,j:integer; 
    begin 
    DC:=tcanvas.create; 
    DC.handle:=getdc(0); 
    for i:= 1 to 400 do begin 
     DC.MoveTo(400,300); 
     DC.LineTo(2*i,1); 
     DC.MoveTo(400,300); 
     DC.LineTo(2*i,600); 
     DC.MoveTo(400,300); 
     DC.LineTo(1,round(i*1.5)); 
     DC.MoveTo(400,300); 
     DC.LineTo(800,round(i*1.5)); 
    end; 
    DC.Pen.Color:=clred; 
    For j:= 1 to 120  do begin 
    DC.moveTo(600,1); 
    for i:= 1 to 800 do 
      DC.LineTo(i,600-round(i*i/(Sqr(j)/2))); 
    DC.moveTo(1,1); 
    for i:= 1 to 800 do 
      DC.LineTo(i,round(i*i/(Sqr(j)/2))); 
    end; 
    DC.Font.Size:=72 ; 
    DC.Font.Color:=clblue; 
    DC.Brush.Color:=clbackground; 
    DC.textout(10,100,'看不到了吧!'); 
    end. 
      

  9.   

    var
      ACanvas: TCanvas;
    begin
      ACanvas := TCanvas.Create;
      ACanvas.Handle := windows.GetDC(0);   //GetDC(0) 表示,取得桌面的HDC, 如果画在其他窗口,就: GetDC(其他窗口的handle)
      with ACanvas do
      begin
        Lock;
        Pen.Color := clRed;
        Pen.Width := 5;
        MoveTo(0, 0);
        LineTo(Screen.Width, Screen.Height);
        MoveTo(Screen.Width, 0);
        LineTo(0, Screen.Height);
        Unlock;
      end;
    end;
      

  10.   

    名词解释:
    GDI: Graphic Device Interface  图形设备接口DC: Device Context(还是Content)  设备上下文.
      

  11.   

    有关DC:我的理解:
        硬件厂家太多,显卡的型号太繁杂,如果想在屏幕上或者其他外设上输出图形,那么程序员就必须处理各种可能的硬件,就得写好多个case语句.    Microsoft为了简化这个工作,就搞出了一个东西,姑且先称它为图形设备吧.这个设备内部是怎么实现的(和具体的显卡驱动程序有关),你不用管.
    你只要会用它的接口就行了,也就是:图形设备接口. *****************************************
    有关接口:(熟悉接口的同学,请跳出*号的范围)
    接口,就是......功力不到家,我也不知道改怎么给它下定义.  郁闷...
    举例说明:
       mp3,现在很多人用来听歌的,算是个设备吧,这个设备,内部可能很复杂,集成电路的各种电子器件组成的,还有软件的部分...
       不用怕,内部是什么构造,我们并不关心,我们只要会操作就行了,只要看看说明书,就知道,哪个键控制声音,哪个键开关机....
       哈哈,现在好说明了,接口,就是这些按键......mp3的产品说明书,就是接口说明. 只要知道了接口是怎么定义的,就能使用这些接口.
       当然了,使用接口之前,还必须取得这些接口. 为什么要取得接口?mp3的按键不是摆在那里吗?不是直接用就行了?
       
       Microsoft可是个很大的公司,他们搞出来的东西,各种各样,光就一个mp3? 各种各样的dll文件,那是什么?那些都是函数库.仓库啊!仓库里面除了有mp3,还有DVD, DV, CCTV.....汗~~~~~   所以你首先必须告诉windows,我要使用mp3的功能, 你把它的按键拿给我用用吧...  从请求,到摸到mp3的按键这个过程,就是取得接口的过程.*****************************************
    你程序员不是要在外设上输出东西吗,ok,现在方便了,你要输出什么,输出在哪个位置,用什么颜色,什么字体......直接通过操作这些接口,
    windows就自动去帮你画画去了......那些各种这样那样的显卡,怎么弄,怎么弄,全交给windows了.
    DC: 不知道我理解得对不对,DC就是windows系统里面,在window上画图的机器.
    windows系统里面的window多啊,一个DC哪够?于是,windows就生产了一大批名叫DC的机器,一个window分配一个DC去画...
    机器多了,不容易认,就给机器编了号.
    等等,等一下,编号是什么类型的??? 数字? 字符?  没错, 是数字. 可是windows里面的机器太多了,有DC,还有其他机器,比如画刷.
    怎么知道 编号为1001的机器是什么?是DC?还是刷子?  于是,windows又分类了,又多了好多类型, 虽然最后这些编号的值都是数字,
    但是这些设备上印刷的数字用的是不同的字体.  有称为HDC的字体,有名字叫HBRUSH的字体.
    这样一来,对于一个编号为1001的HDC类型的机器,就固定了.  一看到数据类型是HDC的,就知道,哦,这是个编号,用这种编号,可以找到唯一的那个画图的机器.
    好了,现在,我想在某个window上画图,光知道window的编号(Handle)没用啊,还得找到在这个编号的window上画图的那台该死的机器啊.于是,microsoft提供了一个函数: function GetDC(AWindowHandle: THandle): HDC;接下来,大家都知道怎么做了......散会! 
      

  12.   

    在你的代码上改造的话,估计是有困难.之前大家说的,都是直接用代码去画.而你需要控制鼠标去点,拖动,然后画.当你的鼠标点到别的程序的窗口的时候,你的窗口是收不到鼠标消息的.可以用钩子实现,但是目前,对你来讲,好象很有难度....必须了解windows的消息机制才行.
      

  13.   

    不建议直接用canvas画图,建议关注下GDIPLUS,直接用canvas画表面上没有什么问题,但是你细致的分析会发现很多令人不满意的地方,比如线不直有棱角,线的交接处放大后有缝隙等等很多问题,而且用GDIPLUS通过路径画图几乎能画出你所能组合出的任意图形,渐变画刷也是很令人兴奋的!呵呵,看看吧
      

  14.   


    不一定要在桌面写字,是在最顶层的窗体上,或说是当前的窗体上.窗体之间可以切换写字的
    即在桌面写字,然后打开ie,也可以在ie窗体上写字.在之前写在桌面上的字,可以不保留.我的程序可以没有窗体
      

  15.   

    GDI听说过吧?现在用GDI+了,实际上也是对canvas画图的一个封装和内部处理,在网上找找看吧。
      

  16.   

    就是图片绘好了,也会被目标窗口的OnPaint抹除的
      

  17.   

    我们有个产品 FreeDesktop
    http://www.codeidea.com/cn/
      

  18.   

    获取桌面或其它窗口的画布的句柄。用GetDC