Вопрос по функции FindWindowEx

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
maxV
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 12.07.2004 (Пн) 18:26

Вопрос по функции FindWindowEx

Сообщение maxV » 14.08.2004 (Сб) 9:54

Пытаюсь использовать функцию FindWindowEx() - не получается. Возвращаемое значение 0.
Сделать как здесь. Кинул на форму ToolBar1 и в процедуре Form_Load() вызываю процедуру FlatBar. Ни какого эффекта. Функция FindWindowEx() возвращает 0, и в ToolBar1 ни каких изменений.
Пробовал определить с помощью FindWindowEx() дескриптор других объектов(кнопки) - то же самое.
Может кто-нибудь подскажет, что я не так делаю?

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

Сообщение GSerg » 14.08.2004 (Сб) 11:01

Не надо из form_load такие вещи вызывать. Такие вещи надо вызывать откуда-нибудь из command1_click. Но если очень уж охота, то предварительно me.show,
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

maxV
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 12.07.2004 (Пн) 18:26

Сообщение maxV » 14.08.2004 (Сб) 13:54

Я уже всяко пробовал и к Command1_Click() тоже.
На другом форуме тоже пример есть:

Код: Выделить всё
Как сделать ToolBar плоским.

В Visual Basic 6.0 можно просто воспользоваться свойством Apperance и поставить его значение в Flat.

Или можно использовать следующий код.

'Модуль
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal
hWndParent As Long, ByVal hWndChildWindow As Long, ByVal lpClassName As String,
ByVal lpsWindowName As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As
Long, ByVal msg As Long, ByVal wp As Long, lp As Any) As Long

Public Const WM_USER As Long = &H400
Public Const TB_SETSTYLE = WM_USER + 56
Public Const TB_GETSTYLE = WM_USER + 57
Public Const TBSTYLE_FLAT = &H800

Public Sub SetTBar97(hwnd As Long)
Dim lTBarStyle As Long, lTBarHwnd As Long
lTBarHwnd = FindWindowEx(hwnd, 0&, "ToolbarWindow32", vbNullString)
lTBarStyle = SendMessage(lTBarHwnd, TB_GETSTYLE, 0&, ByVal 0&)
lTBarStyle = lTBarStyle Or TBSTYLE_FLAT
SendMessage lTBarHwnd, TB_SETSTYLE, 0, ByVal lTBarStyle
End Sub

'Код
SetTBar97 Toolbar1.hwnd
Toolbar1.Refresh

Суть примера таже, только ты передаешь в процедуру Toolbar1, а здесь Toolbar1.hwnd
У меня не работает и немогу понять почему?

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

Сообщение tyomitch » 14.08.2004 (Сб) 14:12

Если у тебя версия Microsoft Windows Common Controls 6.0, то имя класса - "msvb_lib_toolbar"
С версией Microsoft Windows Common Controls 5.0 я этот код только что проверил - работает.

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

Сообщение tyomitch » 14.08.2004 (Сб) 14:13

GSerg писал(а):Не надо из form_load такие вещи вызывать. Такие вещи надо вызывать откуда-нибудь из command1_click. Но если очень уж охота, то предварительно me.show,

Зря ты, из Form_Load всё прекрасно работает.

maxV
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 12.07.2004 (Пн) 18:26

Сообщение maxV » 14.08.2004 (Сб) 14:27

tyomitch писал(а):Если у тебя версия Microsoft Windows Common Controls 6.0, то имя класса - "msvb_lib_toolbar"
С версией Microsoft Windows Common Controls 5.0 я этот код только что проверил - работает.

Точно, все работает спасибо.
А где можно глянуть имя класса для контрола?

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

Сообщение GSerg » 14.08.2004 (Сб) 15:59

Да чёрт их знает, что там работает из лоад, а что нет :)
Просто Data точно не работает из лоад, кое что ещё не работает, ну экстраполировал :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 14.08.2004 (Сб) 16:17

maxV писал(а):А где можно глянуть имя класса для контрола?

Пуск -> Программы -> Microsoft Visual Studio 6.0 -> Microsoft Visual Studio 6.0 Tools -> Spy++

maxV
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 12.07.2004 (Пн) 18:26

Сообщение maxV » 14.08.2004 (Сб) 20:13

Пуск -> Программы -> Microsoft Visual Studio 6.0 -> Microsoft Visual Studio 6.0 Tools -> Spy++

Спасибо. Буду разбираться.

