CComboBox

提供 Windows 组合框功能。

Syntax

class CComboBox : public CWnd

Members

Public Constructors

Name Description
CComboBox::CComboBox 构造 CComboBox 对象。

Public Methods

Name Description
CComboBox::AddString 将字符串添加到组合框的列表框中列表的末尾,或者添加到具有 CBS_SORT 样式的列表框的已排序位置。
CComboBox::Clear 删除(清除)编辑控件中的当前所选内容(如果有)。
CComboBox::CompareItem 由框架调用,以确定新列表项在已排序所有者绘制组合框中的相对位置。
CComboBox::Copy CF_TEXT 格式将当前所选内容(如果有)复制到剪贴板。
CComboBox::Create 创建组合框并将其附加到 CComboBox 对象。
CComboBox::Cut 删除(剪切)编辑控件中的当前所选内容(如果有),并以 CF_TEXT 格式将已删除的文本复制到剪贴板。
CComboBox::DeleteItem 从所有者绘制组合框中删除列表项时由框架调用。
CComboBox::DeleteString 将字符串从组合框的列表框删除。
CComboBox::Dir 将文件名列表添加到组合框的列表框中。
CComboBox::DrawItem 当所有者绘制组合框的可视方面发生变化时由框架调用。
CComboBox::FindString 在组合框的列表框中查找包含指定前缀的第一个字符串。
CComboBox::FindStringExact 查找(组合框中)与指定字符串匹配的第一个列表框字符串。
CComboBox::GetComboBoxInfo 检索有关 CComboBox 对象的信息。
CComboBox::GetCount 检索组合框的列表框中的项数。
CComboBox::GetCueBanner 获取为组合框控件显示的提示文本。
CComboBox::GetCurSel 检索组合框的列表框中当前所选项(如果有)的索引。
CComboBox::GetDroppedControlRect 检索下拉组合框的可见(已下拉)列表框的屏幕坐标。
CComboBox::GetDroppedState 确定下拉组合框的列表框是否可见(已下拉)。
CComboBox::GetDroppedWidth 检索组合框的下拉列表框部分的最小允许宽度。
CComboBox::GetEditSel 获取组合框的编辑控件中当前所选内容的起始和结束字符位置。
CComboBox::GetExtendedUI 确定组合框是具有默认用户界面还是扩展的用户界面。
CComboBox::GetHorizontalExtent 返回组合框的列表框部分可以水平滚动的宽度(以像素为单位)。
CComboBox::GetItemData 检索与指定的组合框项关联的应用程序提供的 32 位值。
CComboBox::GetItemDataPtr 检索与指定的组合框项关联的应用程序提供的 32 位指针。
CComboBox::GetItemHeight 检索组合框中列表项的高度。
CComboBox::GetLBText 获取组合框的列表框中的字符串。
CComboBox::GetLBTextLen 获取组合框的列表框中字符串的长度。
CComboBox::GetLocale 检索组合框的区域设置标识符。
CComboBox::GetMinVisible 获取当前组合框的下拉列表中可见项的最小数目。
CComboBox::GetTopIndex 返回组合框的列表框部分中第一个可见项的索引。
CComboBox::InitStorage 为组合框的列表框部分中的项和字符串预分配内存块。
CComboBox::InsertString 将字符串插入组合框的列表框。
CComboBox::LimitText 限制用户可以在组合框的编辑控件中输入的文本长度。
CComboBox::MeasureItem 由框架调用,以确定创建所有者绘制组合框时的组合框尺寸。
CComboBox::Paste 将数据从剪贴板插入到编辑控件中的当前光标位置。 仅当剪贴板包含 CF_TEXT 格式的数据时,才会插入数据。
CComboBox::ResetContent 从列表框中移除所有项,并在组合框中编辑控件。
CComboBox::SelectString 在组合框的列表框中搜索字符串,如果找到该字符串,在列表框中选择字符串,并将字符串复制到编辑控件。
CComboBox::SetCueBanner 设置为组合框控件显示的提示文本。
CComboBox::SetCurSel 在组合框的列表框中选择字符串。
CComboBox::SetDroppedWidth 设置组合框的下拉列表框部分的最小允许宽度。
CComboBox::SetEditSel 在组合框的编辑控件中选择字符。
CComboBox::SetExtendedUI 为具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框选择默认用户界面或扩展用户界面。
CComboBox::SetHorizontalExtent 设置组合框的列表框部分可以水平滚动的宽度(以像素为单位)。
CComboBox::SetItemData 设置与组合框中的指定项关联的 32 位值。
CComboBox::SetItemDataPtr 设置与组合框中的指定项关联的 32 位指针。
CComboBox::SetItemHeight 设置组合框中列表项的高度或组合框的编辑控件(或静态文本)部分的高度。
CComboBox::SetLocale 设置组合框的区域设置标识符。
CComboBox::SetMinVisibleItems 设置当前组合框的下拉列表中可见项的最小数目。
CComboBox::SetTopIndex 指示组合框的列表框部分显示顶部具有指定索引的项。
CComboBox::ShowDropDown 显示或隐藏具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框的列表框。

Remarks

组合框由一个列表框和一个静态控件或编辑控件组合而成。 控件的列表框部分可以一直显示,也可以只在用户选择控件旁边的下拉箭头时下拉。

列表框中的当前所选项(如果有)显示在静态控件或编辑控件中。 此外,如果组合框具有下拉列表样式,则用户可以键入列表中其中一个项的初始字符,列表框(如果可见)将突出显示具有该初始字符的下一个项。

下表比较了三种组合框样式

Style 列表框何时可见 静态控件或编辑控件
Simple Always Edit
Drop-down 下拉时 Edit
Drop-down list 下拉时 Static

你可以从对话框模板创建 CComboBox 对象,也可以直接在代码中创建。 在这两种情况下,首先调用构造函数 CComboBox 以构造 CComboBox 对象,然后调用 Create 成员函数以创建控件,并将它附加到 CComboBox 对象。

如果想处理由组合框发送到其父级(通常是从 CDialog 派生的类)的 Windows 通知消息,请将消息映射条目和消息处理程序成员函数添加到每个消息的父类。

每个消息映射条目采用以下格式:

ON_Notification( id, memberFxn )

其中 id 指定发送通知的组合框控件的子窗口 ID,memberFxn 是为处理通知而编写的父成员函数的名称。

父函数原型如下:

afx_msg void memberFxn( );

某些通知的发送顺序是无法预测的。 尤其是,CBN_SELCHANGE 通知可能在 CBN_CLOSEUP 通知之前或之后发生。

