Newsgroup: it.comp.lang.visual-basic
Titolo: Domandina stupida su ToolBar

Ciao,
ho un dubbio abbastanza banale...
In una ToolBar ho un  Button con stile tbrDropdown.
Alla pressione del tasto non devo fare nulla ma vorrei solo far
visualizzare i suoi ButtonMenus.
Ho dato un'occhiata ai vari messaggi TB_* ma non mi sembra di averne
trovato uno adatto!
Tnx.
Daniele
-- 
Free As In Freedom
www.fsf.org

 trovato uno adatto!
VB6, VB.net o VB2005?
Il nome esatto del controllo è "ToolBar"?
Ciao 

 Il nome esatto del controllo è "ToolBar"?
Cioè? Si, la ToolBar dei Common Controls


 trovato uno adatto!
Infatti è un casino perché la toolbar di VB6 è costituita da 2 window, una delle
quali è la ToolbarWindow32 vera e propria che risponde ai messaggi TB_*, mentre
l'altra è una non meglio identificata "msvb_lib_toolbar" (SPY++ aiuta moltissimo
in questi casi) che ha come unica child window proprio la ToolbarWindow32.
Ma questo è il meno.
La parte più complicata è che i dropdown (ossia i ButtonMenu) non fanno parte
del common control Toolbar: la responsabilità di mostrarli è della finestra che
"ospita" la ToolbarWindow32 quando riceve un ben preciso messaggio di notifica
(WM_NOTIFY e TBN_DROPDOWN) da questa.
Per nostra fortuna VB crea la finestra "msvb_lib_toolbar": è precisamente lei
che si occupa di creare e mostrare i dropdown ed è precisamente a questa
finestra che si deve mandare il WM_NOTIFY, simulando in pratica quello che fa la
ToolbarWindow32 interna.
In google cercando bene bene qualcosa si trova... ma visto che siamo sotto
Pasqua ti faccio una sorpresa, che non troverai mai con google:
Private Const WM_USER = &H400
Private Const TB_GETBUTTON = (WM_USER + 23)
Private Const WM_NOTIFY = &H4E
Private Const TBN_FIRST = (-700)
Private Const TBN_DROPDOWN = (TBN_FIRST - 10)
Private Type NMHDR
    hwndFrom As Long
    idfrom As Long
    code As Long
End Type
Private Type TBBUTTON
   iBitmap As Long
   idCommand As Long
   fsState As Byte
   fsStyle As Byte
   bReserved1 As Byte
   bReserved2 As Byte
   dwData As Long
   iString As Long
End Type
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
Private Type NMTOOLBAR
    hdr As NMHDR
    iItem As Long
    tbBtn As TBBUTTON
    cchText As Long
    lpszString As Long
    rcButton As RECT
End Type
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam
As Any) As Long
Private Const GW_CHILD = 5
Private Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal
wCmd As Long) As Long
Private Sub ShowDropDownButton(tbr As Toolbar, ByVal ButtonIndex As Integer)
Dim hToolbar As Long
Dim tbb As TBBUTTON
Dim nmtb As NMTOOLBAR
    hToolbar = GetWindow(tbr.hwnd, GW_CHILD)
    SendMessage hToolbar, TB_GETBUTTON, ButtonIndex - 1, tbb
    With nmtb
        .hdr.hwndFrom = hToolbar
        .hdr.code = TBN_DROPDOWN
        .iItem = tbb.idCommand
    End With
    SendMessage tbr.hwnd, WM_NOTIFY, tbb.idCommand, nmtb
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    ShowDropDownButton Toolbar1, Button.Index
End Sub
Auguri!
Raf

 Auguri!
Cavolo... anche a te!!!
Tnx a lot!
Daniele.


 Daniele.
Raf


Io mi ero scritto una mia toolbar (tutta ownerdawn, cosě gli ho dato lo 
stile che volevo io) a cui attaccavo normalissimi menu.
Ciao 

 lo stile che volevo io) a cui attaccavo normalissimi menu.
Giusta soluzione, d'altra parte anche quelli di vbAccelerator hanno fatto così.
http://www.vbaccelerator.com/home/VB/Code/Controls/Toolbar/index.asp
Bye
Raf