Обработка сообщений окна в главном цикле

Предыдущая тема Следующая тема Перейти вниз

Обработка сообщений окна в главном цикле

Сообщение  SergeyA в Сб Июл 07, 2012 12:08 pm

Как обработать нажатие на кнопку если нет функции WndProc и если я не собираюсь её использовать

Код:

#Define WIN_INCLUDEALL
#Include "windows.bi"

Dim Shared EVENT_CLOSE As Integer = 273

Function GetMsg() As MSG Export
   Dim As MSG msg
  GetMessage( @msg, 0, 0, 0 )
  TranslateMessage( @msg )
  DispatchMessage( @msg )
  Return MSG
End Function

Var hWnd = CreateWindowEx( 0, "#32770", "Test Gui", WS_SYSMENU Or WS_VISIBLE Or WS_MINIMIZEBOX, 100, 100, 500, 300, 0, 0, 0, 0 )
Var hBut = CreateWindowEx( 0, "Button", "Test", WS_VISIBLE Or WS_CHILD, 100, 100, 80, 20, hWnd, 3, 0, 0 )

While 1
   Var Msg = GetMsg()
   Select Case Msg.hwnd
      Case hWnd
         Select Case Msg.message
            Case EVENT_CLOSE
               End
         End Select
      Case hBut
         Select Case LoWord(Msg.wparam)
            Case 1
              MessageBox(0, "Button Press", "Info", 0)
         End Select
   End Select
Wend

SergeyA

Сообщения : 9
Дата регистрации : 2012-07-03

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Обработка сообщений окна в главном цикле

Сообщение  trew в Сб Июл 07, 2012 2:46 pm

SergeyA пишет:Как обработать нажатие на кнопку если нет функции WndProc и если я не собираюсь её использовать

Код:

#Define WIN_INCLUDEALL
#Include "windows.bi"

Dim Shared EVENT_CLOSE As Integer = 273

Function GetMsg() As MSG Export
   Dim As MSG msg
  GetMessage( @msg, 0, 0, 0 )
  TranslateMessage( @msg )
  DispatchMessage( @msg )
  Return MSG
End Function

Var hWnd = CreateWindowEx( 0, "#32770", "Test Gui", WS_SYSMENU Or WS_VISIBLE Or WS_MINIMIZEBOX, 100, 100, 500, 300, 0, 0, 0, 0 )
Var hBut = CreateWindowEx( 0, "Button", "Test", WS_VISIBLE Or WS_CHILD, 100, 100, 80, 20, hWnd, 3, 0, 0 )

While 1
   Var Msg = GetMsg()
   Select Case Msg.hwnd
      Case hWnd
         Select Case Msg.message
            Case EVENT_CLOSE
               End
         End Select
      Case hBut
         Select Case LoWord(Msg.wparam)
            Case 1
              MessageBox(0, "Button Press", "Info", 0)
         End Select
   End Select
Wend

Я тоже когда-то с этого начинал свое знакомство с WINAPI Very Happy . Потом понял что без оконной процедуры ничего нормального не напишешь.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Обработка сообщений окна в главном цикле

Сообщение  SergeyA в Сб Июл 07, 2012 3:00 pm

Это конечно само собой, но я хочу сделать диалоговые функции, знаю что есть Window9.bi, но он похож на PureBasic, а я не очень в нём, вот думаю как сделать обработчик событий в главном цикле а не в процедуре WndProc

Вот уже кое-что написал

Код:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()

Dim msg As MSG 'структурированная переменная MSG

Function WndProc(hWnd As HWND, Msg As Uinteger, wParam As WPARAM, lParam As LPARAM) As Integer
  Select Case Msg
       Case WM_COMMAND
          If wParam = 1 Then
             MessageBox(0, "", "", 0)
          EndIf
     Case WM_DESTROY
        PostQuitMessage(0)
  End Select
  Return DefWindowProc(hWnd, Msg, wParam, lParam)
End Function

