Реализовать липкие наложения в .NET - PullRequest
2 голосов
/ 12 января 2009

Я ищу хороший способ визуализации оверлеев поверх собственной формы Windows , не принадлежащей мне, предпочтительно с использованием библиотеки, доступной для .NET (WinForms, GTK #, ...). Точно, я хотел бы отобразить несколько ярлыков или текстовых полей в определенном месте окна.

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

Наложение прозрачного окна с видимыми дочерними метками: другой метод, который я попробовал, - создание Windows.Forms.Form с размером других окон, используя TransparencyKey, чтобы сделать видимыми только дочерние элементы. Кажется, это довольно сложно исправить, так как я не хочу, чтобы окно было самым верхним, а ровно на один Z-уровень выше внешнего окна. Плюсом было бы то, что я мог бы добавить к нему больше поведения, так как я мог бы фактически обрабатывать события щелчка и т. Д.

Как бы вы это реализовали / справились с проблемами в двух методах, описанных выше?

Ответы [ 3 ]

2 голосов
/ 12 января 2009

Определенно используйте подход с прозрачным окном, так как это должно быть проще в реализации. Создать прозрачную форму очень просто. Вы уже знаете, как использовать TransparenyKey, чтобы фон не рисовался. Также удалите рамку из окна и удалите кнопки min / max / close, чтобы у вас не было никакого отображения хрома.

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

0 голосов
/ 19 марта 2009

Задать владельца формы можно с помощью

Form.Show(IWin32Window w)

где w предоставляет дескриптор родительскому окну.

0 голосов
/ 12 января 2009

Спасибо за ваш ответ, но я все еще немного растерялся. Как именно вы установите владельца окна на что-либо, не принадлежащее вашему собственному приложению? Я полагаю, это даже невозможно, если другое приложение неуправляемо, не так ли?

Edit:

Теперь я стал на шаг ближе. Пример кода в Boo.

[DllImport("user32.dll", SetLastError: true, CharSet: CharSet.Auto)]
public def SetParent(child as IntPtr, parent as IntPtr):
    pass

def createAttachedForm(parentHandle as IntPtr):
  f = Form()
  f.Text = "My overlay"
  f.Show()
  SetParent(f.Handle, parentHandle)
  Application.Run(f)

Теперь кажется, что только прозрачность не работает. Вместо этого форма полностью невидима при заданном значении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...