Создание "фальшивой" строки заголовка у формы

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

Понятно, что у пользователя возникает непроизвольное желание таскать форму по экрану за этот псевдо-заголовок, как и все стандартные формы Windows. Вот для возможности этого и предусмотрен следующий код:

' Объявляем пару функций API и пару констант
Public Declare Function SendMessage Lib "user32" _
        Alias "SendMessageA" (ByVal hwnd As Long, _
                              ByVal wMsg As Long, _
                              ByVal wParam As Long, _
                              lParam As Any) As Long

Public Declare Sub ReleaseCapture Lib "user32" ()

Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2

' а это уже процедура перемещения указателя над элементом lblInfoTips

Private Sub lblInfoTips_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim lngReturnValue As Long

    If Button = 1 Then
        Call ReleaseCapture
        lngReturnValue = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, _
        HTCAPTION, 0&)
    End If

End Sub

Объявления функций API и констант лучше вынести в отдельный модуль - форм-то много может быть, нечего дублировать те же самые объявления в каждом модуле формы. Если все же решите оставить объявления в модуле формы, то все замените Public на Private.

По верхнему краю формы по всей ширине растянут элемент Label более темного цвета, чем цвет формы, симулирующий строку заголовка формы. Ему дано имя lblInfoTips, и в его событие [Перемещение указателя] вбит код.

Теперь пользователь может привычно ухватиться за панельку и перетащить форму, куда ему надо.

Кстати, если вызывать это код для события Form_MouseMove, то можно таскать форму за любую поверхность (конечно, если на форме, где Вы хотите схватиться, не нарисован какой-нибудь элемент управления). Но я предпочитаю давать пользователю возможность привычно перетаскивать форму только за псевдо-заголовок, потому, что это стандарт (обычные формы Windows тоже ведь таскаются не за любое место, а именно за панель заголовка).


Страница сайта http://185.71.96.61
Оригинал находится по адресу http://185.71.96.61/home.asp?artId=7332