我需要做一些看似简单的事情,但我正在寻找没有成功的日子。 我有一个固定大小的窗口(比如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。
答案 0 :(得分:4)
您可以使用VCL Styles。
执行此操作您可以使用Delphi集成Bitmap style designer更改自定义样式,然后在应用程序中使用该样式,从而更改Windows标题栏的外观。
如果您不想对整个应用程序强制执行该样式,可以将表单的StyleElements属性设置为仅包含seBorder,这意味着只使用应用程序的边框aka标题进行渲染你的自定义风格。
如果您在Delphi XE2中工作,那么您将无法使用StyleElements 属性,但这只是一个小障碍,它只是意味着您将不得不求助于使用StyleHook来实现相同的行为,并且有足够的文档说明如何执行here。
可悲的是,如果您的Delphi版本比XE2旧,那么您将无法使用VCL样式。
另一种相当不愉快的方法是创建一个无边框表单,方法是将BorderStyle属性更改为bsNone,然后以一种可以充当标题栏的方式实现图像,处理对图像所做的所有操作并向应用程序发送适当的消息。
答案 1 :(得分:2)
你可以:
拦截WM_NCPAINT
消息并手动自定义标题栏。
完全删除标题栏,使用SetWindowRgn()
或覆盖CreateParams()
方法删除WS_CAPTION
样式,然后使用表单的OnPaint
事件,甚至是TImage
,以在表单剩余客户区顶部显示图形。
最简单的解决方案是使用CreateParams()
和TImage
。