Function WindowCreate(Title As String, _
                   iWidth As Integer, _
                   iHeight As Integer, _
                   iLeft As Integer = -1, _
                   iTop As Integer = -1, _
                   iStyle As Integer = -1, _
                   iExStyle As Integer = -1, _
                   hParent As Integer = -1) As HWND Export
                  
   Dim As WNDCLASSEX wc
   Dim As HWND hWnd
   Dim As String WndClass = "FreeBasic_Window"
  Dim As HINSTANCE Hinst = GetModuleHandle(0)
  Dim As Integer W, H
   With wc
      .cbSize        = SizeOf(WNDCLASSEX)
      .style        = CS_HREDRAW Or CS_VREDRAW
      .lpfnWndProc  = @WndProc
      .hInstance    = Hinst
      .hIcon        = LoadIcon(0,IDI_APPLICATION)
      .hCursor      = LoadCursor(0,IDC_ARROW)
      .hbrBackground = Cast(HBRUSH, COLOR_3DFACE + 1)
      .lpszClassName = StrPtr(WndClass)
      .hIconSm      = .hIcon
  End With
  If RegisterClassEx(@wc) = 0 Then
      End
  EndIf
  Screeninfo W, H
  If iLeft = -1 Then : iLeft = ((W / 2) - (iWidth / 2)) : EndIf
  If iTop = -1 Then : iTop = ((H / 2) - (iHeight / 2)) : EndIf
  If iStyle = -1 Then : iStyle = WS_VISIBLE Or WS_SYSMENU Or WS_MINIMIZEBOX : EndIf
  If iExStyle = -1 Then : iExStyle = 0 : EndIf
  If hParent = -1 Then : hParent = 0 : EndIf
 
  hWnd = CreateWindowEx(iExStyle, WndClass, Title, iStyle, iLeft, iTop, iWidth, iHeight, hParent, 0, Hinst, 0)
  If (GetLastError() <> 0) Then
      If (hWnd = NULL) Then
       SetLastError(1)
       Return 0
      EndIf
  EndIf 
  Return hWnd
End Function

Function ControlCreateButton(hParent As Integer, _
                             Id As Integer, _
                             Text As String, _
                             iLeft As Integer, _
                             iTop As Integer, _
                             iWidth As Integer, _
                             iHeight As Integer, _
                             iStyle As Integer = -1, _
                             iExStyle As Integer = -1) As HWND Export
   Dim As HWND hWnd
   Dim As Integer hFont
   If iStyle = -1 Then : iStyle = WS_VISIBLE : EndIf
   If iExStyle = -1 Then : iExStyle = 0 : EndIf
   hWnd = CreateWindowEx(0, "Button", Text, iStyle Or WS_CHILD, iLeft, iTop, iWidth, iHeight, hParent, Id, 0, 0)
   hFont = CreateFont(16, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, "Arial")
  SendMessage(hWnd, WM_SETFONT, hFont, TRUE)
  Return hWnd
End Function


Var hForm = WindowCreate("My Window", 500, 300)
ControlCreateButton(hForm, 1, "Кнопка 1", 20, 20, 60, 20)
ControlCreateButton(hForm, 2, "Кнопка 2", 100, 20, 60, 20)


While GetMessage(@msg,0,0,0)
  TranslateMessage(@msg)
  DispatchMessage(@msg)
Wend

То есть весь основной код будет выглядеть так:

Код:

Var hForm = WindowCreate("My Window", 500, 300)
ControlCreateButton(hForm, 1, "Кнопка 1", 20, 20, 60, 20)
ControlCreateButton(hForm, 2, "Кнопка 2", 100, 20, 60, 20)


While GetMessage(@msg,0,0,0)
  TranslateMessage(@msg)
  DispatchMessage(@msg)
  ' А здесь обработка событий контролов
Wend

SergeyA

Сообщения : 9
Дата регистрации : 2012-07-03

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Обработка сообщений окна в главном цикле

Сообщение  Vadim в Вт Авг 07, 2012 12:21 pm

SergeyA пишет:... знаю что есть Window9.bi,
В Windows9.bi тоже создаётся оконная функция, только Вы её не видите. Smile
Общий алгоритм такой:
1. Создаёте окно и элементы (гаджеты) - OpenWindow(), ButtonGadget() и т.п.
2. Организуете цикл Do..Loop в котором будут происходить ряд предопределённых событий.
3. На первом месте в этом цикле стоит функция WaitEvent(), которая отлавливает события существующих гаджетов и самого окна.
4. Подумайте, какие события окна Вы хотите отлавливать и найдите их в справочнике по библиотеке в разделе Events. Действия будут выбираться в Select Case.
5. Если произошло событие не окна, а гаджета, то оно будет называться eventgadget.
6. Если произошло событие eventgadget, то в переменную EventNumber попадает номер того гаджета, который послал сообщение. Нумеруются они в порядке создания.

Вот, что-то типа этого. Smile
Там примерчики есть, они все простые.

Vadim

Сообщения : 3
Дата регистрации : 2012-08-07

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Обработка сообщений окна в главном цикле

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения