FreeBasic
Главная
Вход
Регистрация
Пятница, 19.04.2024, 08:18Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » WinAPI » WinApi в freebasic » Minimise & Maximise button (проверка нажатия кнопок свернуть и развернуть)
Minimise & Maximise button
ntvgjhfnjДата: Понедельник, 22.05.2023, 20:52 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
собственно как? как отследить окно FULLSCREEN развернуто или NORMAL , получить логическое значение?
Вот нажали мы на кнопке "развернуть" , как получить событие?

Добавлено (22.05.2023, 21:23)
---------------------------------------------
может кому пригодится ...
Сделать кнопку "развернуть" не активной :

Код

#Include Once "windows.bi"
#include "fbgfx.bi"
Using FB

ScreenRes 800, 600, 32, 2

Dim As Integer wind
Dim As HWND w
ScreenControl(GET_WINDOW_HANDLE, wind)
    w = Cast( HWND, wind)
SetWindowLong( w,GWL_STYLE, GetWindowLong( w,GWL_STYLE) xor WS_MAXIMIZEBOX)

If MultiKey(SC_S ) Then ShowWindow( w, SW_MAXIMIZE)    ' при нажатии на кнопку окно развернут в полный экран\ свернуть ей же


polopok
 
haavДата: Вторник, 23.05.2023, 06:08 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата
как отследить окно FULLSCREEN развернуто или NORMAL , получить логическое значение?


Код
#INCLUDE "windows.bi"
Dim msg As MSG
Dim As WNDCLASSEX wc
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
    Select Case msg
  Case WM_DESTROY
   PostQuitMessage(0)
  case WM_SIZE
   if wparam = SIZE_MAXIMIZED then ' окно на весь экран
    ' .....
   elseif wparam = SIZE_RESTORED ' размер восстановлен
    ' .....
   endif
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function
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


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
zamabuvaraeuДата: Вторник, 23.05.2023, 07:04 | Сообщение # 3
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Откуда вообще возник вопрос «отследить»? Вы же режим устанавливаете, следовательно, вы знаете когда у вас «полноэкранное» окно и когда обычное перекрывающееся.
 
ntvgjhfnjДата: Вторник, 23.05.2023, 07:39 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Возможно не корректно задал вопрос, в принципе необходимо отследить клик мыши на системную кнопку окна "развернуть", по типу
"закрытия" окна ( InKey = Chr(255)+"k" ) , вот что нужно.
А так же и клик по кнопке "свернуть".
За ответы ,благодарю!

Добавлено (23.05.2023, 07:44)
---------------------------------------------
на purebasic есть такая функция

