Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 |

 

  Вопрос: Неразрешимая проблема? (WithEvents) Добавлено: 03.11.04 22:16  

Автор вопроса:  Yxine H.W. | Web-сайт: www.gsmmix.ru | ICQ: 479471 

Ответить

  Ответы Всего ответов: 50  

Номер ответа: 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

Вроде все понятно...

Ответить

Номер ответа: 18
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #18 Добавлено: 05.11.04 08:48
Забыл только про номер кнопки - процедуры Click на форме не используются. Для этого в модуле смотри hWnd - у кнопок они будут разные.

Ответить

Номер ответа: 19
Автор ответа:
 Nash Bridges



Вопросов: 5
Ответов: 139
 Профиль | | #19 Добавлено: 05.11.04 10:57
Хотя usercontrol также можно добавить, это не сложно.


Сложно. Последний раз говорю, у тебя два пути:
- класс-обертка ко всем типам контролов,
- http://www.domaindlx.com/e_morcillo. Но там тоже для большинства придется писать обертку, диспинтерфейс не подцепляется.

Load, хотя, ИМХО, это наиболее простой способ


Да. Когда контролы заранее известны.

С каких это пор Label - неоконный контрол?


С момента рождения.

Где здесь сообщение типа WM_...?


Какие сообщения? У меня контрол погодой занимается, а не сообщениями.

Что опять за код? Это к чему вообще? Я же по-русски пишу, что:
- нельзя просаблассить произвольный контрол,
- контрол реализует логику работы в ответ на сообщения виндов. И что всю логику надо заново в сабклассе реализовывать? ЭТО НЕ РЕШАЕТСЯ В ОБЩЕМ СЛУЧАЕ. НУ НЕУЖЕЛИ НЕ ПОНЯТНО ???
- Клик мыши - простейший случай, хотя и он трудно реализуем. Возьми UserControl обертки к дереву виндовому и посмотри сколько там кода.
- не все контролы публикуют оконный хендл
- Windowless controls вообще не имеют оконного хендла.

изменить адрес процедуры обработки окна сложнее чем написать класс-обертку?


Намного сложнее. Дело не в адресе процедуры, а в ЛОГИКЕ работы контрола в ответ на сообщения.

Может хватит спорить?

Ответить

Номер ответа: 20
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #20 Добавлено: 05.11.04 11:11

С момента рождения.

С момента рождения - в смысле с CreateWindowEx? Первый раз слышу чтобы этой функцией создавались "неоконные" окна.

то опять за код? Это к чему вообще? Я же по-русски пишу, что:
- нельзя просаблассить произвольный контрол,
- контрол реализует логику работы в ответ на сообщения виндов.

Ты то хоть о чем? Ты вопрос вообще смотрел? Button - это что, произвольный контрол? Или неоконный?
Человек привел конкретную ситуацию, я показал вариант ее решения. Чего ты меня теорией паришь?
Еще бы MSDN весь процитировал. Конкретный вопрос - конкретное решение. Для Label'а оно будет аналогичным. Создавай его через CreateWindowEx (класс Static) и получай хендл.

Ответить

Номер ответа: 21
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #21 Добавлено: 05.11.04 11:16
Вообще эту тему пора закрывать. Начинаем топтать воду в решете. Или пусть автор вопроса выскажется что ему нужно - решение конкретной проблемы или общая методика. Второе, мне кажется, не имеет смысла.

Ответить

Номер ответа: 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
Второе, мне кажется, не имеет смысла.


Второе имеет глубокий смысл при написании определенного рода платформ и фреймворков.

Ответить

Номер ответа: 24
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #24 Добавлено: 05.11.04 11:34

Может тогда и вб не нужен?

Нужен тебе вб или нет - решать тебе. А без АПИ на вб далеко не уедешь. И бояться их использовать не нужно. Существенно расширяются возможности и в большинстве случаев растет производительность.
Ну или устрой опрос на форуме - какое зло есть АПИ и как их нужно избегать. Уверен, единомышленников будет тьма :))
Хотел бы еще отметить что проблема вроде как решена. К чему ты про COM заладил?

Ответить

Номер ответа: 25
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #25 Добавлено: 05.11.04 11:49
Мне думается сейчас речь не о определенного рода платформах и фреймворках. Посмотри ответ №12, там вполне конкретно сказано что нужно сделать. Если не согласен с моим вариантом - поясни почему. Если есть лучший - приведи. А теорию про СОМ можешь ему по почте выслать.

Ответить

Номер ответа: 26
Автор ответа:
 Nash Bridges



Вопросов: 5
Ответов: 139
 Профиль | | #26 Добавлено: 05.11.04 12:00
Причем тут теория по СОМ? А у тебя не теория по АПИ?

Почему я уже пояснил. Ты наверное это за теорию принял, а это на самом деле практика и опыт. Если ты не сталкивался с этим и нет определенного уровня абстракции, как я тебе лучше поясню?

А делать надо так:
- класс-обертка ко всем типам контролов,
- http://www.domaindlx.com/e_morcillo. Но там тоже для большинства придется писать обертку, диспинтерфейс не подцепляется.

И к чему ты про апи рассказываешь, что это надо юзать? Кто спорит? Но все надо делать обоснованно.

Ответить

Номер ответа: 27
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #27 Добавлено: 05.11.04 12:19

Почему я уже пояснил.

ГДЕ? Я видел только рассуждения про неоконные контролы. Про них я ничего не говорю. Но ты можешь сам вылезти из абстракции и сконцентрировать внимание на том что есть перед глазами. ЗАЧЕМ ПИСАТЬ КЛАСС-ОБЕРТКУ ДЛЯ ПЕРЕХВАТА ОДНОГО СООБЩЕНИЯ ОТ КНОПКИ??? Поясни! Я настолько туп что никак не понимаю этого. Всю жизнь это делалось сабклассированием.
А про АПИ я просто заметил кстати, поскольку тебе не понравилась функция CreateWindowEx. ИМХО, это намного более гибкий и удобный способ добавления контролов нежели Controls.Add.
И, кстати, про Label. Если VB не позволяет узнать hWnd, то это не значит что его нет вовсе. VB Label - это STATIC, как ни крути...

Ответить

Номер ответа: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам