绘制图像而不是窗口标题

时间:2013-06-09 13:37:42

标签: delphi delphi-xe caption

我需要做一些看似简单的事情,但我正在寻找没有成功的日子。 我有一个固定大小的窗口(比如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。请帮忙。

P.S:我有Delphi XE。

2 个答案:

答案 0 :(得分:4)

您可以使用VCL Styles

执行此操作

您可以使用Delphi集成Bitmap style designer更改自定义样式,然后在应用程序中使用该样式,从而更改Windows标题栏的外观。

如果您不想对整个应用程序强制执行该样式,可以将表单的StyleElements属性设置为仅包含seBorder,这意味着只使用应用程序的边框aka标题进行渲染你的自定义风格。

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

可悲的是,如果您的Delphi版本比XE2旧,那么您将无法使用VCL样式。

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

答案 1 :(得分:2)

你可以:

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

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

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