潜在的消息映射条目如下:

  • ON_CBN_CLOSEUP(Windows 3.1 及更高版本。)组合框的列表框已关闭。 对于具有 CBS_SIMPLE 样式的组合框,不发送此通知信息。

  • ON_CBN_DBLCLK 用户双击组合框的列表框中的字符串。 此通知消息仅针对具有 CBS_SIMPLE 样式的组合框发送。 对于具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框,无法进行双击,因为单击一次就会隐藏列表框。

  • ON_CBN_DROPDOWN 组合框的列表框即将下拉(使其可见)。 此通知消息仅针对具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框发送。

  • ON_CBN_EDITCHANGE 用户已执行操作,该操作可能已更改组合框的编辑控件部分中的文本。 与 CBN_EDITUPDATE 消息不同,此消息在 Windows 更新屏幕后发送。 如果组合框具有 CBS_DROPDOWNLIST 样式,则不会发送该消息。

  • ON_CBN_EDITUPDATE 组合框的编辑控件部分即将显示更改的文本。 此通知消息是在控件设置文本格式之后,显示文本之前发送的。 如果组合框具有 CBS_DROPDOWNLIST 样式,则不会发送该消息。

  • ON_CBN_ERRSPACE 组合框无法分配足够的内存来满足特定请求。

  • ON_CBN_SELENDCANCEL(Windows 3.1 及更高版本。)指示应取消用户的选择。 用户单击某个项,然后单击另一个窗口或控件以隐藏组合框的列表框。 此通知消息在 CBN_CLOSEUP 通知消息之前发送,指示应忽略用户的选择。 即使不发送 CBN_SELENDCANCEL 通知消息(就像具有 CBN_SELENDOK 样式的组合框一样),也会发送 CBN_CLOSEUPCBS_SIMPLE 通知消息。

  • ON_CBN_SELENDOK 用户选择一个项,然后按 Enter 键或单击向下箭头键以隐藏组合框的列表框。 此通知消息在 CBN_CLOSEUP 消息之前发送,指示用户的选择应被视为有效。 即使不发送 CBN_SELENDCANCEL 通知消息(就像具有 CBN_SELENDOK 样式的组合框一样),也会发送 CBN_CLOSEUPCBS_SIMPLE 通知消息。

  • ON_CBN_KILLFOCUS 组合框即将失去输入焦点。

  • ON_CBN_SELCHANGE 由于用户在列表框中单击或通过使用箭头键更改所选内容,组合框的列表框中的选择即将更改。 处理此消息时,只能通过 GetLBText 或其他类似函数检索组合框的编辑控件中的文本。 无法使用 GetWindowText

  • ON_CBN_SETFOCUS 组合框收到输入焦点。

如果在对话框中创建 CComboBox 对象(通过对话框资源),则在用户关闭对话框时会自动销毁 CComboBox 对象。

如果在另一个窗口对象中嵌入 CComboBox 对象,则无需将其销毁。 如果在堆栈上创建 CComboBox 对象,则会自动销毁该对象。 如果使用 CComboBox 函数在堆上创建 new 对象,则必须在该对象上调用 delete 以在销毁 Windows 组合框时将其销毁。

注意:如果要处理 WM_KEYDOWNWM_CHAR 消息,必须对组合框的编辑控件和列表框控件进行子类化,从 CEditCListBox 类派生类,并向派生的类添加这些消息的处理程序。 有关详细信息,请参阅 CWnd::SubclassWindow

Inheritance Hierarchy

CObject

CCmdTarget

CWnd

CComboBox

Requirements

Header:afxwin.h

CComboBox::AddString

将字符串添加到组合框的列表框。

int AddString(LPCTSTR lpszString);

Parameters

lpszString
指向要添加的以 null 结尾的字符串。

Return Value

如果返回值大于或等于 0,则它是列表框中字符串的从零开始的索引。 如果发生错误,返回值为 CB_ERR;如果没有足够的空间来存储新的字符串,则返回值为 CB_ERRSPACE

Remarks

如果列表框不是使用 CBS_SORT 样式创建的,则会将字符串添加到列表的末尾。 否则,会将字符串插入到列表中,并对列表进行排序。

Note

Windows ComboBoxEx 控件不支持此函数。 有关此控件的详细信息,请参阅 Windows SDK 中的 ComboBoxEx 控件

若要将字符串插入列表中的特定位置,请使用 InsertString 成员函数。

Example

// Add 20 items to the combo box.
CString str;
for (int i = 0; i < 20; i++)
{
   str.Format(_T("item string %d"), i);
   m_pComboBox->AddString(str);
}

CComboBox::CComboBox

构造 CComboBox 对象。

CComboBox();

Example

// Declare a local CComboBox object.
CComboBox myComboBox;

// Declare a dynamic CComboBox object.
CComboBox *pmyComboBox = new CComboBox;

CComboBox::Clear

删除(清除)组合框的编辑控件中的当前所选内容(如果有)。

void Clear();

Remarks

若要删除当前所选内容并将已删除的内容放入剪贴板,请使用 Cut 成员函数。

Example

// Delete all of the text from the combo box's edit control.
m_MyComboBox.SetEditSel(0, -1);
m_MyComboBox.Clear();

CComboBox::CompareItem

由框架调用,以确定新项在已排序所有者绘制组合框的列表框部分中的相对位置。

virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);

Parameters

lpCompareItemStruct
指向 COMPAREITEMSTRUCT 结构的长指针。

Return Value

指示 COMPAREITEMSTRUCT 结构中描述的两项的相对位置。 可以是以下任一值:

Value Meaning
- 1 项 1 排在项 2 之前。
0 项 1 和项 2 顺序相同。
1 项 1 排在项 2 之后。

有关 CWnd::OnCompareItem 的说明,请参阅 COMPAREITEMSTRUCT

Remarks

默认情况下,此成员函数不执行任何操作。 如果创建具有 LBS_SORT 样式的所有者绘制组合框,则必须替代此成员函数以帮助框架对添加到列表框中的新项进行排序。

Example

// CMyComboBox is my owner-drawn combo box derived from CComboBox. This
// example compares two items using strcmp to sort items in reverse
// alphabetical order. The combo box control was created with the
// following code:
//   pmyComboBox->Create(
//      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
//      CBS_SORT|CBS_OWNERDRAWVARIABLE,
//      myRect, pParentWnd, 1);
//
int CMyComboBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
   int iComp = 0;
   ASSERT(lpCompareItemStruct->CtlType == ODT_COMBOBOX);
   LPCTSTR lpszText1 = (LPCTSTR)lpCompareItemStruct->itemData1;
   ASSERT(lpszText1 != NULL);
   LPCTSTR lpszText2 = (LPCTSTR)lpCompareItemStruct->itemData2;
   ASSERT(lpszText2 != NULL);

   if (NULL != lpszText1 && NULL != lpszText2)
   {
      iComp = _tcscmp(lpszText2, lpszText1);
   }

   return iComp;
}

CComboBox::Copy

CF_TEXT 格式将组合框的编辑控件中的当前所选内容(如果有)复制到剪贴板。

void Copy();

Example

// Copy all of the text from the combo box's edit control
// to the clipboard.
m_MyComboBox.SetEditSel(0, -1);
m_MyComboBox.Copy();

CComboBox::Create

创建组合框并将其附加到 CComboBox 对象。

virtual BOOL Create(
    DWORD dwStyle,
    const RECT& rect,
    CWnd* pParentWnd,
    UINT nID);

Parameters

dwStyle
指定组合框的样式。 将组合框样式的任意组合应用到框。

rect
指向组合框的位置和大小。 可以是 RECT 结构CRect 对象。

pParentWnd
指定组合框的父窗口(通常为 CDialog)。 不得为 NULL

nID
指定组合框的控件 ID。

Return Value

