在桌面上绘图之后,该如何把它擦去呢?(100分)

  • 主题发起人 主题发起人 occult
  • 开始时间 开始时间
O

occult

Unregistered / Unconfirmed
GUEST, unregistred user!
问题如下:<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; BMP : TBitMap;<br>&nbsp; CV &nbsp;: TCanvas;<br>&nbsp; R &nbsp; : TRect;<br>begin<br>&nbsp; BMP := TBitMap.Create;<br>&nbsp; BMP.LoadFromFile('E:/My Work/DrawDeaktop/s03.BMP');<br>&nbsp; R:= Rect(0,0,100,40);<br>&nbsp; CV:= TCanvas.Create;<br>&nbsp; CV.Handle := GetDC(0);<br>&nbsp; CV.Draw(100,100,BMP);<br>&nbsp; CV.Free;<br>&nbsp; BMP.Free;<br>end;<br><br>当我如上在桌面上Draw了一幅位图之后,我又该如何把这幅图擦去呢?试过<br>了Invalidaterect, updateWindow都不行,该如何作呢?请指教!!
 
实际上我认为是一个重新绘图的问题
 
拉呀拉..................
 
用"异或"的方式画图,要擦除时再用"异或"的方式在原来的位置上再画一遍行吗?<br>tcanvas.copymode具体用哪一个值不知道,你自己多试试!
 
刷新桌面不行吗?
 
你要先把背景保存!
 
用异或的方式...唔,不太好吧,我岂不是还得作一幅Mask图了吗?<br>保存背景倒是一个方法,待我试试,不过我并不是覆盖整个桌面的画一张图....而且万一同<br>时桌面有更新该如何呢?<br><br>桌面其实是一个ListView,我总想应该可以通过发一个消息给它,通知它自己重画不就结了,<br>可是试了试几个消息(WM_PAINT...)都不行,后来就试着用InvalidateRect来强制通知<br>windows重画这个Rect,可是在桌面就不灵,但我想我的思路应该是对的,让它自己重绘<br>一次就可以了,不用自己去再作什么。就好比我画完了后,随便找个窗子往上一盖,再<br>移开,windows自己就重绘如初了,但该发个什么消息呢?或是有什么更好的API呢?
 
拉呀拉..................<br>
 
弄个窗口最大化,再把这个窗口关了,就应该能重画,估计也就是闪一下...
 
再作一次<br>&nbsp; BMP := TBitMap.Create;<br>&nbsp;
 
估计有API可以。
 
反相地再写、画一下
 
关注此题!<br>好多桌布游戏是怎么做的?有大虾知道么?
 
<br>关键是要找到正确的窗口句柄,invalidrect才能成功,不知道你是如何调用的。<br><br>要让桌面重画,这段代码就可以了。<br>var<br>&nbsp; &nbsp;wnd:HWND;<br>begin<br>&nbsp; &nbsp;Wnd := GetDesktopWindow;<br>&nbsp; &nbsp;Wnd := FindWindowEx(Wnd, 0, 'Progman', nil);<br>&nbsp; &nbsp;Wnd := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil);<br>&nbsp; &nbsp;Wnd := FindWindowEx(Wnd, 0, 'SysListView32', nil);<br>&nbsp; &nbsp;InvalidateRect(Wnd, nil, TRUE);<br>end;<br>
 
to 温柔一刀: <br>&nbsp; 多谢,我以前的问题出在 InvalidateRect(GetDeskTopWindow,nil,true)上了,<br>多谢您的提醒,呵呵,不过我觉的似乎也不用<br>&nbsp; &nbsp;Wnd := GetDesktopWindow;<br>&nbsp; &nbsp;Wnd := FindWindowEx(Wnd, 0, 'Progman', nil);<br>&nbsp; &nbsp;Wnd := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil);<br>&nbsp; &nbsp;Wnd := FindWindowEx(Wnd, 0, 'SysListView32', nil);<br>&nbsp;这么麻烦吧,直接Wnd := FindWindow('SysListView32',nil)就可以了。 &nbsp;
 
接受答案了.
 
&gt;&gt;直接Wnd := FindWindow('SysListView32',nil)就可以了。 &nbsp;<br><br>错,Windows系统本身使用的listview类名称都是SysListView32,<br>例如explorer窗口、资源管理器等等,因此如果你没有任何类似窗口打开,<br>那么恰好找到的是desktop窗口,否则结果可能不可预料。
 
多谢多谢,我又粗心了
 
后退
顶部