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
Вот собственно и все, всего доброго!
содержание | назад | вперед