list Control实现单元格编辑与插入Combo Box

 之前写过一篇(list Control实现单元格编辑)文章,那篇文章不是很完善执行的时候有时会出错,这篇文章经过完善后还加入了Combo Box功能!

 

 这里我就只是晒一下我的代码;

 

 头文件:

 

 

  1. // ListControlTestDlg.h : 头文件   
  2. //  
  3.  
  4. #pragma once  
  5. #include "afxcmn.h"  
  6. #include "MyClstctrl.h"  
  7. #include "afxwin.h"  
  8.  
  9. #define  IDC_EDIT 0xffff   
  10. // CListControlTestDlg 对话框   
  11. class CListControlTestDlg : public CDialog  
  12. {  
  13. // 构造   
  14. public:  
  15.     CListControlTestDlg(CWnd* pParent = NULL);  // 标准构造函数   
  16.   
  17. // 对话框数据   
  18.     enum { IDD = IDD_LISTCONTROLTEST_DIALOG };  
  19.   
  20.     protected:  
  21.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持   
  22.   
  23.   
  24. // 实现   
  25. protected:  
  26.     HICON m_hIcon;  
  27.   
  28.     // 生成的消息映射函数   
  29.     virtual BOOL OnInitDialog();  
  30.     afx_msg void OnPaint();  
  31.     afx_msg HCURSOR OnQueryDragIcon();  
  32.     DECLARE_MESSAGE_MAP()  
  33. public:  
  34.       
  35.     afx_msg void OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult);  
  36.     CListCtrl m_list;  
  37.     afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);  
  38.     afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);  
  39.     CEdit m_Edit;  
  40.     int m_Item;  //要Edit行   
  41.     int m_SubItem; //要Edit列   
  42.     int rowCount;  //总行数   
  43.     int m_ComItem; // 要加入Combo Box 的行    
  44.     int m_ComSubItem; //要加入Combo Box的列 为了区别才这样定义,下面的两个bool类型也一样   
  45.     bool  needSave; //用于保存标志,如果有过编写则为TURE,当下次编辑时会在原来的位置输入原来输入的内容   
  46.     bool  ComneedSave;  
  47.     afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult);  
  48.     CComboBox m_comBox;  
  49. };  

 

 

Cpp文件:

 

  1. void CListControlTestDlg::DoDataExchange(CDataExchange* pDX)  
  2. {  
  3.     CDialog::DoDataExchange(pDX);  
  4.     DDX_Control(pDX, IDC_LIST1, m_list);  //关联控件   
  5.       
  6. }  

 

 

  1. BEGIN_MESSAGE_MAP(CListControlTestDlg, CDialog)  
  2.     ON_WM_PAINT()  
  3.     ON_WM_QUERYDRAGICON()  
  4.     //}}AFX_MSG_MAP            //关联函数处理消息   
  5.     ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CListControlTestDlg::OnNMRClickList1) //关联处理点击右键函数   
  6.     ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CListControlTestDlg::OnNMDblclkList1) //关联处理双击左键函数   
  7.     ON_NOTIFY(NM_CLICK, IDC_LIST1, &CListControlTestDlg::OnNMClickList1)   //关联处理单击左键函数   
  8.     ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CListControlTestDlg::OnLvnItemchangedList1)  
  9. END_MESSAGE_MAP()  

 

在OnInitDialog()函数内做一些初始化处理

 

  1. BOOL CListControlTestDlg::OnInitDialog()  
  2. {  
  3.     CDialog::OnInitDialog();  
  4.   
  5.     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动   
  6.     //  执行此操作   
  7.     SetIcon(m_hIcon, TRUE);         // 设置大图标   
  8.     SetIcon(m_hIcon, FALSE);        // 设置小图标   
  9.   
  10.     // TODO: 在此添加额外的初始化代码   
  11.       
  12.            RECT  m_rect;  
  13.     m_list.GetClientRect(&m_rect); //获取list的客户区   
  14.     m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); //设置list风格   
  15.   
  16.            m_list.InsertColumn(0,_T("学号"),LVCFMT_LEFT, m_rect.right/4);  
  17.     m_list.InsertColumn(1,_T("姓名"),LVCFMT_LEFT, m_rect.right/4);  
  18.     m_list.InsertColumn(2,_T("性别"),LVCFMT_LEFT, m_rect.right/4);  
  19.     m_list.InsertColumn(3,_T("班级"),LVCFMT_LEFT, m_rect.right/4);  
  20.   
  21.     m_list.InsertItem(0,_T("09090901"));  
  22.     m_list.SetItemText(0,1,_T("小李"));  
  23.     m_list.SetItemText(0,2,_T("男"));  
  24.     m_list.SetItemText(0,3,_T("计科0901"));  
  25.   
  26.     m_list.InsertItem(1,_T("09090902"));  
  27.     m_list.SetItemText(1,1,_T("小王"));  
  28.     m_list.SetItemText(1,2,_T("男"));  
  29.     m_list.SetItemText(1,3,_T("计科0902"));  
  30.   
  31.          rowCount = m_list.GetItemCount();  //获取行数   
  32.   
  33.     needSave = false//初始化为FLASE;   
  34.     ComneedSave = false;  
  35.   
  36.     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE   
  37. }  

 

这里我就只是将单击左键时的函数实现代码上传上来,里面实现了Edit和Combo Box 控件功能

 

  1. void CListControlTestDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)  
  2. {  
  3.     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);  
  4.     // TODO: 在此添加控件通知处理程序代码   
  5.       
  6.          //我这里有两种办法可以实现   
  7.   
  8.     NM_LISTVIEW  *pEditCtrl = (NM_LISTVIEW *)pNMHDR;  
  9.     CRect  EditRect;  
  10.     CRect  ComRect;  
  11.     //CPoint  point;   
  12.     //GetCursorPos(&point);   
  13.     //m_list.ScreenToClient(&point);   
  14.   
  15.     //LVHITTESTINFO info;   
  16.     //info.pt = point;   
  17.     //info.flags = LVHT_ABOVE   
  18.   
  19.   
  20.       
  21.     //m_Item = m_list.SubItemHitTest(&info);   
  22.   
  23.   
  24.     if (pEditCtrl->iItem == -1)  
  25.     {   
  26.         //当点击其他区域时,显示内容   
  27.         if (needSave)  
  28.         {    
  29.             //needSave == TURE   
  30.             CString  EditStr;  
  31.             m_Edit.GetWindowText(EditStr); //获取输入的内容   
  32.             m_list.SetItemText(m_Item,m_SubItem,EditStr); //m_Item,m_SubItem这两个变量的值是原来的单元格的值   
  33.                                 m_Edit.ShowWindow(SW_HIDE);  
  34.         }  
  35.        
  36.         if (ComneedSave)  
  37.         {  
  38.             CString strCom;  
  39.             m_comBox.GetWindowText(strCom);  
  40.             m_list.SetItemText(m_ComItem,m_ComSubItem,strCom);  
  41.             m_comBox.ShowWindow(SW_HIDE);  
  42.         }  
  43.   
  44.         /* 
  45.         if (m_Edit.m_hWnd != NULL) 
  46.         { 
  47.             m_Edit.ShowWindow(SW_HIDE); 
  48.         } 
  49.         if (m_comBox.m_hWnd != NULL) 
  50.         { 
  51.             m_comBox.ShowWindow(SW_HIDE); 
  52.         } 
  53.         */  
  54.         return;  
  55.     }  
  56.               //m_SubItem = info.iSubItem;   
  57.   
  58.   
  59.     //在1,2,4列实现编辑   
  60.     if (pEditCtrl->iItem < rowCount && pEditCtrl->iSubItem != 2)  
  61.     {  
  62.         if (m_comBox.m_hWnd != NULL)  
  63.         {  
  64.             CString strCom;  
  65.             m_comBox.GetWindowText(strCom);  
  66.             m_list.SetItemText(m_ComItem,m_ComSubItem,strCom);//ComBoBox保存之前数据   
  67.             m_comBox.ShowWindow(SW_HIDE);  
  68.         }  
  69.           
  70.         if (needSave)  
  71.         {    
  72.             //needSave == TURE   
  73.             CString  EditStr;  
  74.             m_Edit.GetWindowText(EditStr); //获取输入的内容   
  75.             m_list.SetItemText(m_Item,m_SubItem,EditStr); //m_Item,m_SubItem这两个变量的值是原来的单元格的值   
  76.   
  77.         }  
  78.   
  79.         m_Item = pEditCtrl->iItem; //行数   
  80.         m_SubItem = pEditCtrl->iSubItem; //列数   
  81.   
  82.         m_list.GetSubItemRect(m_Item,m_SubItem,LVIR_LABEL,EditRect); //获取单元格的空间   
  83.           
  84.         if (m_Edit.m_hWnd == NULL)  
  85.   
  86.         {    //m_Edit.m_hWnd == NULL说明还没创建   
  87.             //RECT rect;   
  88.             //rect.left = rect.top = 0;   
  89.             //rect.bottom = 20;   
  90.             //rect.right = 100;   
  91.   
  92.                             needSave = true;  
  93.             m_Edit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,  
  94.                         CRect(0,0,0,0),this,IDC_EDIT);  
  95.   
  96.             //IDC_EDIT已近在头文件中定义,这个很重要,很多时候会忽略,   
  97.             //网上找到的实现编辑办法中这个都没说明   
  98.             //我定义为#define  IDC_EDIT 0xffff   
  99.   
  100.             m_Edit.ShowWindow(SW_HIDE); //Edit创建完后隐藏   
  101.             m_Edit.SetFont(this->GetFont(),FALSE);//设置字体   
  102.             /* 
  103.             CFont tpFont; 
  104.             tpFont.CreateStockObject(DEFAULT_GUI_FONT); 
  105.             m_Edit.SetFont(&tpFont); 
  106.             tpFont.DeleteObject(); 
  107.            */  
  108.         }  
  109.         m_Edit.SetParent(&m_list); //将list control设置为父窗口,生成的Edit才能正确定位,这个也很重要,   
  110.   
  111.         EditRect.SetRect(EditRect.left,EditRect.top,EditRect.left+m_list.GetColumnWidth(m_SubItem),EditRect.bottom);  
  112.         //m_list.GetColumnWidth(m_SubItem)获取列的宽度   
  113.   
  114.         CString strItem = m_list.GetItemText(m_Item,m_SubItem);  
  115.           
  116.         m_Edit.MoveWindow(&EditRect);  
  117.         m_Edit.ShowWindow(SW_SHOW);  
  118.         m_Edit.SetWindowText(strItem);  
  119.         m_Edit.SetFocus();//设置为焦点   
  120.         m_Edit.SetSel(0,-1);  //0,-1表示单元格内容全选中   
  121.           
  122.           
  123.   
  124.     }  
  125.       
  126.              //在第三列插入Combo Box   
  127.   
  128.     if (pEditCtrl->iSubItem == 2)  
  129.     {     
  130.        if (m_Edit.m_hWnd != NULL)  
  131.        {  
  132.            CString  EditStr;  
  133.            m_Edit.GetWindowText(EditStr); //获取输入的内容   
  134.            m_list.SetItemText(m_Item,m_SubItem,EditStr); //m_Item,m_SubItem这两个变量的值是原来的单元格的值   
  135.            m_Edit.ShowWindow(SW_HIDE);  
  136.        }  
  137.   
  138.   
  139.         if (ComneedSave)  
  140.         {  
  141.             CString strCom;  
  142.             m_comBox.GetWindowText(strCom);  
  143.                  m_list.SetItemText(m_ComItem,m_ComSubItem,strCom);  
  144.         }  
  145.           
  146.         m_ComItem = pEditCtrl->iItem; //行数   
  147.         m_ComSubItem = pEditCtrl->iSubItem; //列数   
  148.               m_list.GetSubItemRect(m_ComItem,m_ComSubItem,LVIR_LABEL,ComRect);  
  149.   
  150.        if (m_comBox.m_hWnd == NULL)  
  151.        {  
  152.            ComneedSave = true;  
  153.            m_comBox.Create(WS_CHILD|WS_VISIBLE|CBS_SORT|CBS_DROPDOWN|CBS_OEMCONVERT,CRect(0,0,40,40),this,0);  
  154.                       //CBS_OEMCONVERT 实现可编辑   
  155.            //CBS_DROPDOWN   产生一个下拉式框,小图标   
  156.            //CBS_DROPDOWNLIST   图标代替单元格   
  157.            m_comBox.AddString(_T("男"));  //添加选项   
  158.            m_comBox.AddString(_T("女"));  
  159.            m_comBox.SetFont(this->GetFont(),FALSE);  
  160.           // m_comBox.ShowWindow(SW_HIDE);   
  161.        }  
  162.   
  163.             CString  ComstrItem;  
  164.        m_comBox.SetParent(&m_list);  
  165.             ComstrItem = m_list.GetItemText(m_ComItem,m_ComSubItem);  
  166.        ComRect.SetRect(ComRect.left,ComRect.top,ComRect.left+m_list.GetColumnWidth(m_ComSubItem),ComRect.bottom);  
  167.        m_comBox.MoveWindow(&ComRect);  
  168.        m_comBox.ShowWindow(SW_SHOW);  
  169.        m_comBox.SetWindowText(ComstrItem);  //当显示Combo Box控件时里面的内容为原来的内容,不然是空白的   
  170.               m_comBox.SetFocus(); //设置焦点   
  171.     }  
  172.           
  173.            *pResult = 0;  
  174. }  

 

 

 

 

 

 

 

 转自bizhu12

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值