在自绘的CLsitCtrl控件单元格内添加Combobox控件

主要功能:点击CLsitCtrl中显示Combobox控件

第一步:在.h声明文件中定义关于Combobox控件的信息

        //Combobox控件
	UIComboBox  *m_UIcombobox;
	DWORD		m_comTextColor;		//将ListCtrl的字体颜色传给Combobox
	vector<CString> m_vetComboDatas;

第二步:在.cpp文件构造函数中初始化信息

	m_isCreateCombo = false;//默认没有创建Combobox控件
	m_UIcombobox = new UIComboBox();m_isCreateCombo = false;//默认没有创建Combobox控件
	m_UIcombobox = new UIComboBox();


第三步:在创建单元格内的控件时,首先需要获得单元格的区域

bool CListCtrlMy::GetCellRect(int nRow,int nCol,CRect &rect)
{
	if (GetSubItemRect(nRow,nCol,LVIR_BOUNDS,rect) == FALSE)
		return false;
	CRect colRect;
	if (GetHeaderCtrl()->GetItemRect(nCol,colRect) == FALSE)
		return false;
	if (nCol == 0)
	{
		CRect  labelRect;
		if (GetSubItemRect(nRow,nCol,LVIR_LABEL,labelRect) == FALSE)
			return false;
		rect.right = labelRect.right;
		rect.left = labelRect.right-colRect.Width();
	}
	else
		rect.right = rect.left + colRect.Width();
	return true;
}


第四步:创建  Combobox控件的create信息

void CListCtrlMy::CreateChildCombobox(UIComboBox *pCombobox,int nRow,int nCol,vector<CString> m_vetCom)
{
	CRect  rect;
	if (GetCellRect(nRow,nCol,rect))
	{
		pCombobox->create(WS_VISIBLE|CBS_DROPDOWNLIST | CBS_HASSTRINGS |WS_VSCROLL | WS_TABSTOP| WS_GROUP|CBS_OWNERDRAWFIXED,rect,this,ComboboxID);
		
		for (int vetsize = 0 ; vetsize < m_vetCom.size() ; vetsize++)
		{
			pCombobox->AddString(m_vetCom[vetsize]);
		}
		int nColHeight = rect.bottom - rect.top-6;
		pCombobox->SetTextColor(m_comTextColor);
		//pCombobox->SetTextType(1);
		pCombobox->SetBkColor(m_comBkColor);
		pCombobox->SetComboControlHeight(nColHeight,nColHeight);
		pCombobox->SetTextFont(m_TextFont,m_FontType);
	}
}

第五步:创建Combobox控件的Destroy信息

void CListCtrlMy::DestroyChildCombobox(UIComboBox *pCombo,int nRow,int nCol)
{
	int nSel = pCombo->GetCurSel();
	CString strText;
	pCombo->GetLBText(nSel,strText);
	SetItemText(nRow,nCol,strText);
		//销毁控件
	bool falag =  pCombo->DestroyWindow();
}


第六步:使用CListCtrl中内部消息,OnNMClick 当点击控件时做处理

声明消息信息:

afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult);
ON_NOTIFY_REFLECT(NM_CLICK, &UIImageListCtrl::OnNMClick)

消息处理:

void CListCtrlMy::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	DWORD dwPos = GetMessagePos();   
	CPoint point( LOWORD(dwPos), HIWORD(dwPos) );   
	ScreenToClient(&point);   
	LVHITTESTINFO lvinfo;   
	lvinfo.pt = point;   
	lvinfo.flags = LVHT_ABOVE;   
	if (!(lvinfo.iSubItem > 0 ) || (pNMListView->iItem == -1 && pNMListView->iSubItem == 0)   )  
	{  
		return;
	}  
	//获取combobox控件 是哪个列中存在的
	int nControl_Col = 0;
	int  isSelectControl = 0;
	//m_mapControlType是存储列号和控件类型的,后续有体现
	map<int,int>::iterator it_map = m_mapControlType.begin();
	for (it_map ; it_map != m_mapControlType.end() ; it_map++)
	{
		if (it_map->first == pNMListView->iSubItem)
		{
			nControl_Col = it_map->first;
			isSelectControl = it_map->second;
			break;
		}
	}
	CString strText;
	if (pNMListView->iSubItem == nControl_Col)
	{
		if (isSelectControl == Combobox_Type)
		{
			if (m_isCreateCombo == false)
			{
				
				CreateChildCombobox(m_UIcombobox,pNMListView->iItem,pNMListView->iSubItem ,m_vetComboDatas);
				m_UIcombobox->ShowDropDown();
				m_isCreateCombo = true;
			}
			else if (m_isCreateCombo == true)
			{
				DestroyChildCombobox(m_UIcombobox,pNMListView->iItem,pNMListView->iSubItem);
				m_isCreateCombo = false;
				CreateChildCombobox(m_UIcombobox,pNMListView->iItem,pNMListView->iSubItem,m_vetComboDatas);
			}
		}
		m_nChildRow = pNMListView->iItem;//m_nChildRow全局变量,存储当前行数
		m_nChildCol = pNMListView->iSubItem;//m_nChildCol全局变量,存储当前列数
	}
}


第七步:根据以上代码,不能实现,当用户选中Combobox控件的内容后,立即让控件消失。需要以下处理。

实现Combobox控件的内部消息

a:当改变Combobox中的内容时,做出消息响应

声明:

afx_msg void OnComboSelChange();
ON_CBN_SELCHANGE(ComboboxID, &UIImageListCtrl::OnComboSelChange)

消息实现:

void CListCtrlMy::OnComboSelChange()
{
	if (m_isCreateCombo == true)
	{
		DestroyChildCombobox(m_UIcombobox,m_nChildRow,m_nChildCol);
		m_isCreateCombo = false;
	}
}

b:当关闭Combobox控件时,做出消息响应

声明:

afx_msg void OnComboCloseUp();
ON_CBN_CLOSEUP(ComboboxID, &UIImageListCtrl::OnComboCloseUp)


消息实现:

void CListCtrlMy::OnComboCloseUp()
{
	int nSel = m_UIcombobox->GetCurSel();
	m_UIcombobox->DestroyWindow();
	m_isCreateCombo = false;
}


第八步:外部调用接口

bool CListCtrlMy::SetComboDatas(int nCol,vector<CString> m_vetCombo)
{
	//第一步:判断用户输入的列是否存在
	int nColSize = GetHeaderCtrl()->GetItemCount();
	int nRowSize = GetItemCount();
	if (nCol > nColSize && nRowSize==0)
		return false;
	m_vetComboDatas = m_vetCombo;
	//将控件对应的列存储起来
	m_mapControlType.insert(make_pair(nCol,Combobox_Type));
}


结尾:以上代码本人测试过,可以使用。如果有不明白可以QQ咨询

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糯诺诺米团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值