2014-12-10 1 views
1

Это будет ошибкой, если вы измените размер формы на ранее прозрачную область, события мыши больше не будут обнаружены на ней.События мыши на форме больше не обнаруживаются, если она изменена до ранее прозрачной области

Как воспроизвести:

  • Создать новую форму проекта для Windows
  • Набор Form1 TransparencyKey для Magenta
  • Добавить панель в Form1 и сконфигурировать его как: заполнить
    • Dock
    • BackColor to Magenta

Запустите, теперь попробуйте изменить размер формы, если вы уменьшите ее (достаточно, чтобы новая рамка была размещена над текущей прозрачной областью), мышь больше не будет «обнаруживать» границу окна с этой стороны. Если вы минимизируете/восстанавливаете окно, оно будет работать снова. Как я могу это исправить? Я попробовал Refresh on Form Layout/Resize событие, но это не сработало.

ответ

2

Просто для подтверждения, да, это ошибка в текущей реализации Aero на Windows 8.1. Возможно, раньше. Некоторое время, похоже, это довольно структурная проблема. Это часть набора ошибок, связанных с многоуровневыми окнами с установленным ключом прозрачности, и тем, что мышь является прозрачной для такого окна, она также не работает должным образом с определенными цветовыми выделениями для ключа. В этом конкретном случае он ненадлежащим образом делает рамку прозрачной для кликов.

Трудно дать конкретный совет, для этого требуется позвонить в службу поддержки Microsoft, чтобы он продвигался вперед. Технически вы можете воспользоваться другой ошибкой, окно никогда не прозрачно для щелчков мыши, когда вы выбираете, скажем, красный в качестве ключа прозрачности:

public Form1() { 
     InitializeComponent(); 
     this.TransparencyKey = panel1.BackColor = Color.Red; 
    } 

решающей ошибку вы имеете дело с, но, конечно, отключает прозрачность мыши полностью. Обходной путь, который вам почти определенно не понравится:

protected override void OnResizeEnd(EventArgs e) { 
     base.OnResizeEnd(e); 
     this.RecreateHandle(); 
    } 

Слишком заметно. Программисты начинают использовать эти ошибки, иногда они хотят, чтобы такая непрозрачность была преднамеренно. Заставляет вас задаться вопросом, как Microsoft собирается получить это исправление без нарушения программы. Не красиво.

+0

Hahaha, соглашайтесь! Спасибо. RecreateHandle() исправляет проблему, и нет необходимости переопределять ее, я добавил ее в событие OnLayout, но она мигает. Интересно, есть ли лучшее решение. – Pedro77

 Смежные вопросы

  • Нет связанных вопросов^_^