Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Это ИНТЕРЕСНО. Определение имени контрола. Добавлено: 21.03.05 20:09  

Автор вопроса:  mistershem | Web-сайт: inf.susu.ac.ru/~shem_a
HELP,HELP,HELP,HELP,HELP
______________________________________________________
Определяем hWnd окна и затем перебором коллекции определяем имя контрола (если надо код, то предоставлю). Но ЗАПУТКА вот в чем. Если на форме есть элементы НЕ ОКНА,например CommonDialog, ADODC , то имена нормальных окон, например Command, Text не определяются. КАК ИСПРАВИТЬ ЭТУ ФИГНЮ.

Ответить

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

Номер ответа: 1
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #1 Добавлено: 21.03.05 21:11
Код в студию! У тебя там явно что-то криво написано: сколько раз делал определение контрола по хэндлу - никогда проблем не было. Наверняка неверно отрабатываешь ситуацию с контролами, не имеющими свойства hWnd...

Ответить

Номер ответа: 2
Автор ответа:
 mistershem



Вопросов: 8
Ответов: 16
 Web-сайт: inf.susu.ac.ru/~shem_a
 Профиль | | #2
Добавлено: 21.03.05 22:08
Каюсь..Но продублировал случайно. Хотел переименовать название, а инет тупит. Вот и думал, что не отошел ешо пакет, нажал на СТОП и послал заново.
________________________________________________________
RE:Наверняка неверно отрабатываешь ситуацию с контролами, не имеющими свойства hWnd... (Дык я ее ваще не обрабатываю. А как надо-то обрыботать ???)

Код такой:

Dim handHwnd As Long

'------------Это вот функция

Public Function GetControlNameFromWindow(ByVal hwnd&;)
    ;Dim formnum%
    ;Dim ctlnum%
    For formnum% = 0 To Forms.Count - 1
        If Forms(formnum%).hwnd = hwnd& Then
            GetControlNameFromWindow = Forms(formnum%).Name
            Exit Function
        End If
        For ctlnum% = 0 To Forms(formnum%).Controls.Count - 1
            On Error Resume Next
            If Forms(formnum%).Controls(ctlnum%).hwnd = hwnd& Then
                If Err.Number = 0 Then
                    GetControlNameFromWindow = Forms(formnum%).Controls(ctlnum%).Name
                End If
                Exit Function
            End If
        Next ctlnum%
    Next formnum%
End Function

'--------------Вот это определение hWnd



Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim dl
Dim mousepos As POINTAPI ' координаты курсора мыши
Dim retval As Long ' возвращаемое значение

PointMode% = -1
dl = SetCapture(me.hwnd)
' Определяем окно под курсором
retval = GetCursorPos(mousepos) ' получаем координаты курсора
handWnd = WindowFromPoint(mousepos.X, mousepos.Y) ' определяем окно под курсором
If handWnd = 0 Then ' ошибка или нет окна в этой точке
  ;Debug.Print "Здесь ничего нет."
  End
End If

End Sub

'---------А вот это показывает имя

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

CtrlName = GetControlNameFromWindow(handWnd)
MsgBox CtrlName

PointMode% = 0
SetFocusAPI (handWnd)
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0

If GetCapture() = me.hwnd Then ReleaseCapture

End Sub


А дальше не могу. Ступор и все.

Ответить

Номер ответа: 3
Автор ответа:
 mistershem



Вопросов: 8
Ответов: 16
 Web-сайт: inf.susu.ac.ru/~shem_a
 Профиль | | #3
Добавлено: 27.03.05 13:01
Вот теперь нормально работает.

Вот код модуля (module1):

Type POINTAPI
        X As Long
        Y As Long
End Type

Declare Function WindowFromPoint Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

'----------Определяем имя контроля
Public Function GetControlNameFromWindow(ByVal hwnd&;)
    ;Dim formnum%
    ;Dim ctlnum%
    For formnum% = 0 To Forms.Count - 1
          If Forms(formnum%).hwnd = hwnd& Then
            GetControlNameFromWindow = Forms(formnum%).Name
            Exit Function
        End If
        For ctlnum% = 0 To Forms(formnum%).Controls.Count - 1
            On Error Resume Next
            If Forms(formnum%).Controls(ctlnum%).hwnd = hwnd& Then
                If Err.Number = 0 Then
                    GetControlNameFromWindow = Forms(formnum%).Controls(ctlnum%).Name
                Else
                    GoTo Next_Ctrl
                End If
      ' If Forms(formnum%).Controls(ctlnum%).hwnd = -1 Then
      ' MsgBox "буба"
      ' ctlnum% = ctlnum% + 1
      ' GetControlNameFromWindow = Forms(formnum%).Controls(ctlnum%).Name
      ' End If
                Exit Function
            End If
Next_Ctrl: Next ctlnum%
    Next formnum%
End Function

Вот код Form1:

Пишем на стартовой форме:

Dim mousepos As POINTAPI ' координаты курсора мыши
Dim wintext As String, slength As Long ' текст заголовков окна и его длина
Dim handWnd As Long ' дескриптор окна,находящегося в точке
Dim retval As Long ' возвращаемое значение

'Ставим Timer на стартовую форму и пишем в нем:

Private Sub Timer1_Timer()

retval = GetCursorPos(mousepos) ' получаем координаты курсора
handWnd = WindowFromPoint(mousepos.X, mousepos.Y) ' определяем окно под курсором
If handWnd = 0 Then ' ошибка или нет окна в этой точке
  ;Debug.Print "Здесь ничего нет."
  End
Else
  ctrlname = GetControlNameFromWindow(handWnd)
  ;Debug.Print "hWnd: " & handWnd & " ; Имя: " & ctrlname & " ; X=" & mousepos.X & " Y=" & mousepos.Y
End If

End Sub

Ответить

Страница: 1 |

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



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