Большое спасибо за отзыв.
Создаю элемент управления относительно Buddy элемента контроля, например, TextBox
- Код: Выделить всё
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
m_BuddyControl = PropBag.ReadProperty("BuddyControl", "")
...
Create '// Создать управление
'// Установить значения относительно m_hWnd
Max = PropBag.ReadProperty("Max", m_defMax)
Min = PropBag.ReadProperty("Min", m_defMin)
Value = PropBag.ReadProperty("Value", m_defValue)
End Sub
Private Function Create(Optional ByVal dwSelect As Boolean = False)
Detach
...
If (m_hWnd = 0) Then
'// Извлечь дескриптор родительского окна
m_hWndParent = GetAncestor(UserControl.hwnd, GA_ROOT)
'// Создать элемент управления
m_hWnd = CreateWindowEx(WS_EX_STATICEDGE, CLASS_NAME, vbNullString, dwStyle, _
0, 0, UserControl.ScaleWidth \ Screen.TwipsPerPixelX, UserControl.ScaleHeight \ Screen.TwipsPerPixelY, _
m_hWndParent, 0, App.hInstance, ByVal 0&)
If (m_hWnd <> 0) Then
'// Найти элемент Buddy контроля среди элементов родительского окна
BuddyControl = m_BuddyControl
'// Извлечь дескриптор Buddy контроля
For i = 1 To m_Collection.Count
If UCase(m_BuddyControl) = UCase(m_Collection(i).Name) Then
m_BuddyhWnd = m_Collection(i).hwnd
If IsWindow(m_BuddyhWnd) Then
'// Установить окно пользователя для управления UserControl.
'// Возвращаемое значение - дескриптор предыдущего окна пользователя
Call SendMessage(m_hWnd, UDM_SETBUDDY, m_BuddyhWnd, ByVal 0&)
SetWindowPos m_hWnd, m_BuddyhWnd, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End If
Exit For
End If
Next i
'// Установить дополнительные параметры нового UserControl
SetAccel
'// Восстановить первоначальные значения
If dwSelect Then
Max = dwMax
Min = dwMin
Value = dwValue
End If
End If
If (Ambient.UserMode) Then pSubClass '// Установить ловушки Window
End If
End Function
1. Установленное значение m_hWndParent = 459336 не равно дескриптору родительского окна Me.hWnd = 459338;
2. Строка команды BuddyControl = m_BuddyControl не возвращает коллекцию элементов управления на форме, m_Collection.Count = 0
3. Ловушки Window устанавливаются неизвестно относительно какого родительского окна.
4. Чтобы установить ловушки Window пришлось создать процедуру UserControl_Show() для установки Buddy элемента и заново создать элемент управления.
5. Дескриптор m_BuddyhWnd устанавливается только в процедуре UserControl_Show(); оно равно 1245686, а при создании окна - 0
Таким образом, изначально неверно выдаётся дескриптор родительского окна. Каким образом можно обойти эту ситацию.