Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 绘制图像而不是窗口标题_Delphi_Delphi Xe_Caption - Fatal编程技术网

Delphi 绘制图像而不是窗口标题

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

我需要做一些看起来很简单的事情,但我已经找了好几天没有成功了。 我有一个固定大小的窗口(比如500*250),需要用一个固定大小的JPEG(或者更好的PNG)图像(比如500*25)替换整个标题栏。 有很多关于玻璃、航空、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上运行。请帮忙

附言:我有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在你的问题下发布的链接,尽管这是规范