winforms C# Form.TransparencyKey在不同颜色下工作不同,为什么?

jckbn6z7  于 2023-06-24  发布在  C#
关注(0)|答案(1)|浏览(162)

昨天我发现了一件很奇怪的事情(我想)。看起来Form.TransparencyKey会根据BackgroundColorTransparencyKey使用的颜色给出不同的结果。如果要复制此文件,请执行以下操作:
1.新建Windows窗体应用程序
1.将Panel拖放到表单上
1.将其设置为“Green”(绿色)作为BackgroundColor,并将Form 1的TransparencyKey也设置为Green
1.运行程序,并把窗体与“洞”的东西,你会看到,你可以点击通过该洞(如所描述的MSDN)
1.现在改变这两种颜色为“红色”和运行应用程序-你会看到“洞”,但你不再可以点击通过它
你知道为什么会这样吗规则是什么?我正在使用.NET 4和VS2010,在两台配置相同的计算机上进行了测试。
没有太多的代码为这个…但是我可以在设计器中发布设置:

private void InitializeComponent()
{
     this.panel1 = new System.Windows.Forms.Panel();
     this.SuspendLayout();
     // 
     // panel1
     // 
     this.panel1.BackColor = System.Drawing.Color.Red;
     this.panel1.Location = new System.Drawing.Point(23, 26);
     this.panel1.Name = "panel1";
     this.panel1.Size = new System.Drawing.Size(229, 176);
     this.panel1.TabIndex = 0;
     // 
     // Form1
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
     this.ClientSize = new System.Drawing.Size(284, 262);
     this.Controls.Add(this.panel1);
     this.Name = "Form1";
     this.Text = "Form1";
     this.TransparencyKey = System.Drawing.Color.Red;
     this.ResumeLayout(false); 
}
//that outside:
private System.Windows.Forms.Panel panel1;
yruzcnhs

yruzcnhs1#

我以前听说过这个问题,但从未意识到它与TransparencyKey选择有关。很好的发现。几乎可以肯定是由Aero引起的。禁用此功能后,将通过使用视频适配器中的硬件覆盖来实现效果。启用它后,桌面窗口合成功能将实现它。在DWM赶上并将该区域替换为背景中窗口的像素之前,通常可以通过透明颜色的非常短暂的 Flink 来判断。关闭窗口的DWM可能会解决这个问题,但也会丢失玻璃效果。
我可以看到小韵或原因的颜色值,看起来很随机给我。很难把它叫做bug。我以前从来没有遇到过这种情况,我总是使用相同的透明度键。紫红色,一种极好的紫红色。推荐。
更新:用户Simpleton深入研究了deeper的这种行为,并得出了一些有价值的结论。
它似乎与Win8的一个新功能有关,透明度过去仅限于顶级窗口(.NET中的窗体),但从Win8开始,子窗口也可以拥有它。启用该功能需要一个清单条目,当存在时,它修复了古怪的行为。您所要做的就是声明您的应用程序与Win8兼容。项目>添加新项>选择“应用程序清单文件”并确保此条目存在:

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
    </application>
  </compatibility>

相关问题