Код
State = GetWindowState(#Window)

Код

Return value

    It can be one of the following values:

      #PB_Window_Normal  : The window is neither maximized nor minimized.
      #PB_Window_Maximize: The window is maximized.
      #PB_Window_Minimize: The window is minimized.



polopok
 
haavДата: Вторник, 23.05.2023, 08:12 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Цитата ntvgjhfnj ()
State = GetWindowState(#Window)


Аналоги:

MAX = http://www.vsokovikov.narod.ru/New_MSDN_API/Window/fn_iszoomed.htm
MIN = http://www.vsokovikov.narod.ru/New_MSDN_API/Window/fn_isiconic.htm


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Вторник, 23.05.2023, 11:24 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Собственно частично решил задачу примером по этой ссылке.

Дело в том, что я в методе Update() :
Код

Sub windowElement.update()
    GetWindowRect( handle, @Wrct)

    Wrct.right -=Wrct.left
    Wrct.bottom -= Wrct.top
    GetClientRect( handle,@Crct)

    this.Draw()
End Sub

считываю положение, размер окна ( окон ) и при нажатии кнопки "развернуть" положение сбрасывается в [ -3, -3] ,а при возврате
Код

If MultiKey(SC_S ) Then ShowWindow( root.handle, SW_MAXIMIZE)    

положение окна остаётся [ -3, -3], а не каким было до разворачивания в полноэкранное.

Добавлено (25.05.2023, 20:06)
---------------------------------------------
Ээ ... Привет, сново вопрос к теме.
Переопределил WinProc

Код

Function handle() As HWND
    Dim As Integer wind
    ScreenControl( FB.GET_WINDOW_HANDLE, wind )
    Return Cast( HWND, wind)
End Function
...
...
SetWindowLong( handle,GWL_WNDPROC, Cast(Long, @wndproc))
...
...
Function wndproc(hwnd As HWND, msg As Uinteger, wparam As WPARAM, lparam As LPARAM) As Integer
    Function = 0
    
    Select Case msg
  Case WM_CREATE
   GetWindowRect( hwnd, @_window_size_rect_)
  Case WM_GETMINMAXINFO
   _window_minmax_=Cast(MINMAXINFO Ptr,lparam)
   _window_minmax_->ptMinTrackSize.x = 220're.right 'ìèíèìàëüíûé ðàçìåð ïî îñè X
   _window_minmax_->ptMinTrackSize.y = 1're.bottom 'ìèíèìàëüíûé ðàçìåð ïî îñè Y
   _window_minmax_->ptMaxTrackSize.x = GetSystemMetrics(SM_CXSCREEN)'ìàêñèìàëüíûé ðàçìåð ïî îñè X
   _window_minmax_->ptMaxTrackSize.y = GetSystemMetrics(SM_CYSCREEN)'ìàêñèìàëüíûé ðàçìåð ïî îñè Y
   Return 0
  'Case WM_LBUTTONDOWN
   'mb = 1
  Case WM_RBUTTONDOWN    
   'mb = 2
  Case WM_LBUTTONUP
            ' MessageBox NULL, "Hello world from FreeBasic", "FB Win", MB_OK
  Case Else
   Function = DefWindowProc(hwnd,msg,wparam,lparam)
    End Select
End Function


и ... о, чудо, перестало работать GetMouse( mx, my, mz, mb) , напрочь. Собственно как встривать WM_GETMINMAXINFO в уже существующий WinProc? Куда копать? Заранее признателен к неравнодушным\знающим.


polopok
 
haavДата: Пятница, 26.05.2023, 06:03 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Примеры , как реализуется сабклассинг:

первый
второй (самый последний пример)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
ntvgjhfnjДата: Пятница, 26.05.2023, 18:52 | Сообщение # 8
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Привет, всем!
Используя структуру


разшарил;
Код
Dim Shared evnt As EVENT


В общем переписал wndproc


С MOUSEWHEEL не понял как получать значения и клавиатуру пока не опрашиваю, выложил может кому пригодится.

P.S. Заменяю wndproc стандартного окна ScreenRes


polopok

Сообщение отредактировал ntvgjhfnj - Пятница, 26.05.2023, 18:53
 
zamabuvaraeuДата: Суббота, 27.05.2023, 19:40 | Сообщение # 9
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
   
Код
Function = DefWindowProc(hwnd,msg,wparam,lparam)


Никакого DefWindowProc внутри субклассенной оконной процедуры быть не должно. Если вы не обрабатываете субклассенное сообщение, то его следует отправлять в оригинальную процедуру, которая вернула функция SetWindowLong когда вы субклассили окно.
 
ntvgjhfnjДата: Суббота, 27.05.2023, 20:31 | Сообщение # 10
Лейтенант
Группа: Проверенные
Сообщений: 59
Репутация: 1
Статус: Offline
Цитата "zamabuvaraeu" ()
Никакого DefWindowProc внутри субклассенной оконной процедуры быть не должно. Если вы не обрабатываете субклассенное сообщение, то его следует отправлять в оригинальную процедуру, которая вернула функция SetWindowLong когда вы субклассили окно.

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

Последнее что я учудил:
Код

var Wlong = GetWindowLong( _root_.wnd,GWL_WNDPROC)
SetWindowLong( _root_.wnd,GWL_WNDPROC, Wlong  or Cast(Long, @wndproc) )

и ... прога немножечко вылетела, ругалась ... а я в печали.


polopok

Сообщение отредактировал ntvgjhfnj - Суббота, 27.05.2023, 20:32
 
zamabuvaraeuДата: Вторник, 30.05.2023, 15:20 | Сообщение # 11
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline

Код
' Сохранить старую оконную процедуру
Dim OldRightEnemyGroupBoxProc As WndProc = Cast(WndProc, GetWindowLongPtr(hWin, GWLP_WNDPROC))

' Установить новую оконную процедуру
SetWindowLongPtr(hWin, GWLP_WNDPROC, Cast(LONG_PTR, @NewWindowProc))

' Новая оконная процедура:
Function NewWindowProc(ByVal hWin As HWND, ByVal wMsg As UINT, ByVal wParam As WPARAM, ByVal lParam As LPARAM) As LRESULT
   
   Select Case wMsg
      
      ' Обрабатываем сообщения которые нам нунжы
      Case WM_ERASEBKGND
         ' ...
         Return 1
         
      Case Else
         ' Сообщения которые не обрабатываем, отправляем в оригинальную оконную процедуру
         Return CallWindowProc(OldRightEnemyGroupBoxProc, hWin, wMsg, wParam, lParam)
         
   End Select
   
End Function

Не используйте функции GetWindowLong и SetWindowLong — эти функции устарели. Используйте GetWindowLongPtr и SetWindowLongPtr.
 
Форум » WinAPI » WinApi в freebasic » Minimise & Maximise button (проверка нажатия кнопок свернуть и развернуть)
  • Страница 1 из 1
  • 1
Поиск: