Api 如何防止子窗体继承父窗体的Alphablend属性?
我创建了一个用作背景表单的表单(Form1)。我将其AlphaBlend属性设置为True,并将其AlphaBlendValue设置为230,使表单透明 然后,我创建了第二个完全独立的表单(Form2),其AlphaBlend属性为False(我甚至在创建表单时隐式地设置了它)。然后我将Form1设置为Form2的父窗口(通过Form2.parent=Form1) 这使子窗口具有父窗口AlphaBlend属性,这些属性不能单独更改。我根本无法修改Form2上的Alpha属性Api 如何防止子窗体继承父窗体的Alphablend属性?,api,delphi,vcl,Api,Delphi,Vcl,我创建了一个用作背景表单的表单(Form1)。我将其AlphaBlend属性设置为True,并将其AlphaBlendValue设置为230,使表单透明 然后,我创建了第二个完全独立的表单(Form2),其AlphaBlend属性为False(我甚至在创建表单时隐式地设置了它)。然后我将Form1设置为Form2的父窗口(通过Form2.parent=Form1) 这使子窗口具有父窗口AlphaBlend属性,这些属性不能单独更改。我根本无法修改Form2上的Alpha属性 我要求Frave2为
我要求Frave2为Frime1的孩子,但不能继承Alpha属性。
也许你可以考虑另一种方法:不要设置“嵌入”表单的父级,而是保持它的独立性。而是处理
Form1
的消息WM\u WINDOWPOSCHANGING
,并设置Form2
相对于Form1
的ClientOrigin
的位置:
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;
仔细观察,我们可以看到第二个形状在跟随第一个形状的运动时滞后于一个像素左右,不应该太令人不安。好的,我已经更改了源代码,通过在主应用程序上添加两个窗体来修复WS_EX_分层窗口窗体上的问题,其中一个是alphablend true,背景值为200,第二个作为前窗口是正常的,而主应用程序是完全透明的,具有透明颜色和透明属性这是我的第一个测试版解决方案的链接
最后,我对背景表单有一个小问题,它不能成为任何控件的容器,甚至命中测试也不能在它上面工作。。。。我希望接受我的想法,即使还没有完成 对于windows 7及以下版本,您将无法执行此操作。受OSI限制,我认为这个问题与操作系统无关,因为我已经在VB中测试了相同的方法,它的工作没有问题,也许在c#中也会工作,但在Delphi中,它可能需要一个新类或一个特殊组件……是什么让你如此确信Delphi实现与你的VB基于相同的winapi功能代码?
我认为这个问题与操作系统无关。Delphi控件是winapi控件的简单包装器。很抱歉我的愚蠢。。。但是我的评论谈论的是VB代码在delphi中的工作方式,而不是API本身(如果VB和delphi中的表单本身完全不同,那么即使API不同也没有意义……)最后,谨致以最诚挚的问候,并感谢您的建议。但是如果我点击主窗体,子窗体会隐藏在窗体1后面吗?也许setforground Api可以用一些钩子代码来解决这个问题……您是在尝试,还是只是在猜测?在我的测试中,Form2
保持在前面。也许你还应该说你使用的是哪个Delphi版本,你针对的是哪个操作系统。老实说,我还没有尝试过这个(我现在不在家),但我记得我是用这种技术为我的表单编程了一个影子表单,并使用上面的api。。。我想我错了,虽然我还没有尝试过…当我在WindopSchaging程序中添加了这个内部WindopSchaging过程:Form2之后,当我调整主窗体的大小时,它隐藏在主窗体后面。宽度:=(表格1.宽度)-40,表格2。身高:=(form1.Height)-20,@Bravesaw你一定在做与我不同的事情。调整form1的大小不会将form2隐藏在form1后面。我重复前面评论中的问题:哪个Delphi版本,哪个OS?