13. Jak włączyć/wyłączyć pełne przeciąganie okna?

System Windows oferuje nam dwa sposoby przeciągania okna - pełne lub tylko markowane prostokątną ramką. Jeśli mamy dobrą kartę graficzną, zwykle ustawimy sobie tryb pełny przeciągania okien, ale istnieje przypadek, w którym jest to niekorzystne. Mam na myśli zmianę rozmiarów formularza z jednoczesnym, programowym dostosowaniem wielkości elementów formularza. Zwłaszcza jeśli na formularzu istnieją jakieś podformularze w widoku Arkusz danych, to wtedy zdarzenie Form_Resize powoduje nieprzyjemne miganie pól, a nawet chwilowy brak widoczności niektórych elementów.

Dobrym rozwiązaniem jest w takich przypadkach zamienić przeciąganie pełne na markowane ramką. Zdarzenie Form_Resize wykona się wtedy tylko raz, gdy puścimy myszkę i nie zauważymy żadnych nieestetycznych obrazów na ekranie.

No, ale jak przełączać między różnymi metodami przeciągania okna za pomocą kodu VBA?

Proste rozwiązanie znalazłem w MSDN Library, oto one:

'Na początek deklaracje dla funkcji API
Private Declare Function SystemParametersInfo Lib "user32" _
    Alias "SystemParametersInfoA" (ByVal uAction As Long, _
    ByVal uParam As Long, ByRef lpvParam As Any, _
    ByVal fuWinIni As Long) As Long

Private Const SPI_GETDRAGFULLWINDOWS = 38
Private Const SPI_SETDRAGFULLWINDOWS = 37
Private Const SPIF_SENDWININICHANGE = 2

'I już możemy ustawić tryb przeciągania okna na markowany ramką:
Call SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 0&, _
        ByVal vbNullString, SPIF_SENDWININICHANGE)

'A potem przywrócić tryb pełny:
Call SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 1&, _
        ByVal vbNullString, SPIF_SENDWININICHANGE)

'Dobrze jest też sprawdzić, jaki tryb mamy ustawiony teraz:
Dim result As Long
    Call SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0&, result, 0&)
    If result = 0 Then
        MsgBox "Tryb markowany ramką."
    Else
        MsgBox "Tryb pełny."
    End If

Zmiany sposobu przeciągania okna dokonane tą metodą w Accessie, odnoszą się do wszystkich okien w systemie Windows.

K. P.