Control List添加可选下拉框

Control List添加可选下拉框

.h文件中添加

  • 定义变量
    		int e_Item;    //刚编辑的行  
    		int e_SubItem; //刚编辑的列  
    		CComboBox m_comBox;//生产单元格下拉列表对象
    		bool haveccomboboxcreate;//标志下拉列表框已经被创建
    		void createCcombobox(NM_LISTVIEW  *pEditCtrl, CComboBox *createccomboboxobj, int &Item, int &SubItem, bool &havecreat);//创建单元格下拉列表框函数
    		void distroyCcombobox(CListCtrl *list, CComboBox* distroyccomboboxobj, int &Item, int &SubItem);//销毁单元格下拉列表框
    

.cpp文件添加

  1. 定义宏(控件ID号)

    	#define IDC_COMBOX_CREATEID  1000
    
  2. 在OnInitDialog函数里面添加

    	haveccomboboxcreate = false;//初始化标志位,表示还没有创建下拉列表框
    
  3. 实现createCcombobox(NM_LISTVIEW *pEditCtrl, CComboBox *createccomboboxobj, int &Item, int &SubItem, bool &havecreat)创建下拉列表框函数

    	//创建单元格下拉列表框函数
    	//pEditCtrl为列表对象指针,createccombobox为下拉列表框指针对象,
    	//Item为创建单元格在列表中的行,SubItem则为列,havecreat为对象创建标准
    
    	void CalibrationDlg::createCcombobox(NM_LISTVIEW  *pEditCtrl, CComboBox *createccomboboxobj, int &Item, int &SubItem, bool &havecreat)
    	{
    		Item = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
    		SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
    		havecreat = true;
    		createccomboboxobj->Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_OEMCONVERT, CRect(0, 0, 0, 0), this, IDC_COMBOX_CREATEID);
    		createccomboboxobj->SetFont(this->GetFont(), FALSE);//设置字体,不设置这里的话上面的字会很突兀的感觉
    		createccomboboxobj->SetParent(&m_list);//将list control设置为父窗口,生成的Ccombobox才能正确定位,这个也很重要
    		CRect  EditRect;
    		m_list.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//获取单元格的空间位置信息
    		EditRect.SetRect(EditRect.left + 1, EditRect.top + 1, EditRect.left + m_list.GetColumnWidth(e_SubItem) - 1, EditRect.bottom - 1);//+1和-1可以让编辑框不至于挡住列表框中的网格线
    		CString strItem = m_list.GetItemText(e_Item, e_SubItem);//获得相应单元格字符
    		createccomboboxobj->SetWindowText(strItem);//将单元格字符显示在编辑框上
    		createccomboboxobj->MoveWindow(&EditRect);//将编辑框位置放在相应单元格上
    		createccomboboxobj->ShowWindow(SW_SHOW);//显示编辑框在单元格上面
    	}
    
    
  4. 实现distroyCcombobox(CListCtrl *list, CComboBox* distroyccomboboxobj, int &Item, int &SubItem)销毁下拉列表框对象函数

    	void CalibrationDlg::distroyCcombobox(CListCtrl *list, CComboBox* distroyccomboboxobj, int &Item, int &SubItem)
    	{
    		CString meditdata;
    		distroyccomboboxobj->GetWindowTextW(meditdata);
    		list->SetItemText(Item, SubItem, meditdata);//更新相应单元格字符
    		distroyccomboboxobj->DestroyWindow();//销毁对象,有创建就要有销毁,不然会报错
    	}
    
  5. NM_CLICK响应函数的实现(NM_CLICK消息可以通过对话框属性中添加,也可以代码添加,这里就代码添加,手动添加前面的文档中有类似的消息添加)

  • BEGIN_MESSAGE_MAP中添加映射
    	ON_NOTIFY(NM_CLICK, IDC_Calibration, &CalibrationDlg::OnNMClickCalibration)
    
  • 响应函数的实现
    	void CalibrationDlg::OnNMClickCalibration(NMHDR *pNMHDR, LRESULT *pResult)
    	{
    		LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    		NM_LISTVIEW  *pEditCtrl = (NM_LISTVIEW *)pNMHDR;
    		if (pEditCtrl->iItem==-1)//点击到非工作区
    		{
        		if (haveccomboboxcreate == true)//如果之前创建了下拉列表框就销毁掉
        		{
            		distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);
            		haveccomboboxcreate = false;
        		}
    		}
    		else//如果是性别选项,在单元格处生成下拉列表项
    		{
       
        		if (haveccomboboxcreate == true)//如果之前创建了下拉列表框就销毁掉
        		{
            		if (!(e_Item == pEditCtrl->iItem && e_SubItem == pEditCtrl->iSubItem))//如果点中的单元格不是之前创建好的
            		{
                		distroyCcombobox(&m_list, &m_comBox, e_Item, e_SubItem);
                		haveccomboboxcreate = false;
                		createCcombobox(pEditCtrl, &m_comBox, e_Item, e_SubItem, haveccomboboxcreate);//创建下拉列表框
                		m_comBox.AddString(L"男");
                		m_comBox.AddString(L"女");
                		m_comBox.ShowDropDown();//自动下拉
            		}
            		else//点中的单元格是之前创建好的
            		{
                		m_comBox.SetFocus();//设置为焦点
            		}
        		}
        		else
        		{
            		e_Item = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
            		e_SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
            		createCcombobox(pEditCtrl, &m_comBox, e_Item, e_SubItem, haveccomboboxcreate);//创建编辑框
            		m_comBox.AddString(L"男");
            		m_comBox.AddString(L"女");
            		m_comBox.ShowDropDown();//自动下拉
        		}
    		}
    		*pResult = 0;
    	}
    

你可能感兴趣的:(MFC开发)