【问题标题】:How to prevent a child form to inherit the Alphablend Property of the Parent Form?如何防止子窗体继承父窗体的 Alphablend 属性?
【发布时间】:2018-05-14 05:54:14
【问题描述】:

我创建了一个用作背景表单的表单 (Form1)。我将其 AlphaBlend 属性设置为 True,并将其 AlphaBlendValue 设置为 230,使表单透明。

然后我创建第二个完全独立的表单 (Form2),其 AlphaBlend 属性为 False(我什至在创建表单时隐式设置了此属性)。然后我将 Form1 设置为 Form2 的父窗口(通过 Form2.Parent = Form1)。

这使得子窗口具有父窗口的 AlphaBlend 属性,然后不能单独更改。我根本无法修改 Form2 上的 Alpha 属性。

我要求 Form2 是 Form1 的子级,但不能继承 Alpha 属性。

【问题讨论】:

  • 对于 Windows 7 及以下版本,您将无法执行此操作。这受操作系统限制
  • 我认为这个问题与操作系统无关,因为我已经在 VB 中测试了相同的方法,它的工作没有问题,也许在 c# 中也可以工作,但对于 Delphi,它可能需要一个新类或一个特殊的类组件...
  • 是什么让您如此确定 Delphi 实现与您的 vb 代码基于相同的 winapi 功能?
  • I think that this issue has no relation with OS。 Delphi 控件是对 winapi 控件的简单包装。
  • 对不起我的愚蠢......但我的评论谈论的是 VB 代码在 delphi 中的工作方式,而不是关于 API 本身(即使 Api 不同,如果表单没有意义)本身在 VB 和 Delphi 中是完全不同的......)最后表示最诚挚的问候,任何建议都非常感谢。

标签: api delphi vcl


【解决方案1】:

也许您可以考虑另一种方法:不要设置“嵌入式”表单的父级,而是将其分开。而是处理Form1 的消息WM_WINDOWPOSCHANGING 并设置Form2 相对于ClientOriginForm1 的位置:

type
  TForm1 = class(TForm)
  private
    procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING;
  public
  end;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.WindowPosChanging(var Msg: TMessage);
begin
  if Assigned(Form2) then
  begin
    Form2.Left := ClientOrigin.X + 20;
    Form2.Top := ClientOrigin.Y + 10;
  end;
end;

仔细观察,可以看到第二个表格在跟随第一个表格的移动时滞后了一个像素左右,应该不会太打扰。

【讨论】:

  • 但是如果我点击主窗体,子窗体隐藏在 form1 后面?也许 setforground Api 可以用一些钩子代码来解决这个问题......
  • 您尝试过,还是只是猜测?在我的测试中,Form2 保持在前面。也许您还应该说明您使用的是哪个 Delphi 版本以及您的目标是哪个操作系统。
  • 说实话,我还没有尝试过这个(我现在不在家),但我记得我通过这种技术和使用上面的这个 api 为我的表单编写了一个影子表单。 ..我想我错了,虽然我还没有尝试...
  • 当我在windoposchanging过程中添加这个后调整主窗体的大小时,它隐藏在主窗体后面:Form2。宽度 := (form1.Width) - 40, form2.高度 := (form1.Height) - 20,
  • @Bravesaw 你做的一定和我做的不一样。调整 form1 的大小不会将 form2 隐藏在 form1 后面。 我重复之前评论中的问题:哪个 Delphi 版本,哪个操作系统?
【解决方案2】:

好的,我已经更改了我的源代码,通过在主应用程序上添加两个表单来解决 WS_EX_LAYERED 窗口表单上的问题,其中一个是 alphablend true,背景为 200,第二个是正常的前窗口,而主应用程序完全透明,属性为透明色,这是我的第一个 beta 解决方案的链接https://1drv.ms/u/s!Alu0WnpJr3ruhTB68XOMcpd3mB5u

最后我对背景表单有一点问题,它不能成为任何控件的容器,甚至命中测试也无法在它上面运行......我希望接受我的想法,即使还没有完成。 ...

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    相关资源
    最近更新 更多