FreeBasic
Главная
Вход
Регистрация
Среда, 24.04.2024, 07:05Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Вопросы по языку FreeBasic » Класс, создающий окно с оконной функцией
Класс, создающий окно с оконной функцией
WQДата: Вторник, 27.01.2015, 14:27 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Цель в том, чтобы при создании переменной сразу создавалось окно со всеми необходимыми функциями и процедурами, и далее можно было бы создавать другие такие же окна.

Код
Type Okno
    i As Integer
    s As String
    '...

    Declare Sub OknoSub_1()
    Declare Sub   OknoSub_2()
    Declare Function OknoFunc_1()
End Type


Проблема в @WndProc. Как в классе правильно указать ссылку на оконную функцию? Это вообще возможно? Не могу сообразить...
Код
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
 
haavДата: Вторник, 27.01.2015, 18:11 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Ни фига непонятно. Выложи полный пример класса и покажи , что не получается.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Среда, 28.01.2015, 00:04 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Вот:
Код
#Include "windows.bi"

Type Okno
    i As Integer    
    Declare Sub   OknoSub()
    Declare Function wndproc(hwnd As HWND, msg As Uinteger,wparam As WPARAM, lparam As LPARAM) As Integer    
End Type

Sub Okno.OknoSub()
    Dim msg As MSG
    Dim As WNDCLASSEX wc
    Dim As String NameClass="MyClass"
    Dim As HINSTANCE Hinst=GetModuleHandle(0)    
        
    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

    RegisterClassEx(@wc)
  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
End Sub

Function Okno.wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Select Case msg
       Case WM_DESTROY
          PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

Dim As Okno win1
win1.OknoSub


Задача - при создании переменной создавать сразу окно\несколько окон со всеми функциями.
Например, нужно создать 10 окон, различающихся несколькими параметрами, и чтобы не нужно было бы каждый раз для каждого окна писать свою оконную функцию.
Погуглил - и, кажется, у начинающих, например в C++, такая проблема часто всплывает  smile при недостатке знаний об ООП. Статические и нестатические функции... Как это обходится я пока не понял.


Сообщение отредактировал WQ - Среда, 28.01.2015, 00:06
 
haavДата: Среда, 28.01.2015, 08:57 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
1) Функция wndproc должна быть доступна операционной системе, поэтому ее нужно либо выносить в глобальную область, либо указать в классе , что она статичная так: Declare static Function wndproc
2) Регистрация класса окна должна быть только один раз. То есть если ты создашь еще одну переменную, то будет дублироваться регистрация класса MyClass и в результате функция RegisterClassEx выдаст ошибку.
3) Более того, после строчки win1.OknoSub ты не смомешь выполнить ни одной строчки кода (создать новый объект), пока не закроешь первое окно, ведь ты программу зациклил в процедуре Sub Okno.OknoSub()


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Среда, 28.01.2015, 11:18 | Сообщение # 5
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Спасибо!
Код
#Include "windows.bi"

Type Okno
    i As Integer    
    Declare Sub   OknoSub()
    Declare Static Function wndproc(hwnd As HWND, msg As Uinteger,wparam As WPARAM, lparam As LPARAM) As Integer    
End Type

Sub Okno.OknoSub()
    Dim msg As MSG
    Dim As WNDCLASSEX wc
    Dim As String NameClass="MyClass"
    Dim As HINSTANCE Hinst=GetModuleHandle(0)    
        
    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

    RegisterClassEx(@wc)
    CreateWindowEx(0,NameClass,"Okno",_
    WS_VISIBLE Or WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinst,0)

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

Function Okno.wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Select Case msg
       Case WM_DESTROY
          PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

Dim Shared As Okno win1, win2

Sub win_1(i As Integer )
    win1.OknoSub
End Sub

Sub win_2(i As Integer)
    win2.OknoSub
End Sub

ThreadCreate(Cast(Any Ptr, @win_1()), 0)
ThreadCreate(Cast(Any Ptr, @win_2()), 0)
Sleep


