class CGXComboBoxWnd: public CComboBox, public CGXStatic
The CGXComboBoxWnd class implements a combo-box control that can be used to display and select items from a list. The user can select items in the combo box, and can change any style attributes with the CGXStyleSheet dialog.
The list of items that are displayed in the combo box is determined through the SetChoiceList attribute of the style object.
Style attributes specifying the appearance of the cell are:
-
Text with SetValue.
-
Text color with SetColor.
-
Background color with SetInterior.
-
Cell frame 3d-effect (raised, inset, normal) with SetDraw3dFrame.
-
Borders with SetBorder.
-
Horizontal alignment with SetHorizontalAlignment.
-
Vertical alignment with SetVerticalAlignment.
- Font with SetFont.
You can also change some global attributes for the CGXComboBoxWnd. See the section “Attributes” below.
The following control ids are predefined in Objective Grid:
-
GX_IDS_CTRL_CBS_DROPDOWN:CComboBox with CBS_DROPDOWN style.
- GX_IDS_CTRL_CBS_DROPDOWNLIST: CComboBox with CBS_DROPDOWNLIST style.
You can apply combo boxes to cells with
SetStyleRange(range,
CGXStyle()
.SetControl(GX_IDS_CTRL_CBS_DROPDOWN)
.SetValue("Item 1")
.SetChoiceList("Item 0\nItem 1\nItem 2");
);
If you want to use an index as value for the combo box, you may register a combo box with a non-zero m_bDispChoice attribute (see also the description for this attribute) and call
SetStyleRange(range,
CGXStyle()
.SetControl(IDS_CTRL_MYDROPDOWNLIST)
.SetValue(1)
.SetChoiceList("Item 0\nItem 1\nItem 2");
);
The cell will display “Item 1” in both examples, but in the first sample, the text is stored as value in the style object, and in the second sample, the index is stored in the style object, so that you could later call
nIndex = atoi(GetValueRowCol(nRow, nCol));
to determine the index of the entry selected by the user.
See the example in the CGXComboBox class description showing how to override GetStyleRowCol and determine the choice list at runtime. This is very useful if the choice list depends on another cell’s value. It works the same way for both CGXComboBoxWnd and CGXComboBox.
Note: Objective Grid also provides an alternative combo-box control. The difference between CGXComboBoxWnd and CGXComboBox is that CGXComboBoxWnd is derived from the Windows standard combo-box control CComboBox whereas CGXComboBox is a CGXEditControl with a small button at the right side of the input area. CGXComboBox has the advantage of fitting better into cells (needs less row-height), whereas CGXComboBoxWnd offers full CComboBox functionality.
If you want to use an owner-drawn combo box as cell, you can simply subclass CGXComboBox and implement the owner-drawn functionality as you would with the MFC CComboBox (see example).
#include <gxall.h>
Example
This example illustrates an owner-drawn combo box.
/////////////////////////////////////////////////////////////////////
// COwnerDrawnComboBox window
class COwnerDrawnComboBox : public CGXComboBoxWnd
{
GRID_DECLARE_CONTROL(COwnerDrawnComboBox);
// Construction
public:
COwnerDrawnComboBox(CGXGridCore* pGrid);
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COwnerDrawnComboBox)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~COwnerDrawnComboBox();
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
// Generated message map functions
protected:
//{{AFX_MSG(COwnerDrawnComboBox)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
GRID_DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////
// COwnerDrawnComboBox
static COLORREF VGAColorsArray[20] = {
RGB(0,0,0), // Black
RGB(0,0,255), // Bright blue
RGB(0,255,0), // Bright green
RGB(0,255,255), // Cyan
RGB(255,0,0), // Bright red
RGB(255,0,255), // Magenta
RGB(255,255,0), // Bright yellow
RGB(255,255,255), // White
RGB(0,0,128), // Dark blue
RGB(0,128,0), // Dark green
RGB(0,128,128), // Blue-green
RGB(128,0,0), // Brown
RGB(128,0,128), // Dark purple
RGB(128,128,0), // Olive
RGB(128,128,128), // Dark gray
RGB(192,192,192), // Light gray
RGB(192,220,192), // Pale green
RGB(166,202,240), // Light blue
RGB(255,251,240), // Off-white
RGB(160,160,164), // Medium gray
};
COwnerDrawnComboBox::COwnerDrawnComboBox(CGXGridCore* pGrid)
: CGXComboBoxWnd(pGrid)
{
m_bFillWithChoiceList = FALSE; // must be FALSE for ownderdrawn combobox
m_bWantArrowKeys = FALSE; // pass arrow keys to Grid
m_nIndexValue = 0; // 0 = Item 0, 1 = Item 1, ... n = Item N
// set m_nIndexValue = 1 if you want to have 1 = Item 0, 2 = Item 1, ... n = Item N+1
}
COwnerDrawnComboBox::~COwnerDrawnComboBox()
{
}
void COwnerDrawnComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRect rc = lpDrawItemStruct->rcItem;
COLORREF rgbColor = lpDrawItemStruct->itemData;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
GXPatB(pDC, rc, rgbColor);
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
CBrush br;
br.CreateStockObject(BLACK_BRUSH);
pDC->FrameRect(CRect(rc.left, rc.top, rc.right, rc.bottom), &br);
}
}
void COwnerDrawnComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 20;
}
BEGIN_MESSAGE_MAP(COwnerDrawnComboBox, CGXComboBoxWnd)
//{{AFX_MSG_MAP(COwnerDrawnComboBox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL COwnerDrawnComboBox::OnCommand(WPARAM wParam, LPARAM lParam)
{
#if _MFC_VER < 0x0300
UINT nNotification = HIWORD(lParam);
HWND hCtl = (HWND) LOWORD(lParam);
#else
UINT nNotification = HIWORD(wParam);
HWND hCtl = (HWND) lParam;
#endif
if (hCtl == m_hWnd) // is it really this wnd?
{
if (nNotification == CBN_SELCHANGE
|| nNotification == CBN_EDITCHANGE)
{
TRACE("Combobox changed\n");
}
}
return CGXComboBoxWnd::OnCommand(wParam, lParam);
}
See Also
CGXGridCore::RegisterControl CGXStyle::SetControl CGXStyle CGXComboBox