主要功能:点击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咨询