Ну про цикл в процедуре - можно и отдельный поток создать
 
electrikДата: Среда, 04.02.2015, 17:32 | Сообщение # 6
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
тут пытался написать свой gui, в классах и так не написал. вот заготовка, малоли пригодиться.
code]
#Define Unicode
#Include "Windows.Bi"
#Include "Crt.Bi"

#Define Classname "FBGui" ' Имя Нашего Класса Окна
Type FBGui_Base
Declare Constructor()
As HINSTANCE hModule' Хэндл Нашей Программы
STATIC As HANDLE CurWindowHandle
static as Handle PrevWindowHandle
End Type
dim as HANDLE FBGui_Base.CurWindowHandle
dim as HANDLE FBGui_Base.PrevWindowHandle

Constructor FBGui_Base
This.hModule= GetModuleHandle( Null ) ' Взять Хэндл Программы
End Constructor

Type FBGui_Window Extends FBGui_Base
Declare Function Create(Byval Title As Wstring Ptr,Byval X As Integer = Cw_usedefault,Byval Y As Integer = Cw_usedefault,Byval Innerwidth As Integer = Cw_usedefault,Byval Innerheight As Integer = Cw_usedefault, Byval Flags As Uinteger = 0,Byval Parentwindowid As Handle = 0) As Handle
Declare Function WaitEvent() As Integer
Declare Destructor()
Private:
Declare Static Function WndProc (Byval Hwnd As Hwnd, Byval Umsg As Uint, Byval Wparam As Wparam, Byval Lparam As Lparam) As Lresult
As MSG Wmsg ' Структура Сообщений
Static As HANDLE WinProcHandle
Static As Uinteger WinProcMessage
Static As WPARAM WinProcWparam
Static As LPARAM WinProcLparam
static as integer winProc
As Integer ProcessedEvent

End Type
Dim As HANDLE FBGui_window.WinProcHandle
Dim As Uinteger FBGui_window.WinProcMessage
Dim As WPARAM FBGui_window.WinProcWparam
Dim As LPARAM FBGui_window.WinProcLparam
dim as integer FBGui_window.winproc

Function FBGui_Window.Create(Byval Title As Wstring Ptr, Byval X As Integer = Cw_usedefault,Byval Y As Integer = Cw_usedefault,Byval Width_ As Integer = Cw_usedefault, Byval Height As Integer = Cw_usedefault, Byval Flags As Uinteger = 0,Byval Parentwindowhandle As Handle = 0) As Handle
Dim Wc As WNDCLASSEX ' Структура Параметров Окна

' Заполняем Структуру Wc
Wc.CbSize = Sizeof( Wndclassex )  ' Размер Структуры Wndclassex
Wc.Style = Cs_hredraw Or Cs_vredraw  ' Стиль Окна
Wc.LpfnWndProc = @Wndproc ' Адрес Процедуры Окна Wndproc
Wc.CbclsExtra = Null  ' Резервирование  Дополнительных Байт За Концом Структуры
Wc.CbwndExtra = null
Wc.Hinstance = This.hModule ' Хэндл Модуля
Wc.hbrBackground = Cast(Hgdiobj, Color_window+1) ' Цвет Фона
Wc.lpszMenuname = Null ' Хэндл Меню
Wc.lpszClassName = @Classname ' Класс Окна
Wc.hIcon = Loadicon( Null,Idi_application ) ' Хэндл Иконки
Wc.hIconSm = Wc.Hicon 'Хэндл Маленькой Иконки
Wc.hCursor = Loadcursor( Null,Idc_arrow) ' Хэндл Курсора

' Регистрация Нашего Класса Окна
If(RegisterClassEX(@Wc) = False) Then
Return 0
End If