如果成功,则不为 0;否则为 0。

Remarks

请分两步构造 CComboBox 对象。 首先,调用构造函数,然后调用 Create,这将创建 Windows 组合框并将其附加到 CComboBox 对象。

Create 执行时,Windows 会将 WM_NCCREATEWM_CREATEWM_NCCALCSIZEWM_GETMINMAXINFO 消息发送到组合框。

默认情况下,这些消息由 OnNcCreate 基类中的 OnCreateOnNcCalcSizeOnGetMinMaxInfoCWnd 成员函数处理。 若要扩展默认消息处理,请从 CComboBox 派生一个类,将消息映射添加到新类,并替代前面的消息处理程序成员函数。 例如,重写 OnCreate 以为新类执行所需的初始化。

将以下窗口样式应用于组合框控件。 :

  • WS_CHILD:始终

  • WS_VISIBLE:通常

  • WS_DISABLED 很少

  • WS_VSCROLL 在组合框中为列表框添加垂直滚动

  • WS_HSCROLL 在组合框中为列表框添加水平滚动

  • WS_GROUP 对控件进行分组

  • WS_TABSTOP 在 Tab 键顺序中包含组合框

Example

m_pComboBox->Create(
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST,
    CRect(10, 10, 200, 100), pParentWnd, 1);

CComboBox::Cut

删除(剪切)组合框编辑控件中的当前所选内容(如果有),并以 CF_TEXT 格式将删除的文本复制到剪贴板。

void Cut();

Remarks

若要删除当前选定内容而不将已删除的文本放入剪贴板,请调用 Clear 成员函数。

Example

// Delete all of the text from the combo box's edit control and copy it
// to the clipboard.
m_MyComboBox.SetEditSel(0, -1);
m_MyComboBox.Cut();

CComboBox::DeleteItem

当用户从所有者绘制的 CComboBox 对象中删除项或销毁组合框时由框架调用。

virtual void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);

Parameters

lpDeleteItemStruct
指向包含有关已删除项的信息的 Windows DELETEITEMSTRUCT 结构的长指针。 有关此结构的说明,请参阅 CWnd::OnDeleteItem

Remarks

此函数的默认实现不执行任何操作。 替代此函数以根据需要重新绘制组合框。

Example

// CMyComboBox is my owner-drawn combo box derived from CComboBox. This
// example simply dumps the item's text. The combo box control was
// created with the following code:
//   pmyComboBox->Create(
//      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
//      CBS_SORT|CBS_OWNERDRAWVARIABLE,
//      myRect, pParentWnd, 1);
//
void CMyComboBox::DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct)
{
   ASSERT(lpDeleteItemStruct->CtlType == ODT_COMBOBOX);
   LPTSTR lpszText = (LPTSTR)lpDeleteItemStruct->itemData;
   ASSERT(lpszText != NULL);

   AFXDUMP(lpszText);
}

CComboBox::DeleteString

从组合框中删除位置为 nIndex 的项。

int DeleteString(UINT nIndex);

Parameters

nIndex
指定要删除的字符串的索引。

Return Value

如果返回值大于或等于 0,则它是列表中剩余字符串的计数。 如果 CB_ERR 指定的索引大于列表中的项数,则返回值为 nIndex

Remarks

nIndex 之后的所有项现在都下移一个位置。 例如,如果一个组合框包含两个项,则删除第一个项后,剩余的那个项将补到第一个位置。 nIndex=0 表示第一个位置的项。

Example

// Delete every item from the combo box.
for (int i = m_pComboBox->GetCount() - 1; i >= 0; i--)
{
   m_pComboBox->DeleteString(i);
}

CComboBox::Dir

将文件名或驱动器的列表添加到组合框的列表框中。

int Dir(
    UINT attr,
    LPCTSTR lpszWildCard);

Parameters

attr
可以是 enum 中所述的 CFile::GetStatus 值的任意组合,或以下值的任意组合:

  • DDL_READWRITE 可以从文件读取或写入文件。

  • DDL_READONLY 可以读取但不能写入文件。

  • DDL_HIDDEN 文件处于隐藏状态,不会显示在目录列表中。

  • DDL_SYSTEM 文件是一种系统文件。

  • DDL_DIRECTORY lpszWildCard 指定的名称指定一个目录。

  • DDL_ARCHIVE 文件已存档。

  • DDL_DRIVES 包括与 lpszWildCard 指定的名称匹配的所有驱动器。

  • DDL_EXCLUSIVE 独占标志。 如果设置了独占标志,则仅列出指定类型的文件。 否则,除了“普通”文件之外,还会列出指定类型的文件。

lpszWildCard
指向文件规范字符串。 该字符串可以包含通配符(例如,*.*)。

Return Value

如果返回值大于或等于 0,则它是添加到列表的最后一个文件名的从零开始的索引。 如果发生错误,返回值为 CB_ERR;如果没有足够的空间来存储新的字符串,则返回值为 CB_ERRSPACE

Remarks

Windows ComboBoxEx 控件不支持此函数。 有关此控件的详细信息,请参阅 Windows SDK 中的 ComboBoxEx 控件

Example

// Add all the files and directories in the windows directory.
TCHAR lpszWinPath[MAX_PATH], lpszOldPath[MAX_PATH];
VERIFY(0 < ::GetWindowsDirectory(lpszWinPath, MAX_PATH));

// Make the windows directory the current directory.
::GetCurrentDirectory(MAX_PATH, lpszOldPath);
::SetCurrentDirectory(lpszWinPath);

m_pComboBox->ResetContent();
m_pComboBox->Dir(DDL_READWRITE | DDL_DIRECTORY, _T("*.*"));

// Reset the current directory to its previous path.
::SetCurrentDirectory(lpszOldPath);

CComboBox::DrawItem

当所有者绘制组合框的可视方面发生变化时由框架调用。

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

Parameters

lpDrawItemStruct
指向 DRAWITEMSTRUCT 结构的指针,其中包含有关所需绘制类型的信息。

Remarks

itemAction 结构的 DRAWITEMSTRUCT 成员定义要执行的绘制操作。 有关此结构的说明,请参阅 CWnd::OnDrawItem

默认情况下,此成员函数不执行任何操作。 替代此成员函数以实现所有者绘制 CComboBox 对象的绘制。 在此成员函数终止之前,应用程序应还原为 lpDrawItemStruct 中提供的显示上下文选择的所有图形设备接口 (GDI) 对象。

Example

// CMyComboBox is my owner-drawn combo box derived from CComboBox. This
// example draws an item's text centered vertically and horizontally. The
// combo box control was created with the following code:
//   pmyComboBox->Create(
//      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
//      CBS_SORT|CBS_OWNERDRAWVARIABLE,
//      myRect, pParentWnd, 1);
//
void CMyComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
   ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX);
   LPCTSTR lpszText = (LPCTSTR)lpDrawItemStruct->itemData;
   ASSERT(lpszText != NULL);
   CDC dc;

   dc.Attach(lpDrawItemStruct->hDC);

   // Save these value to restore them when done drawing.
   COLORREF crOldTextColor = dc.GetTextColor();
   COLORREF crOldBkColor = dc.GetBkColor();

   // If this item is selected, set the background color
   // and the text color to appropriate values. Erase
   // the rect by filling it with the background color.
   if ((lpDrawItemStruct->itemAction & ODA_SELECT) &&
       (lpDrawItemStruct->itemState & ODS_SELECTED))
   {
      dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
      dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
      dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT));
   }
   else
   {
      dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
   }

   // Draw the text.
   dc.DrawText(
       lpszText,
       (int)_tcslen(lpszText),
       &lpDrawItemStruct->rcItem,
       DT_CENTER | DT_SINGLELINE | DT_VCENTER);

   // Reset the background color and the text color back to their
   // original values.
   dc.SetTextColor(crOldTextColor);
   dc.SetBkColor(crOldBkColor);

   dc.Detach();
}

