Окно произвольной формы (на Windows 7)

1 Авг
2012

В этой статье я хочу предложить способ создания окон произвольной формы. Не прибегая к WPF или многослойным окнам. Вот как это выглядит:
Окно произвольной формы (на Windows 7)

Началось дело с музыкального проигрывателя — Smart. Да, это мой проект. Но почему я не должен о нем рассказать? Ведь долю пользы он принесет. Код открыт — все мое принадлежит вам.
Чесно говоря, все получилось вследствие эксперимента. Вот что я делал:
  • Создал форму и установил свойство FormBorderStyle в None;
  • Положил на нее необходимые элементы управления (из пространства имен Smart.UI.UItem, хотя можно любые);
  • С помощью функции DwmExtendFrameIntoClientArea убрал фон формы. Всё.

Преимущества:
  • Простой способ с применением единственной API;
  • Не нужно мучаться с LayeredWindow;
  • Все контролы превосходно отображаются и работают.
  • Этот способ дает возможность самим отрисовать границу окна, рисовать полупрозрачными кистями на форме и т.д.

Недостатки:
Думаю, единственный недостаток — это то, что этой API нет на XP. Ну а также в некоторой степени зависит от темы оформления.
Вот декларация функции:

    ''' <summary>
    ''' Расширяет границу рамки окна до нужной толщины.
    ''' </summary>
    ''' <param name="hwnd">Дескриптор окна.</param>
    ''' <param name="pMarInset">Ссылка на структуру MARGINS.</param>
    <DllImport("DwmApi.dll")> _
    Private Function DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef pMarInset As MARGINS) As Boolean
    End Function


    <StructLayout(LayoutKind.Sequential)>
    Public Structure MARGINS
        Public cxLeftWidth As Integer          ' толщина левой границы
        Public cxRightWidth As Integer        ' толщина правой границы
        Public cyTopHeight As Integer         ' толщина верхней границы
        Public cyBottomHeight As Integer   ' толщина нижней границы
    End Structure


Использовать этот способ или нет — решать вам. Я просто рассказал, что такой есть.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх