Класс, создающий окно с оконной функцией
|
|
WQ | Дата: Вторник, 27.01.2015, 14:27 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: 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 |
Генералиссимус
Группа: Администраторы
Сообщений: 1376
Статус: Offline
| Ни фига непонятно. Выложи полный пример класса и покажи , что не получается.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Среда, 28.01.2015, 00:04 | Сообщение # 3 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: 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++, такая проблема часто всплывает при недостатке знаний об ООП. Статические и нестатические функции... Как это обходится я пока не понял.
Сообщение отредактировал WQ - Среда, 28.01.2015, 00:06 |
|
| |
haav | Дата: Среда, 28.01.2015, 08:57 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1376
Статус: Offline
| 1) Функция wndproc должна быть доступна операционной системе, поэтому ее нужно либо выносить в глобальную область, либо указать в классе , что она статичная так: Declare static Function wndproc 2) Регистрация класса окна должна быть только один раз. То есть если ты создашь еще одну переменную, то будет дублироваться регистрация класса MyClass и в результате функция RegisterClassEx выдаст ошибку. 3) Более того, после строчки win1.OknoSub ты не смомешь выполнить ни одной строчки кода (создать новый объект), пока не закроешь первое окно, ведь ты программу зациклил в процедуре Sub Okno.OknoSub()
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Среда, 28.01.2015, 11:18 | Сообщение # 5 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: 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 |
Полковник
Группа: Друзья
Сообщений: 183
Статус: 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
Статус: Offline
| electrik Спасибо!
|
|
| |
|