Я почему этой темой заинтересовался. Мне нужно ToolBar сделать как в IE(кнопки разной ширины и с текстом, ComboEx). Так вот, ReBar и Toolbar я уже сделал с помощью функции CreateWindowEx(). Споткнулся на обработке уведомлений от ComboEx, что-то он мне не то шлет как в http://www.msdn.com/ написано. Да и переводить код с C++ на VB надоело. А тут этот топик увидел и решил попробовать контролы на форму накидать и изменить свойства какие мне нужно через API.
Я первоначальный код маленько подправил:
Module1
Код: Выделить всё
Option Explicit

'Установим константы

Public Const WM_USER          As Long = &H400
Public Const TB_SETSTYLE      As Long = WM_USER + 56
Public Const TB_GETSTYLE      As Long = WM_USER + 57
Public Const TBSTYLE_FLAT     As Long = &H800
Public Const TBSTYLE_TOOLTIPS As Long = &H100
Public Const TBSTYLE_LIST     As Long = &H1000

Public Const TB_SETBUTTONWIDTH       As Long = WM_USER + 59
Public Const TB_AUTOSIZE             As Long = WM_USER + 33
Public Const TB_SETBITMAPSIZE        As Long = WM_USER + 32
Public Const TB_SETBUTTONSIZE        As Long = WM_USER + 31
Public Const TB_SETBUTTONINFO        As Long = WM_USER + 66

Public Const TBIF_SIZE         As Long = &H40
Public Const WS_CHILD          As Long = &H40000000
Public Const CCS_NODIVIDER     As Long = &H40
Public Const CCS_NOPARENTALIGN As Long = &H8
Public Const CCS_NORESIZE      As Long = &H4


'Объявим функции
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

' * структура toolbar buttons info
Public Type TBBUTTONINFO
  cbSize As Long
  dwMask As Long
  idCommand As Long
  iImage As Long
  fState As Byte
  fStyle As Byte
  Cx As Integer
  lParam As Long
  pszText As String
  cchText As Long
End Type

Public Function MakeLong(ByVal LoWord As Integer, ByVal HiWord As Integer) As Long
'Creates a Long value using Low and High integers
'Useful when converting code from C++
  MakeLong = CLng(LoWord)
  Call CopyMemory(ByVal VarPtr(MakeLong) + 2, HiWord, 2)
End Function

Form1
Код: Выделить всё
Option Explicit

Private Sub Form_Initialize()
    Call FlatBar(ByVal Toolbar1.hWnd)
    Me.Toolbar1.Visible = True
End Sub

'Сделать плоский тулбар

Public Sub FlatBar(ByVal tbhWnd As Long)
Dim style As Long
Dim hToolbar As Long
    Me.Toolbar1.TextAlignment = tbrTextAlignRight
    hToolbar = FindWindowEx(ByVal tbhWnd, ByVal 0&, "msvb_lib_toolbar", vbNullString)
    style = WS_CHILD Or TBSTYLE_FLAT Or TBSTYLE_LIST Or TBSTYLE_TOOLTIPS Or CCS_NODIVIDER Or _
            CCS_NOPARENTALIGN Or CCS_NORESIZE
    Call SendMessage(ByVal hToolbar, TB_SETSTYLE, ByVal 0&, ByVal style)
    Call SendMessage(ByVal hToolbar, ByVal TB_SETBITMAPSIZE, ByVal 0&, ByVal MakeLong(20, 20))
    Call SendMessage(ByVal hToolbar, ByVal TB_SETBUTTONSIZE, ByVal 0&, ByVal MakeLong(30, 30))
    Call SendMessage(ByVal hToolbar, ByVal TB_SETBUTTONWIDTH, ByVal 0&, ByVal MakeLong(30, 30))
    Call SendMessage(ByVal hToolbar, ByVal TB_AUTOSIZE, ByVal 0&, ByVal 0&)
    Dim lButton As Long
    Dim TBI As TBBUTTONINFO
        TBI.cbSize = LenB(TBI)
        TBI.dwMask = TBIF_SIZE
        TBI.Cx = 80
        lButton = 0
    Call SendMessage(ByVal hToolbar, ByVal TB_SETBUTTONINFO, ByVal lButton, TBI)
End Sub

ВОПРОС:
не отрабатывается сообщение:
Код: Выделить всё
Call SendMessage(ByVal hToolbar, ByVal TB_SETBUTTONINFO, ByVal lButton, TBI)

Хотя когда я ToolBar создаю руками через CreateWindowEx() работает. Может кто подскажет причину?

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

Сообщение tyomitch » 14.08.2004 (Сб) 22:12

Скорее всего, mscomctl создаёт тулбар слишком старой версии. Придётся-таки через CreateWindow.


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

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

Сейчас этот форум просматривают: The trick, Yandex-бот и гости: 12

    TopList