CComboBox::FindString

在组合框的列表框中查找但不选择包含指定前缀的第一个字符串。

int FindString(
    int nStartAfter,
    LPCTSTR lpszString) const;

Parameters

nStartAfter
包含项的从零开始的索引,该项在要搜索的第一个项之前。 当搜索到达列表框底部时,它会从列表框顶部继续返回到 nStartAfter 指定的项。 如果为 -1,则从头开始搜索整个列表框。

lpszString
指向包含要搜索的前缀的以 null 结尾的字符串。 搜索不区分大小写,因此该字符串可以包含大写和小写字母的任意组合。

Return Value

如果返回值大于或等于 0,则它是匹配项的从零开始的索引。 如果搜索失败,则为 CB_ERR

Remarks

Windows ComboBoxEx 控件不支持此函数。 有关此控件的详细信息,请参阅 Windows SDK 中的 ComboBoxEx 控件

Example

// The string to match.
LPCTSTR lpszmyString = _T("item");

// Delete all items that begin with the specified string.
int nItem = 0;
while ((nItem = m_pComboBox->FindString(nItem, lpszmyString)) != CB_ERR)
{
   m_pComboBox->DeleteString(nItem);
}

CComboBox::FindStringExact

调用 FindStringExact 成员函数,查找(组合框中)与 lpszFind 中指定的字符串匹配的第一个列表框字符串。

int FindStringExact(
    int nIndexStart,
    LPCTSTR lpszFind) const;

Parameters

nIndexStart
指定项的从零开始的索引,该项在要搜索的第一个项之前。 当搜索到达列表框底部时,它会从列表框顶部继续返回到 nIndexStart 指定的项。 如果 nIndexStart 为 -1,则从头开始搜索整个列表框。

lpszFind
指向要搜索的以 null 结尾的字符串。 此字符串可以包含完整的文件名,包括扩展名。 搜索不区分大小写,因此该字符串可以包含大写和小写字母的任意组合。

Return Value

匹配项的从零开始的索引,如果搜索失败,则为 CB_ERR

Remarks

如果在创建组合框时使用了所有者绘制样式,但没有使用 CBS_HASSTRINGS 样式,FindStringExact 会尝试将双字值与 lpszFind 的值相匹配。

Example

// The string to match.
LPCTSTR lpszmyExactString = _T("item 5");

// Delete all items that exactly match the specified string.
int nDex = 0;
while ((nDex = m_pComboBox->FindStringExact(nDex, lpszmyExactString)) != CB_ERR)
{
   m_pComboBox->DeleteString(nDex);
}

CComboBox::GetComboBoxInfo

检索 CComboBox 对象的信息。

BOOL GetComboBoxInfo(PCOMBOBOXINFO pcbi) const;

Parameters

pcbi
指向 COMBOBOXINFO 结构的指针。

Return Value

成功时返回 TRUE,失败时返回 FALSE

Remarks

此成员函数模拟 CB_GETCOMBOBOXINFO 消息的功能,如 Windows SDK 中所述。

CComboBox::GetCount

调用此成员函数以检索组合框的列表框部分中的项数。

int GetCount() const;

Return Value

项数。 返回的计数比最后一项的索引值大 1(索引从零开始)。 如果出现错误,则为 CB_ERR

Example

// Add 10 items to the combo box.
CString strItem;
for (int i = 0; i < 10; i++)
{
   strItem.Format(_T("item %d"), i);
   m_pComboBox->AddString(strItem);
}

// Verify the 10 items were added to the combo box.
ASSERT(m_pComboBox->GetCount() == 10);

CComboBox::GetCueBanner

获取为组合框控件显示的提示文本。

CString GetCueBanner() const;

BOOL GetCueBanner(
    LPTSTR lpszText,
    int cchText) const;

Parameters

lpszText
[out] 指向接收提示横幅文本的缓冲区的指针。

cchText
[in] lpszText 参数指向的缓冲区的大小。

Return Value

在第一个重载中,如果存在提示横幅文本,则为包含该文本的 CString 对象;否则为长度为零的 CString 对象。

-or-

在第二个重载中,如果此方法成功,则为 TRUE;否则为 FALSE

Remarks

提示文本是组合框控件的输入区域中显示的提示。 提示文本在用户提供输入之前一直显示。

此方法将发送 CB_GETCUEBANNER 消息,如 Windows SDK 中所述。

CComboBox::GetCurSel

调用此成员函数以确定选择了组合框中的哪个项。

int GetCurSel() const;

Return Value

组合框的列表框中的当前选定项的从零开始的索引,如果未选择任何项,则为 CB_ERR

Remarks

GetCurSel 将索引返回到列表中。

Example

// Select the next item of the currently selected item
// in the combo box.
int nIndex = m_pComboBox->GetCurSel();
int nCount = m_pComboBox->GetCount();
if ((nIndex != CB_ERR) && (nCount > 1))
{
   if (++nIndex < nCount)
      m_pComboBox->SetCurSel(nIndex);
   else
      m_pComboBox->SetCurSel(0);
}

CComboBox::GetDroppedControlRect

调用 GetDroppedControlRect 成员函数,以检索下拉组合框的可见(已下拉)列表框的屏幕坐标。

void GetDroppedControlRect(LPRECT lprect) const;

Parameters

lprect
指向要接收坐标的 RECT 结构

Example

// This example move a combo box so that the upper left
// corner of the combo box is at a specific point.

// The point to move the combo box to.
CPoint myPoint(30, 10);

CRect r;

m_pComboBox->GetDroppedControlRect(&r);

m_pComboBox->GetParent()->ScreenToClient(&r);
r.OffsetRect(myPoint - r.TopLeft());
m_pComboBox->MoveWindow(&r);

CComboBox::GetDroppedState

调用 GetDroppedState 成员函数以确定下拉组合框的列表框是否可见(已下拉)。

BOOL GetDroppedState() const;

Return Value

如果列表框可见,则为非零值;否则为 0。

Example

// Show the dropdown list box if it is not already dropped.
if (!m_pComboBox->GetDroppedState())
   m_pComboBox->ShowDropDown(TRUE);

CComboBox::GetDroppedWidth

调用此函数以检索组合框的列表框的最小允许宽度(以像素为单位)。

int GetDroppedWidth() const;

Return Value

如果成功,则为允许的最小宽度(以像素为单位);否则为 CB_ERR

Remarks

此函数仅适用于具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框。

