复选框的下拉列表
Excel制作下拉表框的4种方法

制作下拉表框有两种方法:一是使用数占有效性设置下拉列表框,其制作方法有两种。
二是使用开发工具中的窗体控件制作下拉列表框,其制作方法也有两种。
为了能使介绍了如指掌,这里所有采纳图片加文字说明介绍自己常用的四种制作方法。
考虑到制作一个页面过长,故分为两个页面。
一、使用数占有效性设置简单的下拉列表框假设我们要下表中设置“男 /女”复选其操作程序以下:在 Excel 工作表中,将鼠标放在需设置列表内容的单元格(上表性别下),选择工具栏中的数据 / 数据的有效性,出现以下对话框:按此设置,点确立即可。
鼠标走开此单元格无任何异样显示,如鼠标搁置在已设置列表的单元格上,就会出现一个下拉箭头,以下列图:鼠标对着下拉箭头,就会出现下拉菜单——男女选择男女,鼠标走开单元格,箭头消逝。
采纳向下拖的迅速复制方法,即可将所设置的格式拖到所需的地点,而后再挨次选择即可。
二、使用数占有效性设置调取数据库式数据的下拉列表框原用文字介绍制作下拉表框的方法:成立下拉列表框1 、视图 / 工具栏 / 窗体,选中组合框,鼠标变成十字形;2、在工作表上点击,出现组合框;3、右击复选框,点设置控件格式,弹出对话框;4、点控制选项卡,设置【数据源地区】为$A$ 4:$ A$ 10,5、设置单元格链接为“$ G$4”(下拉框地点),也能够鼠标点击选择此单元格;6、确立;7、点击下拉框, G4单元格即可显示相应的编号。
定制控制1、复制第四行数据字段到A122、在 A13单元格中输入 "=INDIRECT(ADDRESS(INDIRECT("G4")+4,COLUMN(A5)))"3、在 B13单元格中输入 "=INDIRECT(ADDRESS(INDIRECT("G4")+4,COLUMN(B5)))"4、采纳复制公式的方法将1月的公式复制到 4月;5、选择下拉列表框中的名单,即可显示相应数据。
HTML下拉框、文本框、复选框

<fieldset><legend>区域 1</legend><p class="sidebtn"></p><div id="isOpened" style="display:none"><table><tr><td align="center"><span>叠加字符:</span></td><td colspan="3" align="left"><input id="s1_text1" type="text" size="52"/></td><td align="center"><span> 字体大小:</span></td><td align="left"><input id="s1_text1_size" type="text" size="1"/></td></tr><tr><td align="center"><span>区域宽度:</span></td><td align="left"><input id="s1_text1_width" type="text"/></td><td align="center"><span> 区域高度:</span></td><td align="left"><input id="s1_text1_high" type="text" size="8"/></td><td><span> 粗 体:</span></td><td><select id="s1_text1_bold"><option value="0" selected="">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option></select></td></tr><tr><td><span>显示位置:</span></td><td align="center"><span>X</span><input id="s1_text1_startx" type="text" size="3"/><span>Y</span><input id="s1_text1_starty" type="text" size="3"/></td><td><span> 旋转方向:</span></td><td><select id="s1_text1_rotate"><option value="0" selected="">0</option><option value="90">90</option><option value="180">180</option><option value="270">270</option></select></td><td><span> 斜 体:</span></td> <td><select id="s1_text1_italic"><option value="0" selected="">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option></select></td></tr><tr><td><span>显示方式:</span></td><td><select id="s1_text1_type"><option value="0" selected="">字符</option><option value="1">时间</option></select></td><td><span> 颜 色:</span></td> <td><select id="s1_text1_color"><option selected="" value="0">Black</option><option value="1">Red</option><option value="2">Blue</option><option value="3">Green</option><option value="4">Yellow</option><option value="5">Magenta</option><option value="6">Cyan</option><option value="7">White</option></select></td><td><span> 边框宽度:</span></td><td><select id="s1_text1_outline"><option value="0" selected="">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select></td></tr><tr></tr></table><input type="button" id="stream1" value="保存" onclick = "Judge1()"/> <input type="button" id="clean" value="清除" onclick = "clean1()"/> </div></fieldset>。
word表格怎么制作下拉列表可以选择

