Не все значения структуры NMHDR возвращаются

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Не все значения структуры NMHDR возвращаются

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

Подскажите, пожалуйста, почему в сообщении WM_NOTIFY возвращаемое значение idfrom всегда равно нулю. Как заставить его быть идентификатором управления, посылающего сообщение :?:
Код: Выделить всё
Private Type NMHDR
    hwndFrom As Long
    idfrom As Long
    code As Long
End Type
Private Type NMUPDOWN
    hdr As NMHDR
    iPos As Long
    iDelta As Long
End Type
Public Sub WndProc(ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, ByRef Result As Long)
Dim tNMH As NMHDR
Dim tNMUD As NMUPDOWN
Dim NewValue As Long

    '// Сообщения процесса здесь:
    Select Case Msg
        Case WM_NOTIFY
            CopyMemory tNMH, ByVal lParam, Len(tNMH)
            If (tNMH.hwndFrom = m_hWnd) And (tNMH.idfrom = m_BuddyhWnd) Then
               ...
            End if
     End Select

Значение tNMH.idfrom = 0 :?:

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

Сообщение GSerg » 13.10.2004 (Ср) 10:54

Ну а чего ты хотел...
В VB формы создаются ведь не с помощью механизма dialog template. Так что довольствуйся hWnd.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

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

В UserControl создаю элемент UpDown для элемента с дескриптором m_BuddyhWnd следующим образом:
Код: Выделить всё
    dwStyle = WS_VISIBLE Or WS_CHILD
    dwStyle = dwStyle Or m_Alignment Or m_Orientation
    If m_ArrowKeysChange Then
        dwStyle = dwStyle Or UDS_ARROWKEYS
    End If
    If m_AutoChangeBuddyText Then
        dwStyle = dwStyle Or UDS_SETBUDDYINT
    End If
    If Not (m_ShowThousandsSeparator) Then
        dwStyle = dwStyle Or UDS_NOTHOUSANDS
    End If
    If m_Wrap Then
        dwStyle = dwStyle Or UDS_WRAP
    End If
    If (m_hWnd = 0) Then
        '// Создать элемент управления UpDown
        m_hWnd = CreateWindowEx(WS_EX_STATICEDGE, UPDOWN_CLASS, vbNullString, dwStyle, _
                                0, 0, UserControl.ScaleWidth \ Screen.TwipsPerPixelX, UserControl.ScaleHeight \ Screen.TwipsPerPixelY, _
                                UserControl.hWnd, 0, App.hInstance, ByVal 0&)
        If (m_hWnd <> 0) Then
            ' Установить окно пользователя для управления UpDown.
            ' Возвращаемое значение - дескриптор предыдущего окна пользователя
            Call SendMessage(m_hWnd, UDM_SETBUDDY, m_BuddyhWnd, ByVal 0&)
        End If

Однако команда SendMessage не дает требуемого эффекта: сообщения UDS_SETBUDDYINT и UDS_NOTHOUSANDS не работают!!!

Спасибо.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.10.2004 (Ср) 14:23

oal писал(а):команда SendMessage не дает требуемого эффекта: сообщения UDS_SETBUDDYINT и UDS_NOTHOUSANDS не работают!!!

Спасибо.

:-)

Благодаришь за то, что не работают? :lol:
Изображение

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

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

нет...

В приводимых на сайтах по Visual C++ примерах говорится о синхронизации обоих элементов контроля: UpDown и, например, TextBox.
Как осуществить эту синхронизацию, почему команда UDM_SETBUDDY не дает требуемого результата в UserControl?, в то время как в ClassModule работает безукаризненно :?:

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

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

Разобрался
Код: Выделить всё
    If (m_hWnd = 0) Then
        m_hWndParent = GetParent(UserControl.hwnd)
        '// Создать элемент управления UpDown
        m_hWnd = CreateWindowEx(WS_EX_STATICEDGE, UPDOWN_CLASS, vbNullString, dwStyle, _
                                0, 0, UserControl.ScaleWidth \ Screen.TwipsPerPixelX, UserControl.ScaleHeight \ Screen.TwipsPerPixelY, _
                                m_hWndParent, 0, App.hInstance, ByVal 0&)
        If (m_hWnd <> 0) Then
            ' Установить окно пользователя для управления UpDown.
            ' Возвращаемое значение - дескриптор предыдущего окна пользователя
            Call SendMessage(m_hWnd, UDM_SETBUDDY, m_BuddyhWnd, ByVal 0&)
        End If
    End If


Теперь все работает безукаризненно!!!
Спасибо всем


Вернуться в Visual Basic 1–6

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

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

    TopList