0

我需要做一些看起来很容易的事情,但我正在寻找没有成功的日子。我有一个固定大小的窗口(比如 500*250),需要用固定大小的 JPEG(或更好的 PNG)图像(比如 500*25)替换整个标题栏。有很多关于 Glass、Aero、DWM、等等等等的示例。但我只需要画一个固定的图像!

我已经尝试过了,但它不起作用:

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 上运行。请帮忙。

PS:我有德尔福XE。

4

2 回答 2

4

您可以通过使用VCL Styles来做到这一点。

您可以通过使用 Delphi 集成的位图样式设计器更改自定义样式,然后在您的应用程序中使用该样式来更改 Windows 标题栏的外观。

如果您不想将样式强制应用到整个应用程序,您可以将表单的StyleElements属性设置为仅包含 seBorder,这意味着只有您的应用程序的边框(即标题)将使用您的自定义样式呈现。

如果您在 Delphi XE2 中工作,那么您将无法使用StyleElements属性,但这只是一个小障碍,这仅意味着您将不得不求助于使用 StyleHooks 来实现相同的行为并且有足够的文档在这里如何做到这一点。

遗憾的是,如果您的 Delphi 版本比 XE2 旧,那么您将无法使用 VCL Styles。

另一种但相当不愉快的方法是通过将BorderStyle属性更改为 bsNone 来创建无边框表单,然后以充当标题栏的方式实现您的图像,处理对图像进行的所有操作并向应用程序发送适当的消息.

于 2013-06-09T13:40:54.160 回答
2

您可以:

  1. 拦截WM_NCPAINT消息并手动自定义绘制标题栏。

  2. 完全移除标题栏,通过使用SetWindowRgn()或覆盖CreateParams()移除WS_CAPTION样式的方法,然后使用表单的OnPaint事件,甚至是TImage, 将图形显示在表单剩余客户区的顶部。

最简单的解决方案是使用CreateParams()and TImage

于 2013-06-09T20:02:58.203 回答