zoukankan      html  css  js  c++  java
  • CListCtrl可编辑

    CListCtrl 是一个经常使用的控件,通常用来显示数据库的内容。但是,CListCtrl并不好用。我们当然希望CListCtrl能像Excel那样好用,因此,得在原来的基础上进行改进。

    一、使CListCtrl能够编辑子项

    1、在对话框中添加一个CListCtrl控件,并添加CListCtrl类型的变量m_list。

    2、初始化控件

    设置控件风格(照抄网上的)

    LONG lStyle;
    lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
    lStyle |= LVS_REPORT; //设置style
    SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
    DWORD dwStyle = m_list.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
    dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
    m_list.SetExtendedStyle(dwStyle); //设置扩展风格

    插入列

    m_list.InsertColumn(0,"OrderID",LVCFMT_LEFT,80);
    m_list.InsertColumn(1,"CustomerID",LVCFMT_LEFT,80);
    m_list.InsertColumn(2,"OrderDate",LVCFMT_LEFT,80);
    m_list.InsertColumn(3,"Feight",LVCFMT_LEFT,80);
    m_list.InsertColumn(4,"ShipName",LVCFMT_LEFT,80);
    m_list.InsertColumn(5,"ShipAddress",LVCFMT_LEFT,80);
    m_list.InsertColumn(6,"ShipCountry",LVCFMT_LEFT,80);

    插入行

       m_list.InsertItem(i,sOrderID);//sOrderID为插入的数据(LPCTSTR类型变量),i表示在数据在CListCtrl中的位置(int类型变量),以下类似
       m_list.SetItemText(i,1,sCustomerID);
       m_list.SetItemText(i,2,sOrderDate);
       m_list.SetItemText(i,3,sFeight);
       m_list.SetItemText(i,4,sShipName);
       m_list.SetItemText(i,5,sShipAddress);
       m_list.SetItemText(i,6,sShipCountry);

    3、使CListCtrl可编辑

    我采用的方法如下:当你单击CListCtrl控件时,使其中的一行高亮显示。当你双击CListCtrl控件时,将一个CEdit(编辑框)控件移动到你所双击的列中(CEdit控件中显示你所单击列的内容)所在的位置。并使CEdit控件获取焦点。然后,你可以修改CEdit中的内容。当你的鼠标点击其他地方,CEdit将失去焦点,同时,我们将CEdit中的内容更新到CListCtrl中,从而完成了对CListCtrl的子项的修改。

    首先在对话框中添加一个CEdit控件,并定义CEdit变量m_edit。当对话框初始化函数中隐藏该控件。
    m_edit.ShowWindow(SW_HIDE);

    然后对CListCtrl添加消息NM_DBLCLK(双击事件),在消息中添加代码

    NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
    CRect rc;
    if(pNMListView->iItem!=-1)
    {
       m_row=pNMListView->iItem;//m_row为被选中行的行序号(int类型成员变量)
       m_column=pNMListView->iSubItem;//m_column为被选中行的列序号(int类型成员变量)
       m_list.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,LVIR_LABEL,rc);//取得子项的矩形
       rc.left+=3;
       rc.top+=2;
       rc.right+=3;
       rc.bottom+=2;

       char * ch=new char [128];
       m_list.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//取得子项的内容
       m_edit.SetWindowText(ch);//将子项的内容显示到编辑框中
       m_edit.ShowWindow(SW_SHOW);//显示编辑框
       m_edit.MoveWindow(&rc);//将编辑框移动到子项上面,覆盖在子项上
       m_edit.SetFocus();//使编辑框取得焦点
       m_edit.CreateSolidCaret(1,rc.Height()-5);//创建一个光标
       m_edit.ShowCaret();//显示光标
       m_edit.SetSel(-1);//使光标移到最后面
    }
    *pResult = 0;

    然后,添加CEdit失去焦点时的消息EN_KILLFOCUS。在该消息中添加代码使编辑框中的内容更新到CListCtrl中。

    CString str;
    m_edit.GetWindowText(str);//取得编辑框的内容
    m_list.SetItemText(m_row,m_column,str);//将该内容更新到CListCtrl中
    m_edit.ShowWindow(SW_HIDE);//隐藏编辑框

    经过以上的步骤就实现的实现CListCtrl的子项可编辑。当然了,这还不完整。接下来所要做的工作:1、直接对CListCtrl派生出一个扩展类CListCtrlEx。2、添加自绘相关的代码。3、实现Virutal功能。4、继续添加双击子项弹出一个CComboBox控件的功能。5、可以调整行高。6、能够单击行头进行排序。等等等

    一些别人写的比较好的东东

    【1】http://www.codeproject.com/KB/list/virtuallist.aspx

    【2】http://www.codeproject.com/KB/list/quicklist.aspx#text

    【3】http://www.codeproject.com/KB/miscctrl/gridctrl.aspx#EditValidate

    【4】http://www.chinaitpower.com/A/2004-02-14/132385.html

    【5】http://m.cnblogs.com/35075/1556904.html

    【6】http://www.vckbase.com/document/viewdoc/?id=1853

  • 相关阅读:
    与众不同 windows phone (50)
    与众不同 windows phone (49)
    重新想象 Windows 8.1 Store Apps (93)
    重新想象 Windows 8.1 Store Apps 系列文章索引
    重新想象 Windows 8.1 Store Apps (92)
    重新想象 Windows 8.1 Store Apps (91)
    重新想象 Windows 8.1 Store Apps (90)
    重新想象 Windows 8.1 Store Apps (89)
    重新想象 Windows 8.1 Store Apps (88)
    重新想象 Windows 8.1 Store Apps (87)
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/1989421.html
Copyright © 2011-2022 走看看