默认情况下,下拉列表框的最小允许宽度为 0。 可以通过调用 SetDroppedWidth 来设置最小允许宽度。 显示组合框的列表框部分时,其宽度大于最小允许宽度或组合框宽度。

Example

请参阅 SetDroppedWidth 的示例。

CComboBox::GetEditSel

获取组合框的编辑控件中当前所选内容的起始和结束字符位置。

DWORD GetEditSel() const;

Return Value

一个 32 位的值,该值包含低位字中的起始位置,以及在高位字中所选内容末尾之后的第一个未选定字符的位置。 如果在没有编辑控件的组合框上使用此函数,则返回 CB_ERR

Example

DWORD dwSel;

// Set the selection to be all characters after the current selection.
if ((dwSel = m_MyComboBox.GetEditSel()) != CB_ERR)
{
   m_MyComboBox.SetEditSel(HIWORD(dwSel), -1);
}

CComboBox::GetExtendedUI

调用 GetExtendedUI 成员函数以确定组合框是默认用户界面还是扩展用户界面。

BOOL GetExtendedUI() const;

Return Value

如果组合框具有扩展用户界面,则为非零值;否则为 0。

Remarks

可通过以下方式识别扩展用户界面:

  • 单击静态控件将仅显示具有 CBS_DROPDOWNLIST 样式的组合框的列表框。

  • 按向下箭头键将显示列表框(F4 已禁用)。

当项列表不可见时,将禁用静态控件中的滚动(箭头键已禁用)。

Example

// Use the extended UI if it is not already set.
if (!m_pComboBox->GetExtendedUI())
   m_pComboBox->SetExtendedUI(TRUE);

CComboBox::GetHorizontalExtent

从组合框中检索组合框的列表框部分可以水平滚动的宽度(以像素为单位)。

UINT GetHorizontalExtent() const;

Return Value

组合框的列表框部分可滚动的宽度(以像素为单位)。

Remarks

这仅适用于组合框的列表框部分具有水平滚动条的情况。

Example

// Find the longest string in the combo box.
CString strText;
CSize sz;
UINT dxText = 0;
CDC *pDCCombo = m_pComboBox->GetDC();
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->GetLBText(i, strText);
   sz = pDCCombo->GetTextExtent(strText);

   if (sz.cx > (LONG)dxText)
      dxText = sz.cx;
}
m_pComboBox->ReleaseDC(pDCCombo);

// Set the horizontal extent only if the current extent is not large enough.
if (m_pComboBox->GetHorizontalExtent() < dxText)
{
   m_pComboBox->SetHorizontalExtent(dxText);
   ASSERT(m_pComboBox->GetHorizontalExtent() == dxText);
}

CComboBox::GetItemData

检索与指定的组合框项关联的应用程序提供的 32 位值。

DWORD_PTR GetItemData(int nIndex) const;

Parameters

nIndex
包含组合框的列表框中项的从零开始的索引。

Return Value

与项关联的 32 位值,如果发生错误,则为 CB_ERR

Remarks

可以使用 dwItemData 成员函数调用的 SetItemData 参数设置该 32 位值。 GetItemDataPtr如果要检索的 32 位值是指针(void*)。

Example

// If any item's data is equal to zero then reset it to -1.
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   if (m_pComboBox->GetItemData(i) == 0)
   {
      m_pComboBox->SetItemData(i, (DWORD)-1);
   }
}

CComboBox::GetItemDataPtr

检索与指定组合框项关联的应用程序提供的 32 位值作为指针 (void*)。

void* GetItemDataPtr(int nIndex) const;

Parameters

nIndex
包含组合框的列表框中项的从零开始的索引。

Return Value

检索指针,如果发生错误,则为 -1。

Example

LPVOID lpmyPtr = m_pComboBox->GetItemDataPtr(5);

// Check all the items in the combo box; if an item's
// data pointer is equal to my pointer then reset it to NULL.
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   if (m_pComboBox->GetItemDataPtr(i) == lpmyPtr)
   {
      m_pComboBox->SetItemDataPtr(i, NULL);
   }
}

CComboBox::GetItemHeight

调用 GetItemHeight 成员函数以检索组合框中列表项的高度。

int GetItemHeight(int nIndex) const;

Parameters

nIndex
指定要检索其高度的组合框的组件。 如果 nIndex 参数为 -1,则检索组合框的编辑控件(或静态文本)部分的高度。 如果组合框具有 CBS_OWNERDRAWVARIABLE 样式,则 nIndex 指定要检索其高度的列表项的从零开始的索引。 否则,nIndex 应设置为 0。

Return Value

组合框中指定项的高度(以像素为单位)。 如果发生错误,则返回值为 CB_ERR

Example

// Set the height of every item so the item
// is completely visible.
CString strLBText;
CSize size;
CDC *pDC = m_pComboBox->GetDC();
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->GetLBText(i, strLBText);
   size = pDC->GetTextExtent(strLBText);

   // Only want to set the item height if the current height
   // is not big enough.
   if (m_pComboBox->GetItemHeight(i) < size.cy)
      m_pComboBox->SetItemHeight(i, size.cy);
}
m_pComboBox->ReleaseDC(pDC);

CComboBox::GetLBText

获取组合框的列表框中的字符串。

int GetLBText(
    int nIndex,
    LPTSTR lpszText) const;

void GetLBText(
    int nIndex,
    CString& rString) const;

Parameters

nIndex
包含要复制的列表框字符串的从零开始的索引。

lpszText
指向要接收字符串的缓冲区。 缓冲区必须有足够的空间来存储字符串和终止空字符。

rString
CString 的引用。

Return Value

字符串的长度(以字节为单位),不包括终止空字符。 如果 nIndex 未指定有效索引,则返回值为 CB_ERR

Remarks

此成员函数的第二种形式用项文本填充 CString 对象。
如果 nIndex 无效,此函数将引发 E_INVALIDARG 异常(错误代码:-21470248090x80070057)。

Example

// Dump all of the items in the combo box.
CString str1, str2;
int n;
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   n = m_pComboBox->GetLBTextLen(i);
   m_pComboBox->GetLBText(i, str1.GetBuffer(n));
   str1.ReleaseBuffer();

   str2.Format(_T("item %d: %s\r\n"), i, str1.GetBuffer(0));
   AFXDUMP(str2);
}

CComboBox::GetLBTextLen

获取组合框的列表框中字符串的长度。

int GetLBTextLen(int nIndex) const;

Parameters

nIndex
包含列表框字符串的从零开始的索引。

Return Value

字符串的长度(以字节为单位),不包括终止空字符。 如果 nIndex 未指定有效索引,则返回值为 CB_ERR

Example

请参阅 CComboBox::GetLBText 的示例。

CComboBox::GetLocale

检索组合框使用的区域设置。

LCID GetLocale() const;

Return Value

组合框中字符串的区域设置标识符 (LCID) 值。

Remarks

例如,使用区域设置来确定排序组合框中字符串的排序顺序。

Example

请参阅 CComboBox::SetLocale 的示例。

CComboBox::GetMinVisible

获取当前组合框控件的下拉列表中可见项的最小数目。

int GetMinVisible() const;

Return Value

当前下拉列表中可见项的最小数目。

Remarks

此方法将发送 CB_GETMINVISIBLE 消息,如 Windows SDK 中所述。

CComboBox::GetTopIndex

检索组合框的列表框部分中第一个可见项的从零开始的索引。

int GetTopIndex() const;

Return Value

如果成功,则为组合框的列表框部分中第一个可见项的从零开始的索引,否则为 CB_ERR

Remarks

最初,项 0 位于列表框的顶部,但如果滚动列表框,则另一项可能位于顶部。

Example

// Want an item in the bottom half to be the first visible item.
int nTop = m_pComboBox->GetCount() / 2;
if (m_pComboBox->GetTopIndex() < nTop)
{
   m_pComboBox->SetTopIndex(nTop);
   ASSERT(m_pComboBox->GetTopIndex() == nTop);
}

CComboBox::InitStorage

分配用于在组合框的列表框部分存储列表框项的内存。

int InitStorage(
    int nItems,
    UINT nBytes);

Parameters

nItems
指定要添加的项数。

nBytes
指定为项字符串分配的内存量(以字节为单位)。

Return Value

如果成功,则为需要重新分配内存之前组合框的列表框部分可以存储的最大项数,否则为 CB_ERRSPACE,表示没有足够的内存可用。

Remarks

在向 CComboBox 的列表框部分添加大量项之前调用此函数。

仅限 Windows 95/98:wParam 参数限制为 16 位值。 这意味着列表框不能包含超过 32,767 个项。 尽管项数受到限制,但列表框中项的总大小仅受可用内存的限制。

此函数有助于加快具有大量项(超过 100 个)的列表框的初始化。 它会预先分配指定的内存量,以便后续的 AddStringInsertStringDir 函数花费尽可能短的时间。 可以为该参数使用估计值。 如果你估计过高,就会分配一些额外的内存;如果低估,则正常分配将用于超过预分配金额的项。

Example

// Initialize the storage of the combo box to be 256 strings with
// about 10 characters per string, performance improvement.
int nAlloc = pmyComboBox->InitStorage(256, 10);
ASSERT(nAlloc != CB_ERRSPACE);

// Add 256 items to the combo box.
CString strAdd;
for (int i = 0; i < 256; i++)
{
   strAdd.Format(_T("item string %d"), i);
   m_pComboBox->AddString(strAdd);
}

CComboBox::InsertString

将字符串插入组合框的列表框。

int InsertString(
    int nIndex,
    LPCTSTR lpszString);

Parameters

nIndex
包含一个索引(该索引从零开始),该索引指向列表框中将接收字符串的位置。 如果此参数为 -1,则字符串将被添加到列表末尾。

lpszString
指向要插入的以 null 结尾的字符串。

Return Value

插入该字符串的位置的索引(索引从零开始)。 如果发生错误,则返回值为 CB_ERR。 如果没有足够的空间来存储新的字符串,则返回值为 CB_ERRSPACE

Remarks

AddString 成员函数不同,InsertString 成员函数不会使具有 CBS_SORT 样式的列表被排序。

Note

Windows ComboBoxEx 控件不支持此函数。 有关此控件的详细信息,请参阅 Windows SDK 中的 ComboBoxEx 控件

Example

// Insert items in between existing items.
CString strIns;
int nItems = m_pComboBox->GetCount();
for (int i = 0; i < nItems; i++)
{
   strIns.Format(_T("item string %c"), (char)('A' + i));
   m_pComboBox->InsertString(2 * i, strIns);
}

CComboBox::LimitText

限制用户可以在组合框的编辑控件中输入的文本长度(以字节为单位)。

BOOL LimitText(int nMaxChars);

Parameters

nMaxChars
指定用户可以输入的文本的长度(以字节为单位)。 如果此参数为 0,则文本长度设置为 65,535 字节。

Return Value

如果成功,则返回非零。 如果为具有样式 CBS_DROPDOWNLIST 的组合框或为没有编辑控件的组合框调用,则返回值为 CB_ERR

Remarks

如果组合框没有样式 CBS_AUTOHSCROLL,则将文本限制设置为大于编辑控件的大小将没有效果。

LimitText 仅限制用户可以输入的文本。 当发送消息时,它不会影响编辑控件中已包含的任何文本,也不会影响在选择列表框中的字符串时复制到编辑控件的文本的长度。

Example

// Limit the number of characters in the combo box's edit control to
// be the maximum number visible.

// Get the text metrics for the combo box; needed for the
// average character width.
TEXTMETRIC tm;
CDC *pDCCB = m_pComboBox->GetDC();
pDCCB->GetTextMetrics(&tm);
m_pComboBox->ReleaseDC(pDCCB);

CRect rect;
m_pComboBox->GetClientRect(&rect);

m_pComboBox->LimitText(rect.Width() / tm.tmAveCharWidth);

CComboBox::MeasureItem

在创建具有所有者绘制样式的组合框时由框架调用。

virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

Parameters

lpMeasureItemStruct
指向 MEASUREITEMSTRUCT 结构的长指针。

Remarks

默认情况下,此成员函数不执行任何操作。 替代此成员函数并填充 MEASUREITEMSTRUCT 结构,向 Windows 告知组合框中列表框的尺寸。 如果组合框是使用 CBS_OWNERDRAWVARIABLE 样式创建的,框架会为列表框中的每个项调用此成员函数。 否则,此成员函数仅调用一次。

在使用 CBS_OWNERDRAWFIXEDSubclassDlgItem 成员函数创建的所有者绘制组合框中使用 CWnd 样式涉及进一步的编程注意事项。 请参阅技术说明 14 中的讨论。

请参阅 CWnd::OnMeasureItem 查看有关 MEASUREITEMSTRUCT 结构的说明。

Example

// CMyComboBox is my owner-drawn combo box derived from CComboBox. This
// example measures an item and sets the height of the item to twice the
// vertical extent of its text. The combo box control was created with
// the following code:
//   pmyComboBox->Create(
//      WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
//      CBS_SORT|CBS_OWNERDRAWVARIABLE,
//      myRect, pParentWnd, 1);
//
void CMyComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
   ASSERT(lpMeasureItemStruct->CtlType == ODT_COMBOBOX);

   if (lpMeasureItemStruct->itemID != (UINT)-1)
   {
      LPCTSTR lpszText = (LPCTSTR)lpMeasureItemStruct->itemData;
      ASSERT(lpszText != NULL);
      CSize sz;
      CDC *pDC = GetDC();

      sz = pDC->GetTextExtent(lpszText);

      ReleaseDC(pDC);

      lpMeasureItemStruct->itemHeight = 2 * sz.cy;
   }
}

CComboBox::Paste

将数据从剪贴板插入到组合框的编辑控件中的当前光标位置。

void Paste();

Remarks

仅当剪贴板包含 CF_TEXT 格式的数据时,才会插入数据。

Example

// Replace all of the text in the combo box's edit control with the text
// in the clipboard.
m_MyComboBox.SetEditSel(0, -1);
m_MyComboBox.Paste();

CComboBox::ResetContent

从列表框中移除所有项,并在组合框中编辑控件。

void ResetContent();

Example

// Delete all the items from the combo box.
m_pComboBox->ResetContent();
ASSERT(m_pComboBox->GetCount() == 0);

