API и FreeBasic. (замена стиля окна часть 3)

Это заключительная часть по стилям окон. В этой части я упомяну о возможности прятать окно, развертывать окно на весь экран и напротив минимизировать его. Для всех этих действий можно использовать функцию ShowWindow. Ее параметры:

  • Hwnd - хендл окна
  • Fshow - флаг состояния показа окна
    • SW_FORCEMINIMIZE  -  Свертывает окно, даже если поток, который владеет окном, зависает. Этот флажок должен быть использоваться только при свертывании окон другого потока.
    • SW_HIDE  -  Скрывает окно и активизирует другое окно.
    • SW_MAXIMIZE  -  Развертывает заданное окно.
    • SW_MINIMIZE  -  Свертывает заданное окно и активизирует следующее окно верхнего уровня в Z-последовательности.
    • SW_RESTORE  -  Активизирует и показывает на экране окно. Если окно свернуто или развернуто, система восстанавливает в его первоначальных размерах и позиции. Прикладная программа должна установить этот флажок при восстановлении свернутого окна.
    • SW_SHOW  -  Активизирует окно и показывает на экране в его текущих размерах и позиции.
    • SW_SHOWDEFAULT  -  Устанавливает состояние показа, основанное на флажке SW_, определенном в структуре STARTUPINFO, переданной в функцию CreateProcess программой, которая запустила прикладную программу.
    • SW_SHOWMAXIMIZED  -  Активизирует окно и отображает его как развернутое окно.
    • SW_SHOWMINIMIZED  -  Активизирует окно и отображает его как свернутое окно.
    • SW_SHOWMINNOACTIVE  -  Показывает на экране окно как свернутое окно. Это значение походит на флажок SW_SHOWMINIMIZED, исключая окна, которые не активны.
    • SW_SHOWNA  -  Показывает на экране окно в его текущем размере и позиции. Это значение походит на флажок SW_SHOW, исключая окна, которые не активны.
    • SW_SHOWNOACTIVATE  -  Показывает окно в его самом современном размере и позиции. Это значение походит на флажок SW_SHOWNORMAL, исключая окна, которые не активны.
    • SW_SHOWNORMAL  -  Активизирует и показывает окно. Если окно свернуто или развернуто, система восстанавливает его в первоначальном размере и позиции. Прикладная программа должна установить этот флажок при отображении окна впервые.

Далее в одном примере покажу реализацию развертывания, свертывания, скрытия и показа окна:

#INCLUDE "windows.bi"
Dim msg As MSG 'структурированная переменная MSG
Dim As WNDCLASSEX wc 'структурированная переменная WNDCLASSEX
Dim As String NameClass="MyClass" ' переменная имени класса
Dim As HINSTANCE Hinst=GetModuleHandle(0) ' хендл модуля
' функция класса
Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static a As Integer=3
    Select Case msg
        Case WM_DESTROY
            PostQuitMessage(0)
        Case WM_CREATE
            SetTimer(hwnd,0,1000,0)
        Case WM_TIMER
            Select Case a
                Case 0 To 3
                    ShowWindow(hwnd,a)
                    a+=1 : If a=4 Then a=0
            End Select
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function
' Заполнение структуры WNDCLASSEX
With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_QUESTION)
    .hCursor=LoadCursor(0,IDC_HELP)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME)
    .lpszClassName=StrPtr(NameClass)
    .hIconSm=.hIcon
End With
' Регистрация класса окна
If RegisterClassEx(@wc)=0 Then
    Print "Register error, press any key"
    Sleep
    End
Endif
'Создание окна
CreateWindowEx(0,NameClass,"Первое окно",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinst,0)

' Цикл сообщений
While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend


В примере создание обычного окна, но я добавил реализацию изменения стилей по таймеру. За таймер отвечает функция SetTimer, ее параметры:

  • hwnd - дескриптор окна для сообщений таймера 
  • idevent - идентификатор  таймера 
  • uElapse - интервал срабатывания таймера 
  • lpTimerFunc - адрес процедуры таймера

В примере при создании окна в сообщении WM_CREATE , я установил таймер и передал в его параметры: хендл нашего окна и в интервал записал 1 секунду. Остальные параметры установил в ноль. Ведь у нас всего один запущенный таймер, поэтому во втором параметре можно писать любое значение, все равно в событии WM_TIMER мы проверять идентификатор не станем. К слову,  проверяется идентификатор в параметре wparam. Что касается последнего параметра SetTimer, то он используется для того, чтобы с заданным интервалом запускалась любая, созданная нами процедура. В этом случае надо создать свою процедуру и в последний параметр передать ее адрес.

