Прозрачный фон во время захвата событий мыши? - PullRequest
3 голосов
/ 19 мая 2009

Здесь, похоже, есть похожий вопрос, но с «противоположной» проблемой (он не хотел, чтобы события мыши фиксировались).

У меня есть форма с панелью. Окно не имеет границ и имеет точный размер панели (для всех намерений и целей, как будто панель «свободно перемещается»). Я могу установить BackColor панели в SystemColors.Control, а затем установить прозрачность окна окна на то же самое. Это работает в том смысле, что достигается желаемый эффект (прозрачность), но панель больше не может захватывать события мыши (что жизненно важно для функциональности)!

Есть ли другой способ обойти это или способ повторно включить захват мыши?

Я попытался переопределить OnPaintBackground и выполнить noop, но это не позволило добиться реальной прозрачности, поскольку он не обновляет фон после каждого тика (поэтому все, что находится за панелью при первоначальном отрисовке, остается там независимо от того, переместить панель или иным образом обновить ее). Это, однако, позволило панели захватывать события мыши.

Это не так уж и сложно на данном этапе проекта, но я наткнулся на проблему во время быстрого прототипа, и это начинает меня раздражать. Если у кого-то есть указатели, они будут очень благодарны.

Ответы [ 2 ]

2 голосов
/ 19 мая 2009

Если бы вы использовали VC ++, я бы сказал, что вам нужен насос сообщений для обработки сообщений о событиях мыши WM_.

Быстрый поиск показывает эту ветку, которая может быть вам полезна:

Захват ВСЕХ событий мыши

Я ожидаю, что вы уже пробовали использовать следующее:

/// <summary>
/// A transparent control.
/// </summary>
public class TransparentPanel : Panel
{
    public TransparentPanel()
    {
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return createParams;
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        // Do not paint background.
    }
}
1 голос
/ 19 мая 2009

У меня нет на самом деле ответа для вас, но у меня есть другой (возможно, немного "хакерский") способ для вас выполнить то, что вы пытаетесь сделать.

Установите для свойства «Непрозрачность форм» значение 1% (не связывайтесь с ключом прозрачности), и теперь оно будет захватывать события. Форма не будет видна (по крайней мере, на моем компьютере в 1% я ее вообще не видел), и вы все равно сможете захватывать все щелчки мышью.

...