Allineamento a destra in combobox

di il
8 risposte

Allineamento a destra in combobox

Buona sera a tutti.
Una curiosità: è possibile avere l'allineamento a destra dei valori in una combobox, visto che non esiste la proprietà Alignment come per le listbox?
Grazie

8 Risposte

  • Re: Allineamento a destra in combobox

    Non è banale. In Vb6 puoi prendere spunto da questo

    http://vbnet.mvps.org/index.html?code/comboapi/comborightalignstylebits.htm
  • Re: Allineamento a destra in combobox

    Buona serata a tutti e grazie a Oregon per lo spunto. Questo è il codice che sono riuscito ad adattare alle mie esigenze. In pratica ho eliminato le checkbox.
    Private Const GWL_EXSTYLE As Long = (-20)
    Private Const WS_EX_RIGHT As Long = &H1000
    Private Const WS_EX_LEFTSCROLLBAR As Long = &H4000
    Private Const CB_SHOWDROPDOWN = &H14F
    
    Private Enum AlignConstants
       alignLeft = 0
       alignright = 1
    End Enum
    
    Private Type RECT
       Left As Long
       Top As Long
       Right As Long
       Bottom As Long
    End Type
    
    Private Type COMBOBOXINFO
       cbSize As Long
       rcItem As RECT
       rcButton As RECT
       stateButton  As Long
       hwndCombo  As Long
       hwndEdit  As Long
       hwndList As Long
    End Type
    
    Private Declare Function GetWindowLong Lib "user32" _
       Alias "GetWindowLongA" _
      (ByVal hwnd As Long, _
       ByVal nIndex As Long) As Long
    
    Private Declare Function SetWindowLong Lib "user32" _
       Alias "SetWindowLongA" _
      (ByVal hwnd As Long, _
       ByVal nIndex As Long, _
       ByVal dwNewLong As Long) As Long
       
    Private Declare Function GetComboBoxInfo Lib "user32" _
      (ByVal hwndCombo As Long, _
       CBInfo As COMBOBOXINFO) As Long
    
    Private Declare Function SendMessage Lib "user32" _
       Alias "SendMessageA" _
      (ByVal hwnd As Long, _
       ByVal wMsg As Long, _
       ByVal wParam As Long, _
       lParam As Any) As Long
    Private Sub Form_Load()
    
       Dim x As Long
       
       For x = 0 To Screen.FontCount - 1
          Combo1.AddItem Screen.Fonts(x)
    ComboListAlign Combo1, alignright
       Next
    End Sub
    Private Sub ComboListAlign(cb As ComboBox, Optional ByVal Align As AlignConstants = alignLeft)
       Dim hList As Long
       Dim nStyle As Long
       hList = GetComboListHandle(cb)
    
      'if valid, change the style
       If hList <> 0 Then
       
          nStyle = GetWindowLong(hList, GWL_EXSTYLE)
          
          Select Case Align
              Case alignright
                  nStyle = nStyle Or WS_EX_RIGHT
              Case Else
                  nStyle = nStyle And Not WS_EX_RIGHT
          End Select
          
          SetWindowLong hList, GWL_EXSTYLE, nStyle
       
       End If
       
      'drop the combo
       Call SendMessage(cb.hwnd, CB_SHOWDROPDOWN, True, ByVal 0)
       
    End Sub
    
    
    Private Sub ComboScrollAlign(cb As ComboBox, Optional ByVal Align As AlignConstants = alignright)
    
       Dim hList As Long
       Dim nStyle As Long
    
      'obtain the handle to the list
      'portion of the combo
       hList = GetComboListHandle(cb)
    
      'if valid, change the style
       If hList <> 0 Then
       
          nStyle = GetWindowLong(hList, GWL_EXSTYLE)
          
          Select Case Align
              Case alignright
                  nStyle = nStyle Or WS_EX_LEFTSCROLLBAR
              Case Else
                  nStyle = nStyle And Not WS_EX_LEFTSCROLLBAR
          End Select
          
          SetWindowLong hList, GWL_EXSTYLE, nStyle
       
       End If
       
      'drop the combo
       Call SendMessage(cb.hwnd, CB_SHOWDROPDOWN, True, ByVal 0)
          
    End Sub
    
    Private Function GetComboListHandle(ctl As ComboBox) As Long
    
       Dim CBI As COMBOBOXINFO
    
       CBI.cbSize = Len(CBI)
       Call GetComboBoxInfo(ctl.hwnd, CBI)
       GetComboListHandle = CBI.hwndList
    
    End Function  
    La mia domanda è se è possibile scrivere tutto il codice in un modulo e lasciare nella form solo il codice essenziale per far funzionare la combobox.
    Ci sto provando ma proprio non riesco.
    Grazie.
  • Re: Allineamento a destra in combobox

    Lascia la Form_Load nel Form e tutto il resto spostalo nel Modulo.

    Nel Modulo imposta come Public

    Public Enum AlignConstants

    e

    Public Sub ComboListAlign(cb As ComboBox, Optional ByVal Align As AlignConstants = alignLeft)

    Non serve altro. Ma come avevi provato?
  • Re: Allineamento a destra in combobox

    Ho aperto un nuovo progetto con una combobox nella form inserendo il codice come da spunto. quando tutto funzionava alla perfezione, ho cercato di scrivere lo stesso codice nel progetto che sto sviluppando. Adesso, spostando tutto in un modulo dovrei riuscire a far funzionare il mio progetto.
    Grazie di nuovo e alla prossima!
  • Re: Allineamento a destra in combobox

    Prego, anche se continuo a non capire perché avevi scritto "Ci sto provando ma proprio non riesco." e cosa avevi fatto ... non lo hai chiarito con la tua risposta, ma poco importa.
  • Re: Allineamento a destra in combobox

    Nel senso che avevo cercato di adattare il codice dello spunto al mio progetto, ma mi dava continui errori di vario tipo.
    Comunque, sul progetto di prova dove avevo inserito il codice che ho postato precedentemente, ho provato ad inserire il tutto nel Modulo, come da tue indicazioni, lasciando solo la Load_Form nella form. Ma mi dà degli errori. Questo è il codice inserito nel Modulo:
    Public Enum AlignConstants
    Private Const GWL_EXSTYLE As Long = (-20)
    Private Const WS_EX_RIGHT As Long = &H1000
    Private Const WS_EX_LEFTSCROLLBAR As Long = &H4000
    Private Const CB_SHOWDROPDOWN = &H14F
    
    Private Enum AlignConstants
       alignLeft = 0
       alignright = 1
    End Enum
    
    Private Type RECT
       Left As Long
       Top As Long
       Right As Long
       Bottom As Long
    End Type
    
    Private Type COMBOBOXINFO
       cbSize As Long
       rcItem As RECT
       rcButton As RECT
       stateButton  As Long
       hwndCombo  As Long
       hwndEdit  As Long
       hwndList As Long
    End Type
    
    Private Declare Function GetWindowLong Lib "user32" _
       Alias "GetWindowLongA" _
      (ByVal hwnd As Long, _
       ByVal nIndex As Long) As Long
    
    Private Declare Function SetWindowLong Lib "user32" _
       Alias "SetWindowLongA" _
      (ByVal hwnd As Long, _
       ByVal nIndex As Long, _
       ByVal dwNewLong As Long) As Long
       
    Private Declare Function GetComboBoxInfo Lib "user32" _
      (ByVal hwndCombo As Long, _
       CBInfo As COMBOBOXINFO) As Long
    
    Private Declare Function SendMessage Lib "user32" _
       Alias "SendMessageA" _
      (ByVal hwnd As Long, _
       ByVal wMsg As Long, _
       ByVal wParam As Long, _
       lParam As Any) As Long
    'Private Sub ComboListAlign(cb As ComboBox, Optional ByVal Align As AlignConstants = alignLeft)
    Public Sub ComboListAlign(cb As ComboBox, Optional ByVal Align As AlignConstants = alignLeft)
       Dim hList As Long
       Dim nStyle As Long
       hList = GetComboListHandle(cb)
    
      'if valid, change the style
       If hList <> 0 Then
       
          nStyle = GetWindowLong(hList, GWL_EXSTYLE)
          
          Select Case Align
              Case alignright
                  nStyle = nStyle Or WS_EX_RIGHT
              Case Else
                  nStyle = nStyle And Not WS_EX_RIGHT
          End Select
          
          SetWindowLong hList, GWL_EXSTYLE, nStyle
       
       End If
       
      'drop the combo
       Call SendMessage(cb.hwnd, CB_SHOWDROPDOWN, True, ByVal 0)
       
    End Sub
    
    
    Private Sub ComboScrollAlign(cb As ComboBox, Optional ByVal Align As AlignConstants = alignright)
    
       Dim hList As Long
       Dim nStyle As Long
    
      'obtain the handle to the list
      'portion of the combo
       hList = GetComboListHandle(cb)
    
      'if valid, change the style
       If hList <> 0 Then
       
          nStyle = GetWindowLong(hList, GWL_EXSTYLE)
          
          Select Case Align
              Case alignright
                  nStyle = nStyle Or WS_EX_LEFTSCROLLBAR
              Case Else
                  nStyle = nStyle And Not WS_EX_LEFTSCROLLBAR
          End Select
          
          SetWindowLong hList, GWL_EXSTYLE, nStyle
       End If
      'drop the combo
       Call SendMessage(cb.hwnd, CB_SHOWDROPDOWN, True, ByVal 0)
    End Sub
    
    Private Function GetComboListHandle(ctl As ComboBox) As Long
       Dim CBI As COMBOBOXINFO
       CBI.cbSize = Len(CBI)
       Call GetComboBoxInfo(ctl.hwnd, CBI)
       GetComboListHandle = CBI.hwndList
    End Function 
    Dove avrò sbagliato?
  • Re: Allineamento a destra in combobox

    RISOLTO!!
    Non avevo capito bene le tue istruzioni!
    Ciao e grazie di tutto!
  • Re: Allineamento a destra in combobox

    Guarda che è qui
    
    Private Enum AlignConstants
       alignLeft = 0
       alignright = 1
    End Enum
    
    che devi indicare Public al posto di Private, non nella linea all'inizio.

    Speravo comprendessi i suggerimenti elementari.
Devi accedere o registrarti per scrivere nel forum
8 risposte