头疼中...Win7(Vista)的bug?怎么绕过去?

阿呆_ 2009-09-22 06:02:30
加精
重现问题步骤:
1. 新建一个form,放一个 button. button.Onclick写如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitmap;
dc: HDC;
begin
bmp := TBitmap.Create;
bmp.PixelFormat := pf24Bit;
bmp.Width := Width;
bmp.Height := Height;
dc := GetWindowDC(Handle);
BitBlt(bmp.Canvas.Handle, 0, 0, Width, Height, dc, 0, 0, SRCCOPY);
ReleaseDC(Handle, dc);
bmp.SaveToFile(ExtractFilePath(ParamStr(0))+'temp.bmp');
bmp.Free;
end;

很简单的程序吧, 作用就是截取整个form的图片保存到temp.bmp中.
2. 编译后在win7(with Aero Theme, 也就是毛玻璃效果)下运行(估计vista+Aero Theme也一样的毛病), 点击button. 不要退出程序,用explorer察看生成的bmp, 一切正常. 删除这个bmp.
3. 回到程序中,把窗口拖大点,再次点击button. 再看看生成的bmp。惊奇吗?

经过测试,发觉只有form最大/最小或者隐藏再显示后才可以再次得到正确的bmp, 如果只是简单改变窗口大小后用GetWindowDC获得的DC中保存的边框图案永远是第一次得到的。
很头疼,不知道有什么办法可以绕过这个缺陷。而更头疼的是如果用SetLayeredWindowAttributes设置了Alpha值的窗口用GetWindowDC获取的DC中根本就没有frame的图案了,即使给窗口发WM_PRINT也打不出frame。
那么,有什么办法可以在这种情况下获取正确的窗口图案呢? 用DrawThemeBackground自己画?怎么画?
...全文
3041 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
s912360101 2010-01-22
  • 打赏
  • 举报
回复
支持linux。
金卯刀 2010-01-11
  • 打赏
  • 举报
回复
http://blogs.msdn.com/oldnewthing/archive/2005/08/01/445998.aspx

http://www.codeproject.com/KB/winsdk/xpvisualstyle.aspx
Hotthing 2009-09-28
  • 打赏
  • 举报
回复
我用delphi5 编了个很大的程序,可执行文件10M 左右,在VISTA下没有问题,除了好像颜色有些地方不对,其他都好。

在Windows7 yingai 没有问题
ljsheng 2009-09-27
  • 打赏
  • 举报
回复
阿呆_ 2009-09-26
  • 打赏
  • 举报
回复
RecreateWnd开销太大,它所做的其实就是DestroyWindow()->CreateWindowEx();
如果你写的程序主窗口的HWND每秒要改变50次你认为这个程序还能用?

所以用RecreateWnd或者hide; show;达到目的不在考虑范围内。
Frank.WU 2009-09-26
  • 打赏
  • 举报
回复
我知道一个折中的办法,但是不能抓取到Aero毛玻璃效果的标题栏。抓图后的效果是原始的windows没有主题的窗体界面。

printwindow()这个函数
Frank.WU 2009-09-26
  • 打赏
  • 举报
回复
我测试过先用 RecreateWnd 再抓图正常啊,你怎么不试一试?
lextm 2009-09-26
  • 打赏
  • 举报
回复
可以参考http://www.windowclippings.com/

作者Kenny Kerr的相关博客以及文章应该是谈到了所涉及到的API使用。既然都是呼叫API的话,Delphi没什么理由做不到。
阿呆_ 2009-09-26
  • 打赏
  • 举报
回复
不关delphi的事. 难道没人注意到主要逻辑都是通过API实现的?
ye091032 2009-09-26
  • 打赏
  • 举报
回复
用Delphi2010试试
showbook 2009-09-25
  • 打赏
  • 举报
回复
等待高手路过!
zfx023 2009-09-25
  • 打赏
  • 举报
回复
vista没怎么用过,win7就更不用说了
wtw11897 2009-09-25
  • 打赏
  • 举报
回复
niao a
mars_feiji 2009-09-25
  • 打赏
  • 举报
回复
嘿嘿,拿分走人
阿呆_ 2009-09-25
  • 打赏
  • 举报
回复
在网上搜了几天,终于发现这是一个不可能实现的功能。 因为GLASS边框是DWM渲染到屏幕上的,而MS并没有提供访问DWM渲染数据的接口(dwmapi.dll中提供的documented的api都是读取/设置一些渲染选项用的)
现在需要的是可以获得Aero Theme中那种超出窗口范围的按钮发光的效果。现在既然不可能通过DC获取图案,那么能否通过自画? 不过在网上找了一圈也没有发现有用Aero Theme调用DrawThemeBackground的例子,哪位能够给个具体用Aero Theme的自画caption的例子? 任何语言都可以.
本本Hello 2009-09-24
  • 打赏
  • 举报
回复
不会,等高手解答
leo_xin 2009-09-24
  • 打赏
  • 举报
回复
再认真想想
deng88927 2009-09-24
  • 打赏
  • 举报
回复
我只用过window 7 RC版的。。RTM版的暂时没用。。。
我不想折腾我的本本。我本本现在安装的xp,卸载window 7RC的原因很简单。内存不足。
我本本1GB内存,跑起来比较吃力。。。不是系统跑起来吃力,而是开几个程序马上就上到800-900MB内存哒。。
所以还是用会xp。。。
前段时间升级了一下。。。准备开始安装windows 7 RTM版
zztoad 2009-09-24
  • 打赏
  • 举报
回复
没用过 win7 呢
kaith11 2009-09-24
  • 打赏
  • 举报
回复
不会,等高手解答
加载更多回复(46)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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