zoukankan      html  css  js  c++  java
  • listcontrol 加combobox

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

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

     头文件:

    [c-sharp] view plaincopy
     
    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文件:

    [c-sharp] view plaincopy
     
    1. void CListControlTestDlg::DoDataExchange(CDataExchange* pDX)  
    2. {  
    3.     CDialog::DoDataExchange(pDX);  
    4.     DDX_Control(pDX, IDC_LIST1, m_list);  //关联控件  
    5.       
    6. }  
    [c-sharp] view plaincopy
     
    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()函数内做一些初始化处理

    [c-sharp] view plaincopy
     
    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 控件功能

    [c-sharp] view plaincopy
     
    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. }  

     

  • 相关阅读:
    我的javascript学习路线图
    Javascript 严格模式
    犀牛书学习笔记(10):模块和命名空间
    犀牛书学习笔记(9):继承
    犀牛书学习笔记(7):定义和使用类或对象
    犀牛书学习笔记(6):理解作用域和作用域链
    犀牛书学习笔记(5):javascript中的对象
    犀牛书学习笔记(4):面向对象(OOP)之回顾JAVA
    犀牛书学习笔记(3):函数
    bug
  • 原文地址:https://www.cnblogs.com/xzh1993/p/4794562.html
Copyright © 2011-2022 走看看