Delphi 绘制图像而不是窗口标题
我需要做一些看起来很简单的事情,但我已经找了好几天没有成功了。 我有一个固定大小的窗口(比如500*250),需要用一个固定大小的JPEG(或者更好的PNG)图像(比如500*25)替换整个标题栏。 有很多关于玻璃、航空、DWM等等的样品。但我只需要画一个固定的图像 我已经试过了,但不起作用:Delphi 绘制图像而不是窗口标题,delphi,delphi-xe,caption,Delphi,Delphi Xe,Caption,我需要做一些看起来很简单的事情,但我已经找了好几天没有成功了。 我有一个固定大小的窗口(比如500*250),需要用一个固定大小的JPEG(或者更好的PNG)图像(比如500*25)替换整个标题栏。 有很多关于玻璃、航空、DWM等等的样品。但我只需要画一个固定的图像 我已经试过了,但不起作用: procedure TForm1.Button1Click(Sender: TObject); var bmp:TBitmap; DC:HDC; begin DC:=GetWindowDC(form1.H
procedure TForm1.Button1Click(Sender: TObject);
var
bmp:TBitmap;
DC:HDC;
begin
DC:=GetWindowDC(form1.Handle);
bmp:=tbitmap.Create;
bmp.SetSize(500, 25);
bmp.Canvas.TextOut(5,5,'Helloooooooooooooooooo');
BitBlt(dc,0,0,500,25,bmp.Canvas.Handle,0,0,SRCCOPY);
bmp.Free;
ReleaseDC(form1.Handle,DC);
end;
它应该可以在XP和Vista/7上运行。请帮忙
附言:我有Delphi XE。您可以使用
您可以使用Delphi集成更改自定义样式,然后在应用程序中使用该样式,从而更改Windows标题栏的外观
如果不希望对整个应用程序强制使用样式,可以将窗体的属性设置为仅包含seBorder,这意味着只有应用程序的边框aka标题将使用自定义样式呈现
如果您使用的是Delphi XE2,那么您将无法使用该属性,但这只是一个小障碍,这只意味着您将不得不使用StyleHooks来实现相同的行为,并且有足够的文档说明如何做到这一点
遗憾的是,如果您的Delphi版本比XE2旧,那么您将无法使用VCL样式
另一种令人不快的方法是创建一个无边界表单,方法是将属性更改为bsNone,然后将图像作为标题栏来实现,处理对图像执行的所有操作,并向应用程序发送适当的消息。您可以使用
您可以使用Delphi集成更改自定义样式,然后在应用程序中使用该样式,从而更改Windows标题栏的外观
如果不希望对整个应用程序强制使用样式,可以将窗体的属性设置为仅包含seBorder,这意味着只有应用程序的边框aka标题将使用自定义样式呈现
如果您使用的是Delphi XE2,那么您将无法使用该属性,但这只是一个小障碍,这只意味着您将不得不使用StyleHooks来实现相同的行为,并且有足够的文档说明如何做到这一点
遗憾的是,如果您的Delphi版本比XE2旧,那么您将无法使用VCL样式
另一种令人不快的方法是创建一个无边界表单,方法是将属性更改为bsNone,然后将图像作为标题栏来实现,处理对图像执行的所有操作,并向应用程序发送适当的消息。您可以:
WM\u NCPAINT
消息并手动自定义绘制标题栏SetWindowRgn()
或重写CreateParams()
方法删除WS_caption
样式,然后使用表单的OnPaint
事件,甚至是TImage
将图形显示在表单剩余客户端区域的顶部,从而完全删除标题栏CreateParams()
和TImage
您可以:
WM\u NCPAINT
消息并手动自定义绘制标题栏SetWindowRgn()
或重写CreateParams()
方法删除WS_caption
样式,然后使用表单的OnPaint
事件,甚至是TImage
将图形显示在表单剩余客户端区域的顶部,从而完全删除标题栏最简单的解决方案是使用
CreateParams()
和TImage
谢谢。我编辑了我的问题,以包括我正在使用的Delphi版本。是XE。所以我不能使用StyleElements,对吗?@Delphi.Boy,StyleElements属性是在XE3中添加的,不用担心,这只是一个小小的挫折,多亏了RRUZ在样式方面做了出色的工作,你可以用他的例子来说明如何通过注册StyleHook来关闭Vcl样式,例如,你应该看看下面的问题:@Peter,在Delphi XE2中添加了VCL样式。有了XE,你就不走运了。@Peter,我读了你建议的帖子,但真的不明白发生了什么。他们在谈论“禁用”VCL样式,而我甚至没有!如果我的需求可以通过StyleHook完成,那么给我展示一个在XE下工作的好例子。谢谢。@Delphi.Boy,在TLama提醒我你不能使用VCL样式后,我更新了我的答案。如果你在Delphi XE上,简单地说,你要么使用我列出的最后一个选项,要么使用Remy列出的两个选项中的一个,你可能还想查看TLama在你的问题下发布的链接,tho这只适用于Windows Vista+谢谢。我编辑了我的问题,以包括我正在使用的Delphi版本。是XE。所以我不能使用StyleElements,对吗?@Delphi.Boy,StyleElements属性是在XE3中添加的,不用担心,这只是一个小小的挫折,多亏了RRUZ在样式方面做了出色的工作,你可以用他的例子来说明如何通过注册StyleHook来关闭Vcl样式,例如,你应该看看下面的问题:@Peter,在Delphi XE2中添加了VCL样式。有了XE,你就不走运了。@Peter,我读了你建议的帖子,但真的不明白发生了什么。他们在谈论“禁用”VCL样式,而我甚至没有!如果我的需求可以通过StyleHook完成,那么给我展示一个在XE下工作的好例子。谢谢。@Delphi.Boy,在TLama提醒我不能使用VCL样式后,我更新了我的答案。如果你使用Delphi XE,简单地说,你要么使用我列出的最后一个选项,要么使用Remy列出的两个选项中的一个,你可能还想检查TLama在你的问题下发布的链接,尽管这是规范