word表格怎么制作下拉列表可以选择我们使用word中的表格时,有些内容要选填的,这时候就需要用到下拉列表了。
以下是店铺为您带来的关于在Word表格中添加下拉列表,希望对您有所帮助。
在Word表格中添加下拉列表例如制作一份明细表,在这个表格中,部门、职称、学历和级别等几项内容是需要重复输入的,我们利用Word提供的下拉型窗体域即可轻松实现表格内容的选择录入(如图1)。
具体设置步骤如下:(1)首先在Word中根据需要设计好表格,将固定不变的内容输入到表格中。
(2)将鼠标移到指定位置(例如“职称”下面的单元格),单击“视图→工具栏→窗体”命令,弹出“窗体”工具栏,单击“下拉型窗体域”按钮。
小提示:单元格中插入窗体域后,会显示出灰色底纹,在按下“窗体域底纹”按钮时会显示阴影。
该窗体域底纹只在屏幕上显示,用于提醒用户该域的具体位置,这些效果并不会被打印出来。
(3)双击单元格中的窗体域底纹,弹出“下拉型窗体域选项”对话框。
在“下拉项”文本框内输入需要添加的第一个列表项,并单击“添加”按钮进行添加。
依法输入其余列表项,待所有列表项添加完毕后,可以通过“↑、↓”方向按钮改变列表项的排列顺序。
(4)勾选“启用下拉列表”复选框(如图2),单击“确定”按钮,完成一个单元格的下拉型窗体域的设置。
小技巧:可将其余使用同样窗体域的单元格全部选中,然后通过复制、粘贴的方法一次性插入。
(5)在所有下拉型窗体域完成插入之后,单击“窗体”工具栏上的锁状“保护窗体”按钮(这样除了含有窗体域的单元格外,表格的其它地方都无法进行修改),在需要录入同一内容的任一窗体域单元格上单击鼠标,单击其右侧出现的下拉三角图标,从弹出下拉列表中选择需要录入的内容。
全部选择好后,再次单击“保护窗体”按钮解除锁定。
EXCEL中控件工具箱使用

EXCEL中控件工具箱使用Excel中控件工具箱是一种非常实用的功能,可以帮助用户更方便地在电子表格中插入各种交互式控件,如按钮、复选框、下拉列表等。
下面将详细介绍Excel中控件工具箱的使用。
首先,我们需要打开控件工具箱。
在Excel的菜单栏中选择“开发工具”选项,然后点击“插入”按钮下的“控件”工具箱图标,就可以打开控件工具箱。
在控件工具箱中,可以看到有许多不同的控件可供选择。
常用的控件包括按钮、复选框、单选按钮、下拉列表、文本框等。
选择相应的控件后,可以直接在电子表格中插入并调整其大小和位置。
复选框控件可以用于创建选择框。
它们可以被选中或取消选中,所以非常适合用于记录是否选择一些选项的状态。
通过双击复选框进入其属性窗口,可以自定义复选框的选中和取消时的操作。
单选按钮控件常用于创建选择组。
可以将多个单选按钮放置在一起,并且它们只能选择一个。
通过双击单选按钮进入其属性窗口,可以设置选项的名称、值等。
下拉列表控件可以帮助用户从预定义的列表中选择一个值。
双击下拉列表控件进入其属性窗口,在“值”选项卡中输入预定义的选项,并在“输入范围”选项卡中选择需要填充数据的单元格区域。
文本框控件用于在表格中显示文本内容。
可以在文本框中输入任何文本,也可以在属性窗口中设置文本框的样式、大小和位置。
控件工具箱还包括其他一些控件,如滚动条、组合框、图像等,可以根据需求进行选择和使用。
需要注意的是,控件工具箱中的控件并不是实际的单元格,所以它们的值不能直接参与计算。
如果需要基于控件的值进行计算,可以使用VBA 编写宏代码来实现。
总结来说,Excel中控件工具箱提供了丰富的交互式控件,可以帮助用户更方便地创建具有交互功能的电子表格。
通过选择合适的控件,并对其进行相应的属性设置,可以实现按键操作、数据选择等功能,极大地提高了工作效率。
同时,结合VBA编程,还可以进一步扩展和定制控件的功能。
使用控件工具箱需要一些基本的操作技巧和一定的编程知识,但是掌握这些技能后,将能够更加灵活和高效地使用Excel。
VB常用控件的属性及功能

VB常用控件的属性及功能Visual Basic (VB)是一个常用的编程语言,用于开发Windows应用程序。
在VB中,有许多常用的控件,每个控件都有一些常见的属性和功能。
下面是一些常用控件的属性和功能的概览:2. TextBox(文本框)控件:- Text属性:设置或获取文本框的文本内容。
- Multiline属性:设置或获取文本框是否为多行文本框。
- PasswordChar属性:设置或获取用于掩盖密码的字符。
- ReadOnly属性:设置或获取文本框是否为只读。
- KeyPress事件:在用户按下键盘键时触发的事件。
- TextChanged事件:当文本框的文本内容改变时触发的事件。
3. Button(按钮)控件:- Text属性:设置或获取按钮显示的文本。
- BackColor属性:设置或获取按钮的背景色。
- Enabled属性:设置或获取按钮是否启用。
- Click事件:在用户单击按钮时触发的事件。
- MouseHover事件:当鼠标悬停在按钮上方时触发的事件。
- Items属性:获取或添加组合框中的列表项。
- SelectedIndex属性:获取或设置组合框中选定项的索引。
- DropDownStyle属性:设置或获取组合框的下拉列表样式。
- SelectedIndexChanged事件:当组合框的选中项改变时触发的事件。
- DropDown事件:当组合框展开下拉列表时触发的事件。
5. CheckBox(复选框)控件:- Checked属性:获取或设置复选框的选中状态。
- Text属性:设置或获取复选框显示的文本。
- CheckedChanged事件:当复选框的选中状态改变时触发的事件。
6. RadioButton(单选按钮)控件:- Checked属性:获取或设置单选按钮的选中状态。
- GroupName属性:指定单选按钮所属的组名。
- AutoCheck属性:指定单选按钮是否自动变为选中状态。
PyQt5基本控件使用详解:单选按钮、复选框、下拉框

PyQt5基本控件使⽤详解:单选按钮、复选框、下拉框本⽂主要介绍PyQt5界⾯最基本使⽤的单选按钮、复选框、下拉框三种控件的使⽤⽅法进⾏介绍。
1、RadioButton单选按钮/CheckBox复选框。
需要知道如何判断单选按钮是否被选中。
2、ComboBox下拉框。
需要知道如何对下拉框中的取值进⾏设置以及代码实现中如何获取⽤户选中的值。
带着这些问题下⾯开始介绍这 RadioButton单选按钮、CheckBox复选框、 ComboBox下拉框三种基本控件的使⽤⽅法QRadioButton单选按钮单选按钮为⽤户提供多选⼀的选择,是⼀种开关按钮。
QRadioButton单选按钮是否选择状态通过isChecked()⽅法判断。
isChecked()⽅法返回值True表⽰选中,False表⽰未选中。
RadioButton⽰例完整代码如下:# -*- coding: utf-8 -*-import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QRadioButtonclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(309, 126)self.radioButton = QtWidgets.QRadioButton(Form)self.radioButton.setGeometry(QtCore.QRect(70, 40, 89, 16))self.radioButton.setObjectName("radioButton")self.okButton = QtWidgets.QPushButton(Form)self.okButton.setGeometry(QtCore.QRect(70, 70, 75, 23))self.okButton.setObjectName("okButton")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "RadioButton单选按钮例⼦"))self.radioButton.setText(_translate("Form", "单选按钮"))self.okButton.setText(_translate("Form", "确定"))class MyMainForm(QMainWindow, Ui_Form):def __init__(self, parent=None):super(MyMainForm, self).__init__(parent)self.setupUi(self)self.okButton.clicked.connect(self.checkRadioButton)def checkRadioButton(self):if self.radioButton.isChecked():rmation(self,"消息框标题","我RadioButton按钮被选中啦!",QMessageBox.Yes | QMessageBox.No)if __name__ == "__main__":app = QApplication(sys.argv)myWin = MyMainForm()myWin.show()sys.exit(app.exec_())运⾏结果如下:关键代码介绍:self.radioButton.isChecked() --> ⽤于判断RadioButton控件是否被选中。
visio复选框二级下拉组合框

visio复选框二级下拉组合框
Visio是一种流程图和绘图软件,用于创建各种类型的图表和图形。
在Visio中,复选框和下拉组合框是常用的控件,用于收集用户输入或进行选项选择。
复选框是一种图形控件,通常用于表示二进制选择。
它由一个方框和一个标签组成。
当复选框被选中时,方框内会显示一个勾选标记,表示该选项被选择了。
用户可以通过点击复选框来切换其选中状态。
二级下拉组合框是一种组合控件,通常用于提供层次结构选项的选择。
它由一个文本框和一个下拉箭头按钮组成。
点击下拉箭头按钮会显示一个下拉列表,包含一级选项。
选择一级选项后,二级下拉组合框会动态展示与一级选项相关的二级选项。
用户可以通过点击二级选项来进行最终的选择。
在Visio中,可以将复选框和二级下拉组合框添加到绘图中的任何位置。
通过使用Visio的工具栏和属性窗口,可以定义每个复选框和二级下拉组合框的属性,如名称、大小、默认状态以及选项列表等。
总结起来,visio复选框二级下拉组合框是Visio软件中常用的两种控件,用于收集用户选择和提供层次结构选项的选择。
复选框用于表示二进制选择,而二级下拉组合框用于提供层次结构选项的选择。
在Visio中,可以通过工具栏和属性窗口设置这些控件的属性。
HTML下拉框、文本框、复选框

您好,我的回答不知是否满意?QQ,1250175746在HTML中,下拉列表,就是下拦选择框,select文本框就是textarea复选框就是checkbox不单单是这些表单元素,凡是表单元素都在form中<form name=”frm” action=”reg.php” method=”post”>下拉列表:<select name=”jiguan”><option value=”shan”>山东</option><!—下面就是默认选择项selected--><option value=”gauan” selected=”selected”>广东</option><option value=”three”>东北三省</option></selecta>复选项:请选择您喜欢的项目:<br/><input type=”checkbox” name=”裸泳” />裸泳<br/><input type=”checkbox” name=”肚皮舞蹈” checked=”checked” />肚皮舞蹈<br/><input type=”checkbox” name=”泡霉菌” />泡霉霉<br/>个人评语:<br/><textarea name=”self” cols=”50” rows=”5”>这些都是原创</textarea></form>Please Remmber:每一个表单元素都有一个名称和值,都是必须的,这是HTML与服务器交流的唯一通道。
value,name.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用自定义的CCheckComboBox类做带复选框的下拉列表1、添加Combo Box控件2.、改属性Style:DropList ;Owner Draw:Fixed ;Has string:true ;Sort:false3、头文件中添加:CCheckComboBox m_comboBox;4、DoDataExchange(CDataExchange* pDX)中添加:DDX_Control(pDX, IDC_COMBO1, m_comboBox);5、对话框初始化时添加m_comboBox.AddString(_T("1"));//加入项目m_comboBox.AddString(_T("2"));m_comboBox.AddString(_T("3"));m_comboBox.AddString(_T("4"));m_comboBox.SetCheck(0, TRUE);//设置选择状态m_comboBox.SetCheck(1, FALSE);m_comboBox.SetCheck(2, TRUE);m_comboBox.SetCheck(3, TRUE);#if !defined(AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDE D_)#define AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CCheckComboBox : public CComboBox{public:CCheckComboBox();virtual ~CCheckComboBox();BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);// Selects all/unselects the specified itemINT SetCheck(INT nIndex, BOOL bFlag);// Returns checked stateBOOL GetCheck(INT nIndex);// Selects all/unselects allvoid SelectAll(BOOL bCheck = TRUE);protected:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCheckComboBox)protected:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);//}}AFX_VIRTUAL//{{AFX_MSG(CCheckComboBox)afx_msg LRESULT OnCtlColorListBox(WPARAM wParam, LPARAM lParam);afx_msg LRESULT OnGetText(WPARAM wParam, LPARAM lParam);afx_msg LRESULT OnGetTextLength(WPARAM wParam, LPARAM lParam);afx_msg void OnDropDown();//}}AFX_MSGDECLARE_MESSAGE_MAP()public:CString m_strText;protected:// Routine to update the textvoid RecalcText();// The subclassed COMBOLBOX window (notice the 'L')HWND m_hListBox;// The string containing the text to displayBOOL m_bTextUpdated;// A flag used in MeasureItem, see comments thereBOOL m_bItemHeightSet;};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CHECKCOMBOBOX_H__66750D93_95DB_11D3_9325_444553540000__INCLUDED _)/** CheckComboBox.cpp **/// CheckComboBox.cpp//// Written by Magnus Egelberg (magnus.egelberg@lundalogik.se)//// Copyright (C) 1999, Lundalogik AB, Sweden. All rights reserved.////#include "stdafx.h"// #include "CheckCombo.h"#include "CheckComboBox.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifstatic WNDPROC m_pWndProc = 0;static CCheckComboBox *m_pComboBox = 0;BEGIN_MESSAGE_MAP(CCheckComboBox, CComboBox)//{{AFX_MSG_MAP(CCheckComboBox)ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox)ON_MESSAGE(WM_GETTEXT, OnGetText)ON_MESSAGE(WM_GETTEXTLENGTH, OnGetTextLength)ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropDown)//}}AFX_MSG_MAPEND_MESSAGE_MAP()//// The subclassed COMBOLBOX message handler//extern "C" LRESULT FAR PASCAL ComboBoxListBoxProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam){switch (nMsg) {case WM_RBUTTONDOWN: {// If you want to select all/unselect all using the// right button, remove this ifdef. Personally, I don't really like it #if FALSEif (m_pComboBox != 0) {INT nCount = m_pComboBox->GetCount();INT nSelCount = 0;for (INT i = 0; i < nCount; i++) {if (m_pComboBox->GetCheck(i))nSelCount++;}m_pComboBox->SelectAll(nSelCount != nCount);// Make sure to invalidate this window as wellInvalidateRect(hWnd, 0, FALSE);m_pComboBox->GetParent()->SendMessage(WM_COMMAND,MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);}#endifbreak;}// Make the combobox always return -1 as the current selection. This// causes the lpDrawItemStruct->itemID in DrawItem() to be -1// when the always-visible-portion of the combo is drawncase LB_GETCURSEL: {return -1;}case WM_CHAR: {if (wParam == VK_SPACE) {// Get the current selectionINT nIndex = CallWindowProcA(m_pWndProc, hWnd, LB_GETCURSEL, wParam, lParam);CRect rcItem;SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rcItem);InvalidateRect(hWnd, rcItem, FALSE);// Invert the check markm_pComboBox->SetCheck(nIndex, !m_pComboBox->GetCheck(nIndex));// Notify that selection has changedm_pComboBox->GetParent()->SendMessage(WM_COMMAND,MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);return 0;}break;}case WM_LBUTTONDOWN: {CRect rcClient;GetClientRect(hWnd, rcClient);CPoint pt;pt.x = LOWORD(lParam);pt.y = HIWORD(lParam);if (PtInRect(rcClient, pt)) {INT nItemHeight = SendMessage(hWnd, LB_GETITEMHEIGHT, 0, 0);INT nTopIndex = SendMessage(hWnd, LB_GETTOPINDEX, 0, 0);// Compute which index to check/uncheckINT nIndex = nTopIndex + pt.y / nItemHeight;CRect rcItem;SendMessage(hWnd, LB_GETITEMRECT, nIndex, (LONG)(VOID *)&rcItem);if (PtInRect(rcItem, pt)) {// Invalidate this windowInvalidateRect(hWnd, rcItem, FALSE);m_pComboBox->SetCheck(nIndex, !m_pComboBox->GetCheck(nIndex));// Notify that selection has changedm_pComboBox->GetParent()->SendMessage(WM_COMMAND,MAKELONG(GetWindowLong(m_pComboBox->m_hWnd, GWL_ID), CBN_SELCHANGE), (LPARAM)m_pComboBox->m_hWnd);}}// Do the default handling now (such as close the popup// window when clicked outside)break;}case WM_LBUTTONUP: {// Don't do anything here. This causes the combobox popup// windows to remain open after a selection has been madereturn 0;}}return CallWindowProc(m_pWndProc, hWnd, nMsg, wParam, lParam);}CCheckComboBox::CCheckComboBox(){m_hListBox = 0;m_bTextUpdated = FALSE;m_bItemHeightSet = FALSE;}CCheckComboBox::~CCheckComboBox(){}BOOL CCheckComboBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID){// Remove the CBS_SIMPLE and CBS_DROPDOWN styles and add the one I'm designed for dwStyle &= ~0xF;dwStyle |= CBS_DROPDOWNLIST;// Make sure to use the CBS_OWNERDRAWVARIABLE styledwStyle |= CBS_OWNERDRAWVARIABLE;// Use default strings. We need the itemdata to store checkmarksdwStyle |= CBS_HASSTRINGS;return CComboBox::Create(dwStyle, rect, pParentWnd, nID);}LRESULT CCheckComboBox::OnCtlColorListBox(WPARAM wParam, LPARAM lParam){// If the listbox hasn't been subclassed yet, do so...if (m_hListBox == 0) {HWND hWnd = (HWND)lParam;if (hWnd != 0 && hWnd != m_hWnd) {// Save the listbox handlem_hListBox = hWnd;// Do the subclassingm_pWndProc = (WNDPROC)GetWindowLong(m_hListBox, GWL_WNDPROC);SetWindowLong(m_hListBox, GWL_WNDPROC, (LONG)ComboBoxListBoxProc);}}return DefWindowProc(WM_CTLCOLORLISTBOX, wParam, lParam);}void CCheckComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {HDC dc = lpDrawItemStruct->hDC;CRect rcBitmap = lpDrawItemStruct->rcItem;CRect rcText = lpDrawItemStruct->rcItem;CString strText;// 0 - No check, 1 - Empty check, 2 - CheckedINT nCheck = 0;// Check if we are drawing the static portion of the comboboxif ((LONG)lpDrawItemStruct->itemID < 0) {// Make sure the m_strText member is updatedRecalcText();// Get the textstrText = m_strText;// Don't draw any boxes on this itemnCheck = 0;}// Otherwise it is one of the itemselse {GetLBText(lpDrawItemStruct->itemID, strText);nCheck = 1 + (GetItemData(lpDrawItemStruct->itemID) != 0);TEXTMETRIC metrics;GetTextMetrics(dc, &metrics);rcBitmap.left = 0;rcBitmap.right = rcBitmap.left + metrics.tmHeight + metrics.tmExternalLeading + 6;rcBitmap.top += 1;rcBitmap.bottom -= 1;rcText.left = rcBitmap.right;}if (nCheck > 0) {SetBkColor(dc, GetSysColor(COLOR_WINDOW));SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));UINT nState = DFCS_BUTTONCHECK;if (nCheck > 1)nState |= DFCS_CHECKED;// Draw the checkmark using DrawFrameControlDrawFrameControl(dc, rcBitmap, DFC_BUTTON, nState);}if (lpDrawItemStruct->itemState & ODS_SELECTED) {SetBkColor(dc, GetSysColor(COLOR_HIGHLIGHT));SetTextColor(dc, GetSysColor(COLOR_HIGHLIGHTTEXT));}else {SetBkColor(dc, GetSysColor(COLOR_WINDOW));SetTextColor(dc, GetSysColor(COLOR_WINDOWTEXT));}// Erase and drawExtTextOut(dc, 0, 0, ETO_OPAQUE, &rcText, 0, 0, 0);DrawText(dc, ' ' + strText, strText.GetLength() + 1, &rcText,DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS);if ((lpDrawItemStruct->itemState & (ODS_FOCUS|ODS_SELECTED)) ==(ODS_FOCUS|ODS_SELECTED))DrawFocusRect(dc, &rcText);}void CCheckComboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) {CClientDC dc(this);CFont *pFont = dc.SelectObject(GetFont());if (pFont != 0) {TEXTMETRIC metrics;dc.GetTextMetrics(&metrics);lpMeasureItemStruct->itemHeight = metrics.tmHeight +metrics.tmExternalLeading;// An extra height of 2 looks good I think.// Otherwise the list looks a bit crowded...lpMeasureItemStruct->itemHeight += 2;// This is needed since the WM_MEASUREITEM message is sent before // MFC hooks everything up if used in i dialog. So adjust the// static portion of the combo box nowif (!m_bItemHeightSet) {m_bItemHeightSet = TRUE;SetItemHeight(-1, lpMeasureItemStruct->itemHeight);}dc.SelectObject(pFont);}}//// Make sure the combobox window handle is updated since// there may be many CCheckComboBox windows active//void CCheckComboBox::OnDropDown(){m_pComboBox = this;}//// Selects/unselects all items in the list//void CCheckComboBox::SelectAll(BOOL bCheck){INT nCount = GetCount();for (INT i = 0; i < nCount; i++)SetCheck(i, bCheck);}//// By adding this message handler, we may use CWnd::GetText()//LRESULT CCheckComboBox::OnGetText(WPARAM wParam, LPARAM lParam) {// Make sure the text is updatedRecalcText();if (lParam == 0)return 0;// Copy the 'fake' window textlstrcpyn((LPWSTR)lParam, m_strText, (INT)wParam);return m_strText.GetLength();}//// By adding this message handler, we may use CWnd::GetTextLength() //LRESULT CCheckComboBox::OnGetTextLength(WPARAM, LPARAM){// Make sure the text is updatedRecalcText();return m_strText.GetLength();}//// This routine steps thru all the items and builds// a string containing the checked items//void CCheckComboBox::RecalcText(){if (!m_bTextUpdated) {CString strText;// Get the list countINT nCount = GetCount();// Get the list separatorTCHAR szBuffer[10] = {0};GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLIST, szBuffer, sizeof(szBuffer));CString strSeparator = szBuffer;// If none found, the the ';'if (strSeparator.GetLength() == 0)strSeparator = ';';// Trim extra spacesstrSeparator.TrimRight();// And one...strSeparator += ' ';for (INT i = 0; i < nCount; i++) {if (GetItemData(i)) {CString strItem;GetLBText(i, strItem);if (!strText.IsEmpty())strText += strSeparator;strText += strItem;}}// Set the textm_strText = strText;m_bTextUpdated = TRUE;}}INT CCheckComboBox::SetCheck(INT nIndex, BOOL bFlag){INT nResult = SetItemData(nIndex, bFlag);if (nResult < 0)return nResult;// Signal that the text need updatingm_bTextUpdated = FALSE;// Redraw the windowInvalidate(FALSE);return nResult;}BOOL CCheckComboBox::GetCheck(INT nIndex) {return GetItemData(nIndex);}。