UserControl_ReadProperties и дескриптор hWndParent окна форм

Создание, использование компонентов ActiveX
ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

UserControl_ReadProperties и дескриптор hWndParent окна форм

Сообщение ФАНТОМНЫЙ ЮЗЕР » 26.10.2004 (Вт) 17:32

Подскажите, пожалуйста, как при инициализации любого UserControl изъять дескриптор hWndParent создаваемого будующего окна Me.hWnd :?: для создания элемента управления с дескриптором m_hWnd функцией CreateWindowEx :!:

Как я понимаю, при инициализации UserControl форма еще не инициализирована, но она уже инициализирует элементы управления. Каким же образом определить дескриптор этого окна, инициализирующего элементы управления формы.

Существует или нет дескриптор Me.hWnd формы, на которой должен быть создан элемент управления с дескриптором m_hWnd :(

Функции
Код: Выделить всё
hWndParent = GetParent(UserControl.hWnd) и
hWndParent = GetAncestor(UserControl.hwnd, GA_ROOT)

не дают требуемого результата в подпрограмме UserControl_ReadProperties.

Подпрограмма UserControl_Show также не дает результата; она инициализирует только последний элемент управления m_hWnd.

Спасибо.
Последний раз редактировалось ФАНТОМНЫЙ ЮЗЕР 26.10.2004 (Вт) 17:38, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2004 (Вт) 17:35

Раз юзерконтрол, так пусть на себе и создаёт. На своём usercontrol.hwnd. Разве нет? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 26.10.2004 (Вт) 17:40

GSerg писал(а):Раз юзерконтрол, так пусть на себе и создаёт. На своём usercontrol.hwnd. Разве нет? :)
нет. Нужно после создания окна m_hWnd согласовать его действия с элементом управления Buddy.
Чьё это было сообщение?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2004 (Вт) 17:45

Давай ты изначальную задачу опишешь, а?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 26.10.2004 (Вт) 19:27

Большое спасибо за отзыв.

Создаю элемент управления относительно 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 :?:

Таким образом, изначально неверно выдаётся дескриптор родительского окна. Каким образом можно обойти эту ситацию.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2004 (Вт) 20:29

Чел, а чел...
Ты и текстбокс, и updown внутри юзерконтрола создавай...
А то снег башка попадёт, ...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 27.10.2004 (Ср) 15:04

GSerg писал(а):Чел, а чел...
Ты и текстбокс, и updown внутри юзерконтрола создавай...
А то снег башка попадёт, ...
А если надо программно менять Buddy элементы, то как же поступать???
Чьё это было сообщение?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 27.10.2004 (Ср) 15:07

Использовать UpDown control, встроенный в VB.


Вернуться в Компоненты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList