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

来源:互联网 发布:枣想核你在一起 淘宝 编辑:程序博客网 时间:2024/06/11 19:23

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

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

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

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

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();}elserect.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 0
原创粉丝点击