' Создадим Окно
this.PrevWindowHandle = this.CurWindowHandle
this.CurWindowHandle = CreateWindowEX _
(WS_EX_APPWINDOW or WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE, _ ' Дополнительные Стили
@ClassName, _ ' Указатель На Строку С Именем Класса Окна
Title, _ ' Указатель На Строку С Именем Окна
 Flags, _ ' Стиль Окна
X, _ ' X
Y, _ ' Y
Width_, _ ' Ширина Окна
Height, _ ' Высота Окна
ParentWindowHandle, _ ' Хэндл Родительского Окна
Null, _ ' Хэндл Меню
This.hModule, _ ' Хэндл Модуля
Null) ' Указатель На Структуру Данных
ShowWindow(This.CurWindowHandle,Sw_show) ' Отобразить Наше Окно На Десктопе
UpdateWindow(This.CurWindowHandle) ' Обновить Клиентскую Область
End Function

Function FBGui_window.WaitEvent() As Integer
If This.ProcessedEvent Then
This.ProcessedEvent = 0
Else
if WinProc then
WinProc = 0
else
DefWindowProc(This.Winprochandle,This.Winprocmessage,This.Winprocwparam,This.Winproclparam)
end if
End If

Select Case GetMessage( @This.wMsg, Null , 0, 0 ) ' Забираем Из Очереди Сообщение
Case -1
Return -1
Case Is > 0
if(IsDialogMessage(this.CurWindowHandle, @wMsg ) ) then
this.ProcessedEvent = 1
return 0
end if
TranslateMessage( @This.wMsg )
DispatchMessage( @This.wMsg )
Return This.WinProcMessage
End Select
Return 0
End Function

' Процедура Событий Окна
Static Function FBGui_window.WndProc _
(Byval Hwnd As HWND, _ ' Хэндл Окна
Byval UMsg As Uint, _ ' Сообщение
Byval wParam As WPARAM, _ ' Дополнительный  Параметр Сообщений
Byval lParam As LPARAM) As Lresult ' Дополнительный Параметр Сообщений

Select Case uMsg
Case WM_CLOSE,WM_COMMAND
beep_(1000,20)
WinProcHandle = Hwnd
WinProcMessage = uMsg
WinProcWParam = wParam
WinProcLParam = lParam
Exit Function
End Select
winproc = 1
Function = DefWindowProc(hWnd,UMsg,wParam,lParam)
End Function

Destructor FBGui_Window()
DestroyWindow(This.CurWindowHandle)
This.CurWindowHandle = This.PrevWindowHandle
End Destructor

Type FBGui_Button Extends FBGui_base
Declare Function Create(Byval Button As Integer,Byval Name_ As Wstring Ptr,Byval X As Integer,Byval Y As Integer,Byval Width_ As Integer,Byval Height As Integer,Byval Flags As Integer = 0) As Handle
End Type

Function FBGui_button.Create(Byval Button As Integer,Byval Name_ As Wstring Ptr,Byval X As Integer,Byval Y As Integer,Byval Width_ As Integer,Byval Height As Integer,Byval Flags As Integer = 0) As Handle
Function = CreateWindowEx( 0, "Button", Name_, Ws_visible Or Ws_child Or WS_TABSTOP or Flags, X, Y, Width_, Height, this.CurWindowHandle, Cast(Hmenu,Button), 0, 0)
End Function

' Program Start
Enum
Button1 = 2000
Button2
End Enum

Dim As FBGui_window Win
Win.Create("Проверка Окна") ' Размеры Окна Задаются По Умолчанию
Dim  As FBGui_button Button
Button.Create(Button1,"Кнопка 1",10,10, 80,20)
Button.Create(Button2,"Кнопка 2",110,10, 80,20)

Dim Event As Integer
Do
Event=Win.WaitEvent()

Loop Until Event = Wm_close

Добавлено (04.02.2015, 17:32)
---------------------------------------------
ой, забыл, там есть функция beep - это я для отладки её зафигачил. уберёте сами.

 
WQДата: Четверг, 05.02.2015, 18:40 | Сообщение # 7
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
electrik
Спасибо!
 
Форум » Freebasic » Вопросы по языку FreeBasic » Класс, создающий окно с оконной функцией
  • Страница 1 из 1
  • 1
Поиск: