在桌面上画线(200分)

  • 主题发起人 主题发起人 无疯无禄
  • 开始时间 开始时间

无疯无禄

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道大家有没有看到99年变速齿轮作者发表的一篇文章<br>就是在桌面上画了很多基线,怎么在桌面上做线,要在所有窗口上面,而且不能被刷新掉
 
在桌面上画导师不难,但怎样在所有窗口上面?
 
procedure TForm1.FormCreate(Sender: TObject);<br>var<br>&nbsp; Canvasc :TCanvas;<br>&nbsp; i :integer;<br>begin<br><br>&nbsp; Canvasc :=TCanvas.Create ;<br>&nbsp; Canvasc.Handle :=Getdc(0);<br>&nbsp; Bmp :=TBitmap.Create ;<br>&nbsp; Bmp.Width :=1024;<br>&nbsp; Bmp.Height :=768;<br>&nbsp; Bmp.Canvas.CopyRect(Rect(0,0,1024,768),Canvasc,Rect(0,0,1024,768));<br><br>&nbsp; for i:=0 to 512 do<br>&nbsp; begin<br>&nbsp; &nbsp; Canvasc.Brush.Color :=clYellow;<br>&nbsp; &nbsp; Canvasc.Pen.Color :=clBlue;<br>&nbsp; &nbsp; Canvasc.Rectangle(512-i,0,512+i,768);<br>&nbsp; &nbsp; sleep(1);<br>&nbsp; end;<br>&nbsp; Canvasc.CopyRect(Rect(0,0,1024,768),Bmp.Canvas,Rect(0,0,1024,768));<br>&nbsp; Bmp.free;<br>&nbsp; Canvasc.Free;<br>end;<br><br>你可以执行上面一段代码,原理是一样的,你可以定时的重画一下就OK了
 
顶层透明窗口怎么样?
 
dc := createdc('DISPLAY', nil, nil, nil);<br>pn := createpen(PS_SOLID, 2, $0000FF);<br>deleteobject(selectobject(dc, pn));<br>movetoex(dc, 5, 5, nil);<br>lineto(dc, 1000, 700);<br>deletedc(dc);<br>deleteobject(pn);<br><br>上述代码将在屏幕上画一条红线(蓝线?)。2像素宽。 在所有窗口上面。<br>如果想不被窗口刷新破坏。 那么用个定时器定时重画。
 
有没有真正刷不掉的
 
要刷不掉也简单!<br><br>你只要截获 display 的 WM_paint 事件。<br>在该事件中写上述代码。
 
本来画线就不难,但如何让桌面闪烁的不历害呢?<br><br>在不用XOR画的时候,多次画线会闪的!!!!谁能解决??
 
先在内存中写
 
就用定时器,简单;
 
获取桌面窗口句柄,在此窗口上画。<br>另外一种可能是直接访问显存,把矢量图的数据发到显存里去
 
<br>画线简单,只要将Canvas.Handle:=GetDC(0)就行了。<br>对刷新的问题有点兴趣。
 
后退
顶部