|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Combo API SetWindowLong: Right-Align List Contents in a Combo |
||
Posted: | Saturday November 03, 2001 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB6, Windows XP | |
OS restrictions: | None | |
Author: | Harald Genauck, VBnet - Randy Birch | |
Related: |
VBnet CoolTabs GetTextExtentPoint32: Right-Align List Box Data SetWindowLong: Right-Align List Box Data and/or the Scrollbar SetWindowLong: Right-Align List Contents in a Combo SendMessage: Align Text Box Contents Using Tabstops SendMessage: Align List Box Contents Using Tabstops WM_LBUTTONDOWN: Substitute a Tabbed List for a Combo's Dropdown List WM_LBUTTONDOWN: Substitute a ListView for a Combo's Dropdown List |
|
Prerequisites |
None. |
|
Like
the sister listbox routines, this shows how to apply some interesting, if
not unconventional, UI changes to a common VB combo box. And like the
list method this page is based on the style code provided by mvp Harald M. Genauck. Note that the third option will only affect the edit portion of the combo if the combo style is 2 - dropdown. |
BAS Module Code |
None. |
|
Form Code |
To a form containing a combo (Combo1), and three check boxes (Check1 - Check3), add the following code: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 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) Next End Sub Private Sub Check1_Click() 'Since the values of the alignment Enum 'correspond to the two values of a checkbox, 'the checkbox value property can be used 'directly as the alignment style parameter. ComboListAlign Combo1, Check1.Value End Sub Private Sub Check2_Click() ComboScrollAlign Combo1, Check2.Value End Sub Private Sub Check3_Click() ComboFlipButtonEdit Combo1, Check3.Value End Sub Private Sub ComboListAlign(cb As ComboBox, _ Optional ByVal Align As AlignConstants = alignLeft) 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_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 Sub ComboFlipButtonEdit(cb As ComboBox, _ Optional ByVal Align As AlignConstants = alignLeft) Dim nStyle As Long 'get the style for the combo nStyle = GetWindowLong(cb.hwnd, GWL_EXSTYLE) 'apply or remove the WS_EX_RIGHT 'window style Select Case Align Case alignRight nStyle = nStyle Or WS_EX_RIGHT Case Else nStyle = nStyle And Not WS_EX_RIGHT End Select SetWindowLong cb.hwnd, GWL_EXSTYLE, nStyle 'the code above flips the list 'portion too, so reset the list 'to the correct alignment ComboListAlign cb, alignLeft 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 |
Comments |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |