Как сделать ElementHost прозрачным, чтобы форма за ним была видимой и интерактивной? - PullRequest
2 голосов
/ 19 февраля 2009

Я попытался получить форму класса ElementHost и перевесить метод CreateParams:

    protected override CreateParams CreateParams
    {
        get
        {
            const int WS_EX_TRANSPARENT = 0x20;
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }

Это делает его прозрачным, но форма не кликабельна.

1 Ответ

2 голосов
/ 19 февраля 2009

Попробуйте добавить это в свой производный класс:

private const int WM_NCHITTEST             = 0x0084;
private const int HTTRANSPARENT            = (-1);

protected override void WndProc(ref Message m)
{
   if (m.Msg == WM_NCHITTEST)
   {
      m.Result = (IntPtr) HTTRANSPARENT;
   }
   else
   {
      base.WndProc(ref m);
   }
}

Это должно сделать весь ElementHost «прозрачным» для мыши, если вы хотите, чтобы содержимое WPF реагировало на мышь, вам придется использовать VisualTreeHelper.HitTest, чтобы решить, что возвращать из обработчика WM_NCHITTEST.

Я не тестировал его с ElementHost, но он работает с обычными элементами управления WinForms.

...