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 APIPrivate 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.