Страница: 1 | 2 | 3 | 4 |
|
Вопрос: Неразрешимая проблема? (WithEvents)
|
Добавлено: 03.11.04 22:16
|
|
Номер ответа: 16 Автор ответа: LamerOnLine
ICQ: 334781088
Вопросов: 108 Ответов: 2822
|
Профиль | | #16
|
Добавлено: 05.11.04 08:29
|
2Yxine H.W.
Ладно, не буду про Load, хотя, ИМХО, это наиболее простой способ - поставить на форму невидимую кнопку с индексом и штамповать остальные от нее.
Примерчик с сабклассингом щас накидаю, правда понадобится модуль.
End Sub
Private Button0_Click()
msgbox("Нажата 0"
End if
Private Button1_Click()
msgbox("Нажата 1"
End if
Ты на каком языке пишешь? Поясни мне смысл этой структуры.
[QOUTE]
Неоконные контролы тоже надо взять в рассчёт (Label, например)!
С каких это пор Label - неоконный контрол?
2Nash Bridges
Где код оконного контрола? Я вижу только пользовательское сообщение. Где здесь сообщение типа WM_...?
Сабкласс ведет к построению сложной обертки вокруг контрола и не возможен в общем случае.
Если контролы заранее известны, то проще всего писать класс-обертку и создавать экземпляр на каждый контрол.
По-твоему, изменить адрес процедуры обработки окна сложнее чем написать класс-обертку? Ребята, вы просто помешались на ООП. ИМХО, чем меньше реализовано кода в классах - тем лучше. Для кнопки это может и не критично, но для более шустрых контролов рулит процедурное программирование. VB и без того не High-Speed платформа...
Ответить
|
Номер ответа: 17 Автор ответа: LamerOnLine
ICQ: 334781088
Вопросов: 108 Ответов: 2822
|
Профиль | | #17
|
Добавлено: 05.11.04 08:46
|
Ну, вот примерчик. Немного изменил, то есть оформил не как контрол, а как обычный exe для простоты. Для демонстрации метода этого хватит.
'Код формы
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Button() As CommandButton
Private WithEvents ParentFrm As Form
Private Const GWL_WNDPROC = (-4)
'Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
' On Error Resume Next
'End Sub
Private Sub Form_Load()
ReDim Button(1)
Set ParentFrm = Me
ParentFrm_load
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Button(0).hwnd, GWL_WNDPROC, PrevProc
SetWindowLong Button(1).hwnd, GWL_WNDPROC, PrevProc
End Sub
Private Sub ParentFrm_load()
On Error Resume Next
Set Button(0) = ParentFrm.Controls.Add("VB.CommandButton", "Button0", ParentFrm)
With Button(0)
.Left = 10
.Top = 10
.Caption = "Íîìåð 0"
.Visible = True
' .ZOrder 0
End With
Set Button(1) = ParentFrm.Controls.Add("VB.CommandButton", "Button1", ParentFrm)
With Button(1)
.Left = 100
.Top = 100
.Caption = "Íîìåð 1"
.Visible = True
' .ZOrder 0
End With
PrevProc = SetWindowLong(Button(0).hwnd, GWL_WNDPROC, AddressOf WindowProc)
SetWindowLong Button(1).hwnd, GWL_WNDPROC, AddressOf WindowProc
End Sub
Private Sub Button0_Click()
MsgBox ("Íàæàòà 0"
End Sub
Private Sub Button1_Click()
MsgBox ("Íàæàòà 1"
End Sub
'Код модуля
Option Explicit
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public PrevProc As Long
Private Const WM_LBUTTONDOWN = &H201
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
If uMsg = WM_LBUTTONDOWN Then
MsgBox "Button click"
End If
End Function
Вроде все понятно...
Ответить
|
Номер ответа: 19 Автор ответа: Nash Bridges
Вопросов: 5 Ответов: 139
|
Профиль | | #19
|
Добавлено: 05.11.04 10:57
|
Хотя usercontrol также можно добавить, это не сложно.
Сложно. Последний раз говорю, у тебя два пути:
- класс-обертка ко всем типам контролов,
- http://www.domaindlx.com/e_morcillo. Но там тоже для большинства придется писать обертку, диспинтерфейс не подцепляется.
Load, хотя, ИМХО, это наиболее простой способ
Да. Когда контролы заранее известны.
С каких это пор Label - неоконный контрол?
С момента рождения.
Где здесь сообщение типа WM_...?
Какие сообщения? У меня контрол погодой занимается, а не сообщениями.
Что опять за код? Это к чему вообще? Я же по-русски пишу, что:
- нельзя просаблассить произвольный контрол,
- контрол реализует логику работы в ответ на сообщения виндов. И что всю логику надо заново в сабклассе реализовывать? ЭТО НЕ РЕШАЕТСЯ В ОБЩЕМ СЛУЧАЕ. НУ НЕУЖЕЛИ НЕ ПОНЯТНО ???
- Клик мыши - простейший случай, хотя и он трудно реализуем. Возьми UserControl обертки к дереву виндовому и посмотри сколько там кода.
- не все контролы публикуют оконный хендл
- Windowless controls вообще не имеют оконного хендла.
изменить адрес процедуры обработки окна сложнее чем написать класс-обертку?
Намного сложнее. Дело не в адресе процедуры, а в ЛОГИКЕ работы контрола в ответ на сообщения.
Может хватит спорить?
Ответить
|
Номер ответа: 22 Автор ответа: Nash Bridges
Вопросов: 5 Ответов: 139
|
Профиль | | #22
|
Добавлено: 05.11.04 11:26
|
VB Label не имеет hWND. И это НЕОКОННЫЙ контрол. ЭТО ТАК.
Создавай его через CreateWindowEx (класс Static) и получай хендл.
Может тогда и вб не нужен?
Я тебя теорией не парю. Парься сам. И сам цитируй, если не доходит.
Последний раз говорю, СОБЫТИЯ это СОМ и ловить их надо через СОМ, а не через WinAPI.
Ответить
|
Номер ответа: 23 Автор ответа: Nash Bridges
Вопросов: 5 Ответов: 139
|
Профиль | | #23
|
Добавлено: 05.11.04 11:28
|
Второе, мне кажется, не имеет смысла.
Второе имеет глубокий смысл при написании определенного рода платформ и фреймворков.
Ответить
|
Номер ответа: 26 Автор ответа: Nash Bridges
Вопросов: 5 Ответов: 139
|
Профиль | | #26
|
Добавлено: 05.11.04 12:00
|
Причем тут теория по СОМ? А у тебя не теория по АПИ?
Почему я уже пояснил. Ты наверное это за теорию принял, а это на самом деле практика и опыт. Если ты не сталкивался с этим и нет определенного уровня абстракции, как я тебе лучше поясню?
А делать надо так:
- класс-обертка ко всем типам контролов,
- http://www.domaindlx.com/e_morcillo. Но там тоже для большинства придется писать обертку, диспинтерфейс не подцепляется.
И к чему ты про апи рассказываешь, что это надо юзать? Кто спорит? Но все надо делать обоснованно.
Ответить
|
Номер ответа: 28 Автор ответа: Nash Bridges
Вопросов: 5 Ответов: 139
|
Профиль | | #28
|
Добавлено: 05.11.04 12:38
|
Я настолько туп что никак не понимаю этого.
Извини, это не ко мне
ЗАЧЕМ ПИСАТЬ КЛАСС-ОБЕРТКУ ДЛЯ ПЕРЕХВАТА ОДНОГО СООБЩЕНИЯ ОТ КНОПКИ???
Для разнообразия.
CreateWindowEx. ИМХО, это намного более гибкий и удобный способ добавления контролов нежели Controls.Add
Создай ей юзерконтрол.
Если VB не позволяет узнать hWnd, то это не значит что его нет вовсе.
Юзай SPY++.
Удачи!
Ответить
|
Номер ответа: 29 Автор ответа: LamerOnLine
ICQ: 334781088
Вопросов: 108 Ответов: 2822
|
Профиль | | #29
|
Добавлено: 05.11.04 13:00
|
Извини, это не ко мне
Да нет, к тебе. Ведь это ты меня за такого дурака держишь.
Для разнообразия.
Скорее для своеобразия
Создай ей юзерконтрол.
А кроме юзерконтролов других нет?
Юзай SPY++.
Удачи!
Option Explicit
Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" ( ByVal hwnd As Long, ByVal lpString As String) As Long
Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" ( ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" ( ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Const WS_EX_STATICEDGE = &H20000
Const WS_EX_TRANSPARENT = &H20&
Const WS_CHILD = &H40000000
Const CW_USEDEFAULT = &H80000000
Const SW_NORMAL = 1
Private Type CREATESTRUCT
lpCreateParams As Long
hInstance As Long
hMenu As Long
hWndParent As Long
cy As Long
cx As Long
y As Long
x As Long
style As Long
lpszName As String
lpszClass As String
ExStyle As Long
End Type
Dim lWnd As Long
Private Sub Command1_Click()
SetWindowText lWnd, "Hello, Nash Bridges, my hWnd is " & lWnd & " "
End Sub
Private Sub Form_Load()
Dim CS As CREATESTRUCT
lWnd = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", "Label1", WS_CHILD, 0, 0, 250, 50, Me.hwnd, 0, App.hInstance, CS)
ShowWindow lWnd, SW_NORMAL
End Sub
И тебе не болеть
Ответить
|
Номер ответа: 30 Автор ответа: cresta
Вопросов: 117 Ответов: 1538
|
Профиль | | #30
|
Добавлено: 05.11.04 13:12
|
Может тогда и вб не нужен?
Это верная мысль. А вообще класс - это пошло
И, кстати, про Label. Если VB не позволяет узнать hWnd, то это не значит что его нет вовсе. VB Label - это STATIC, как ни крути
Есть такая утилита SPY++, так она Label вообще не видит, ни hWnd, ни класс этого label'a, ни вообще, что оно существует. Похоже, msvbvm просто на hDC формы рисует текст, не более того. И называет кусок своего rect'a "контролом".
А вообще static - хорошая вещь, те то что label
Ответить
|
Страница: 1 | 2 | 3 | 4 |
Поиск по форуму