Подтвердить что ты не робот

С# Form.TransparencyKey работает по-разному для разных цветов, почему?

Вчера я нашел что-то очень странное (я думаю). Похоже, что Form.TransparencyKey дает разные результаты, основанные на том, какой цвет используется как BackgroundColor и TransparencyKey. Если вы хотите воспроизвести это, выполните следующие действия:
  • Создать новое приложение Windows Forms
  • Отбросьте a Panel в форме
  • Дайте "Зеленый" как BackgroundColor и установите Form1 TransparencyKey также в зеленый
  • Запустите программу и поместите форму с "дыркой" над чем-то, и вы увидите, что можете щелкнуть по этой дыре (как описано в MSDN).
  • Теперь измените оба цвета на "Красный" и запустите приложение - вы увидите "отверстие", но вы больше не сможете щелкнуть, хотя он

Вы знаете, почему это происходит? Какое правило? Я использую .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;
4b9b3361

Ответ 1

Я слышал об этой проблеме раньше, но никогда не понимал, что это связано с выбором TransparencyKey. Хорошая находка. Это почти наверняка вызвано Aero. С его отключением эффект реализуется с помощью аппаратного наложения в видеоадаптере. С его помощью компонент компоновки окон рабочего стола реализует его. Обычно вы можете рассказать с помощью очень короткой вспышки цвета прозрачности, прежде чем DWM поймает и заменит область пикселями из окон в фоновом режиме. Выключение DWM для вашего окна может решить проблему, но вы также потеряете эффекты стекла.

Я вижу маленькую рифму или причину цвета, выглядит довольно случайным для меня. Трудно назвать это чем-то другим, кроме ошибки. Я никогда не сталкивался с этим до себя, я всегда использую один и тот же ключ прозрачности. Color.Fuchsia, отличный фуксированный цвет. Рекомендуется.

Ответ 2

У меня такая же проблема. Он будет работать, если ваш TransparencyKey белый.