И так у нас есть таймер, который с интервалом в одну секунду вызывает событие WM_TIMER. А мы в свою очередь в обработку этого события записали изменение стиля окна и изменение флага.

В реале флаги SW_HIDE , SW_SHOWNORMAL , SW_SHOWMINIMIZED , SW_SHOWMAXIMIZED имеют значения соответственно(0,1,2,3) . Одно из этих значений и передается в параметр функции ShowWindow.

Кроме функции ShowWindow для скрытия или показа можно использовать другую функцию AnimateWindow , которая при этих действиях еще анимирует некоторые эффекты. ее параметры:

  • hwnd  -  Хендл окна, которое анимируется. Вызывающий поток должен владеть этим окном.
  • dwTime  -  Устанавливает, сколько необходимо времени, чтобы воспроизвести мультипликацию, в миллисекундах. Как правило, воспроизведение мультипликации занимает 200 миллисекунд.
  • dwFlags  -  Определяет тип мультипликации. Этот параметр может быть одно или несколько нижеследующих значений:
    • AW_SLIDE  -  Использует слайдовую анимацию. По умолчанию используется анимационный ролик (прокрутка мультипликации). Этот флажок игнорируется тогда, когда пользуется с флажком AW_CENTER. 
    • AW_ACTIVATE  -  Активизирует окно. Не используйте это значение совместно с AW_HIDE. 
    • AW_BLEND  -  Использует эффект постепенного изменения. Этот флажок может быть использован только в том случае, если параметр hwnd - окно верхнего уровня. 
    • AW_HIDE  -  Скрывает окно. По умолчанию, окно показывается на экран. 
    • AW_CENTER  -  Делает вид окна сжатым в точку, если используется флажок AW_HIDE или раскрытым из точки до полного размера, если флажок AW_HIDE не используется. Различные предписывающие флаги не имеют никакого действия. 
    • AW_HOR_POSITIVE  -  Анимирует окно слева направо. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND. 
    • AW_HOR_NEGATIVE  -  Анимирует окно справа налево. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND. 
    • AW_VER_POSITIVE  -  Анимирует окно сверху вниз. Этот флажок может быть использованы с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND. 
    • AW_VER_NEGATIVE  -  Анимирует окно снизу вверх. Этот флажок может быть использован с роликом или слайдом мультипликации. Он игнорируется, когда используется с флажком AW_CENTER или AW_BLEND.

Я не буду показывать на примере все эффекты, покажу лишь плавное исчезание окна  (остальные вы сможете попробовать по аналогии):

#INCLUDE "windows.bi"
Dim msg As MSG 'структурированная переменная MSG
Dim As WNDCLASSEX wc 'структурированная переменная WNDCLASSEX
Dim As String NameClass="MyClass" ' переменная имени класса
Dim As HINSTANCE Hinst=GetModuleHandle(0) ' хендл модуля
#DEFINE AW_ACTIVATE &h20000
#DEFINE AW_CENTER &h10
#DEFINE AW_HOR_POSITIVE &h1
#DEFINE AW_HOR_NEGATIVE &h2
#DEFINE AW_SLIDE &h40000
#DEFINE AW_VER_POSITIVE &h4
#DEFINE AW_VER_NEGATIVE &h8
#DEFINE AW_BLEND &h80000
#DEFINE AW_HIDE &h10000
' функция класса
Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Select Case msg
        Case WM_CREATE
            SetTimer(hwnd,0,1000,0)
        Case WM_TIMER
            AnimateWindow(hwnd,1000,AW_BLEND Or AW_HIDE)
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function
' Заполнение структуры WNDCLASSEX
With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_QUESTION)
    .hCursor=LoadCursor(0,IDC_HELP)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME)
    .lpszClassName=StrPtr(NameClass)
    .hIconSm=.hIcon
End With
' Регистрация класса окна
If RegisterClassEx(@wc)=0 Then
    Print "Register error, press any key"
    Sleep
    End
Endif
'Создание окна
CreateWindowEx(0,NameClass,"Первое окно",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinst,0)

' Цикл сообщений
While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend


Вот собственно и все, всего доброго!

содержание | назад | вперед