CComboBox::SelectString

在组合框的列表框中搜索字符串,如果找到该字符串,在列表框中选择字符串,并将其复制到编辑控件。

int SelectString(
    int nStartAfter,
    LPCTSTR lpszString);

Parameters

nStartAfter
包含项的从零开始的索引,该项在要搜索的第一个项之前。 当搜索到达列表框底部时,它会从列表框顶部继续返回到 nStartAfter 指定的项。 如果为 -1,则从头开始搜索整个列表框。

lpszString
指向包含要搜索的前缀的以 null 结尾的字符串。 搜索不区分大小写,因此该字符串可以包含大写和小写字母的任意组合。

Return Value

如果找到字符串,则为所选项的从零开始的索引。 如果搜索失败,则返回值为 CB_ERR 且当前所选内容不会更改。

Remarks

仅当初始字符(从起点)与前缀字符串中的字符匹配时,才会选择该字符串。

请注意,SelectStringFindString 成员函数都会查找字符串,但 SelectString 成员函数还会选择字符串。

Example

// The string to match.
LPCTSTR lpszSelect = _T("item");

// Select the item that begins with the specified string.
int nSel = m_pComboBox->SelectString(0, lpszSelect);
ASSERT(nSel != CB_ERR);

CComboBox::SetCueBanner

设置为组合框控件显示的提示文本。

BOOL SetCueBanner(LPCTSTR lpszText);

Parameters

lpszText
[in] 指向包含提示文本的 null 终止缓冲区的指针。

Return Value

如果此方法成功,则为 TRUE;否则为 FALSE

Remarks

提示文本是组合框控件的输入区域中显示的提示。 提示文本在用户提供输入之前一直显示。

此方法将发送 CB_SETCUEBANNER 消息,如 Windows SDK 中所述。

Example

第一个代码示例定义变量 m_combobox,该变量用于以编程方式访问组合框控件。 此变量将在下一个示例中使用。

// Variable to access the combo box control
CComboBox m_combobox;

下一个代码示例设置组合框控件的提示横幅。

// Add extra initialization here.

// Add 20 items to the combo box. The Resource Editor
// has already been used to set the style of the combo
// box to CBS_SORT.
CString str;
for (int i = 1; i <= 20; i++)
{
    str.Format(_T("Item %2d"), i);
    m_combobox.AddString(str);
}
// Set the minimum visible item
m_combobox.SetMinVisibleItems(10);
// Set the cue banner
m_combobox.SetCueBanner(_T("Select an item..."));

// End of extra initialization.

CComboBox::SetCurSel

在组合框的列表框中选择字符串。

int SetCurSel(int nSelect);

Parameters

nSelect
指定要选择的字符串的从零开始的索引。 如果为 -1,则移除列表框中的任何当前选定内容,并且清除编辑控件。

Return Value

如果消息成功,则为所选项的从零开始的索引。 如果 CB_ERR 大于列表中的项数,则返回值为 nSelect,或者,如果 nSelect 设置为 -1,则清除所选内容。

Remarks

如有必要,列表框会将字符串滚动到视图中(如果列表框可见)。 组合框的编辑控件中的文本已更改,以反映新的选择。 列表框中任何以前的所选内容将被移除。

Example

// Select the last item in the combo box.
int nLast = pmyComboBox->GetCount() - 1;
if (nLast >= 0)
   m_pComboBox->SetCurSel(nLast);

CComboBox::SetDroppedWidth

调用此函数以设置组合框的列表框的最小允许宽度(以像素为单位)。

int SetDroppedWidth(UINT nWidth);

Parameters

nWidth
组合框的列表框部分的最小允许宽度(以像素为单位)。

Return Value

如果成功,则为列表框的新宽度,否则为 CB_ERR

Remarks

此函数仅适用于具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框。

默认情况下,下拉列表框的最小允许宽度为 0。 显示组合框的列表框部分时,其宽度大于最小允许宽度或组合框宽度。

Example

// Find the longest string in the combo box.
CString str;
CSize sz;
int dx = 0;
TEXTMETRIC tm;
CDC *pDC = m_pComboBox->GetDC();
CFont *pFont = m_pComboBox->GetFont();

// Select the listbox font, save the old font
CFont *pOldFont = pDC->SelectObject(pFont);
// Get the text metrics for avg char width
pDC->GetTextMetrics(&tm);

for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->GetLBText(i, str);
   sz = pDC->GetTextExtent(str);

   // Add the avg width to prevent clipping
   sz.cx += tm.tmAveCharWidth;

   if (sz.cx > dx)
      dx = sz.cx;
}
// Select the old font back into the DC
pDC->SelectObject(pOldFont);
m_pComboBox->ReleaseDC(pDC);

// Adjust the width for the vertical scroll bar and the left and right border.
dx += ::GetSystemMetrics(SM_CXVSCROLL) + 2 * ::GetSystemMetrics(SM_CXEDGE);

// Set the width of the list box so that every item is completely visible.
m_pComboBox->SetDroppedWidth(dx);

CComboBox::SetEditSel

在组合框的编辑控件中选择字符。

BOOL SetEditSel(
    int nStartChar,
    int nEndChar);

Parameters

nStartChar
指定起始位置。 如果起始位置设置为 -1,则移除任何现有选定内容。

nEndChar
指定结束位置。 如果结束位置设置为 -1,则选择编辑控件中起始位置到最后一个字符的所有文本。

Return Value

如果该成员函数成功,则为非零值;否则为 0。 如果 CB_ERR 具有 CComboBox 样式或者没有列表框,则为 CBS_DROPDOWNLIST

Remarks

位置是从零开始的。 若要选择编辑控件的第一个字符,需要指定起始位置 0。 结束位置是要选择的最后一个字符之后的字符。 例如,若要选择编辑控件的前四个字符,将使用起始位置 0 和结束位置 4。

Note

Windows ComboBoxEx 控件不支持此函数。 有关此控件的详细信息,请参阅 Windows SDK 中的 ComboBoxEx 控件

Example

请参阅 CComboBox::GetEditSel 的示例。

CComboBox::SetExtendedUI

调用 SetExtendedUI 成员函数,为具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框选择默认用户界面或扩展用户界面。

int SetExtendedUI(BOOL bExtended = TRUE);

Parameters

bExtended
指定组合框是应使用扩展用户界面还是默认用户界面。 如果值为 TRUE,将选择扩展用户界面,如果值为 FALSE,将选择标准用户界面。

Return Value

如果操作成功,则为 CB_OKAY,如果发生错误,则为 CB_ERR

Remarks

可通过以下方式识别扩展用户界面:

  • 单击静态控件将仅显示具有 CBS_DROPDOWNLIST 样式的组合框的列表框。

  • 按向下箭头键将显示列表框(F4 已禁用)。

当项列表不可见时,将禁用静态控件中的滚动(箭头键已禁用)。

Example

请参阅 CComboBox::GetExtendedUI 的示例。

CComboBox::SetHorizontalExtent

设置组合框的列表框部分可以水平滚动的宽度(以像素为单位)。

void SetHorizontalExtent(UINT nExtent);

Parameters

nExtent
指定组合框的列表框部分可以水平滚动的像素数。

Remarks

如果列表框的宽度小于此值,水平滚动条将水平滚动列表框中的项。 如果列表框的宽度等于或大于此值,则隐藏水平滚动条,如果组合框具有 CBS_DISABLENOSCROLL 样式,则禁用。

Example

// Find the longest string in the combo box.
CString str;
CSize sz;
int dx = 0;
TEXTMETRIC tm;
CDC *pDC = m_pComboBox->GetDC();
CFont *pFont = m_pComboBox->GetFont();

// Select the listbox font, save the old font
CFont *pOldFont = pDC->SelectObject(pFont);
// Get the text metrics for avg char width
pDC->GetTextMetrics(&tm);

for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->GetLBText(i, str);
   sz = pDC->GetTextExtent(str);

   // Add the avg width to prevent clipping
   sz.cx += tm.tmAveCharWidth;

   if (sz.cx > dx)
      dx = sz.cx;
}
// Select the old font back into the DC
pDC->SelectObject(pOldFont);
m_pComboBox->ReleaseDC(pDC);

// Set the horizontal extent so every character of all strings can
// be scrolled to.
m_pComboBox->SetHorizontalExtent(dx);

CComboBox::SetItemData

设置与组合框中的指定项关联的 32 位值。

int SetItemData(
    int nIndex,
    DWORD_PTR dwItemData);

Parameters

nIndex
包含要设置的项的从零开始的索引。

dwItemData
包含要与项关联的新值。

Return Value

如果出现错误,则为 CB_ERR

Remarks

如果 32 位项为指针,请使用 SetItemDataPtr 成员函数。

Example

// Set the data of each item to be equal to its index.
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->SetItemData(i, i);
}

CComboBox::SetItemDataPtr

将组合框中与指定项关联的 32 位值设置为指定的指针 (void*)。

int SetItemDataPtr(
    int nIndex,
    void* pData);

Parameters

nIndex
包含对项的从零开始的索引。

pData
包含要与项关联的指针。

Return Value

如果出现错误,则为 CB_ERR

Remarks

此指针在组合框的生命周期内始终有效,即使项在组合框中的相对位置可能会随着项的添加或删除而改变。 因此,框内项的索引可能会更改,但指针仍然可靠。

Example

// Set the data pointer of each item to be NULL.
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->SetItemDataPtr(i, NULL);
}

CComboBox::SetItemHeight

调用 SetItemHeight 成员函数,以设置组合框中列表项的高度,或组合框的编辑控件(或静态文本)部分的高度。

int SetItemHeight(
    int nIndex,
    UINT cyItemHeight);

Parameters

nIndex
指定是否设置列表项的高度或组合框的编辑控件(或静态文本)部分的高度。

如果组合框具有 CBS_OWNERDRAWVARIABLE 样式,则 nIndex 指定要设置其高度的列表项的从零开始的索引;否则,nIndex 必须为 0,并将设置所有列表项的高度。

如果 nIndex 为 -1,则设置组合框的编辑控件或静态文本部分的高度。

cyItemHeight
指定由 nIndex 标识的组合框组件的高度(以像素为单位)。

Return Value

如果索引或高度无效,则为 CB_ERR,否则为 0。

Remarks

组合框的编辑控件(或静态文本)部分的高度是独立于列表项的高度来设置的。 应用程序必须确保编辑控件(或静态文本)部分的高度不小于特定列表框项的高度。

Example

// Set the height of every item to be the
// vertical size of the item's text extent.
CString str;
CSize sz;
CDC *pDC = m_pComboBox->GetDC();
for (int i = 0; i < m_pComboBox->GetCount(); i++)
{
   m_pComboBox->GetLBText(i, str);
   sz = pDC->GetTextExtent(str);

   m_pComboBox->SetItemHeight(i, sz.cy);
}
m_pComboBox->ReleaseDC(pDC);

CComboBox::SetLocale

设置此组合框的区域设置标识符。

LCID SetLocale(LCID nNewLocale);

Parameters

nNewLocale
要为组合框设置的新区域设置标识符 (LCID) 值。

Return Value

此组合框以前的区域设置标识符 (LCID) 值。

Remarks

如果未调用 SetLocale,则从系统获取默认区域设置。 可以使用控制面板的区域(或国际)应用程序修改此系统默认区域设置。

Example

// My LCID to use.
LCID mylcid = MAKELCID(MAKELANGID(LANG_SPANISH, SUBLANG_SPANISH_MEXICAN),
                       SORT_DEFAULT);

// Force the list box to use my locale.
m_pComboBox->SetLocale(mylcid);
ASSERT(m_pComboBox->GetLocale() == mylcid);

CComboBox::SetMinVisibleItems

设置当前组合框控件的下拉列表中可见项的最小数目。

BOOL SetMinVisibleItems(int iMinVisible);

Parameters

iMinVisible
[in] 指定可见项的最小数目。

Return Value

如果此方法成功,则为 TRUE;否则为 FALSE

Remarks

此方法将发送 CB_SETMINVISIBLE 消息,如 Windows SDK 中所述。

Example

第一个代码示例定义变量 m_combobox,该变量用于以编程方式访问组合框控件。 此变量将在下一个示例中使用。

// Variable to access the combo box control
CComboBox m_combobox;

下一个代码示例将 20 个项插入组合框控件的下拉列表中。 然后,它指定当用户按下下拉箭头时,至少会显示 10 个项。

// Add extra initialization here.

// Add 20 items to the combo box. The Resource Editor
// has already been used to set the style of the combo
// box to CBS_SORT.
CString str;
for (int i = 1; i <= 20; i++)
{
    str.Format(_T("Item %2d"), i);
    m_combobox.AddString(str);
}
// Set the minimum visible item
m_combobox.SetMinVisibleItems(10);
// Set the cue banner
m_combobox.SetCueBanner(_T("Select an item..."));

// End of extra initialization.

CComboBox::SetTopIndex

确保特定项在组合框的列表框部分可见。

int SetTopIndex(int nIndex);

Parameters

nIndex
指定列表框项的从零开始的索引。

Return Value

如果成功,则为零,如果发生错误,则为 CB_ERR

Remarks

系统滚动列表框,直到 nIndex 指定的项显示在列表框顶部或达到最大滚动范围。

Example

// Set the first visible item in the combo box to be the middle item
m_pComboBox->SetTopIndex(m_pComboBox->GetCount() / 2);

CComboBox::ShowDropDown

显示或隐藏具有 CBS_DROPDOWNCBS_DROPDOWNLIST 样式的组合框的列表框。

void ShowDropDown(BOOL bShowIt = TRUE);

Parameters

bShowIt
指定是显示还是隐藏下拉列表框。 如果值为 TRUE,则显示列表框。 如果值为 FALSE,则隐藏列表框。

Remarks

默认情况下,具有此样式的组合框将显示列表框。

此成员函数对使用 CBS_SIMPLE 样式创建的组合框不起作用。

Example

请参阅 CComboBox::GetDroppedState 的示例。

See also

MFC 示例 CTRLBARS
CWnd
Hierarchy Chart
CWnd
CButton
CEdit
CListBox
CScrollBar
CStatic
CDialog