Обработка сообщений окна в главном цикле
Участников: 3
Страница 1 из 1
Обработка сообщений окна в главном цикле
Как обработать нажатие на кнопку если нет функции 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: Обработка сообщений окна в главном цикле
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 . Потом понял что без оконной процедуры ничего нормального не напишешь.
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Обработка сообщений окна в главном цикле
Это конечно само собой, но я хочу сделать диалоговые функции, знаю что есть 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: Обработка сообщений окна в главном цикле
В Windows9.bi тоже создаётся оконная функция, только Вы её не видите.SergeyA пишет:... знаю что есть Window9.bi,
Общий алгоритм такой:
1. Создаёте окно и элементы (гаджеты) - OpenWindow(), ButtonGadget() и т.п.
2. Организуете цикл Do..Loop в котором будут происходить ряд предопределённых событий.
3. На первом месте в этом цикле стоит функция WaitEvent(), которая отлавливает события существующих гаджетов и самого окна.
4. Подумайте, какие события окна Вы хотите отлавливать и найдите их в справочнике по библиотеке в разделе Events. Действия будут выбираться в Select Case.
5. Если произошло событие не окна, а гаджета, то оно будет называться eventgadget.
6. Если произошло событие eventgadget, то в переменную EventNumber попадает номер того гаджета, который послал сообщение. Нумеруются они в порядке создания.
Вот, что-то типа этого.
Там примерчики есть, они все простые.
Vadim- Сообщения : 3
Дата регистрации : 2012-08-07
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|