zoukankan      html  css  js  c++  java
  • [ListControl]MFC中实现list控件的编辑操作

    最近一直没睡好觉,彻底成了夜猫子一个,

    最近用了两天时间做了个数据库课程设计,总体说是完成得还好,不过后面回想一下的话就是太简单了点。

    这次做的是报刊订购系统,具体流程就不多说了,反正也就连接数据库,操纵各种数据,

    得到的数据是显示在ListControl控件上的,由于我有个功能是想实现即时对List控件的编辑,所以上网找了一下方法,发现了这样的一篇文章:

    http://www.vckbase.com/index.php/wv/1548

    我根据自己的需要做了一下改动

    我自己的最终实现的方法就是,

    生成一个新的子类继承于CListCtrl

    1 class CEditListCtrl : public CListCtrl

    下面是响应控件的点击事件OnLButtonDown

    具体流程如下

    代码如下

     1 void CEditListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
     2 {
     3     // TODO: 在此添加消息处理程序代码和/或调用默认值
     4 
     5     m_bFocus = TRUE;
     6     LVHITTESTINFO  lvhit;
     7     lvhit.pt = point;
     8     int item = SubItemHitTest(&lvhit);
     9 
    10     //if (over a item/subitem)
    11     if (item != -1 && (lvhit.flags & LVHT_ONITEM))
    12     {
    13         CListCtrl::OnLButtonDown(nFlags, point);
    14 
    15         if(m_bHighLight && m_iItem == item )
    16         {
    17             //第二次单击
    18             m_edtItemEdit.ShowWindow(SW_SHOW);
    19             m_edtItemEdit.SetFocus();
    20             //m_edtItemEdit.SetSel(-1);
    21             return;
    22         }
    23         else
    24         {
    25             //第一次单击
    26             if(m_editCreate)
    27             {
    28                 m_edtItemEdit.ShowWindow(SW_HIDE);
    29                 SetListText();
    30                 m_edtItemEdit.SetWindowTextW(NULL);
    31             }
    32             m_iItem =item;
    33             m_iSubItem = lvhit.iSubItem;
    34             m_bHighLight = TRUE;
    35 
    36 
    37 
    38         }
    39     }
    40     else
    41     {
    42         if(m_edtItemEdit.m_hWnd == NULL)
    43         {
    44             //未出现文本编辑框时
    45             m_bHighLight = FALSE;
    46         }
    47 
    48         CListCtrl::OnLButtonDown(nFlags, point);
    49     }
    50 
    51     Invalidate(); //强制重绘控件
    52 
    53     if (m_iSubItem >= 0)
    54     {
    55         if(m_iItem != item) return;
    56         CRect  rcSubItem;
    57         m_iSubItem=2;
    58         GetSubItemRect( item, m_iSubItem, LVIR_BOUNDS, rcSubItem);
    59 
    60         //get edit control and subclass
    61 
    62         if(!m_editCreate)
    63 
    64         {
    65             if(m_edtItemEdit.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,rcSubItem,this,IDC_EDIT))
    66                 m_editCreate=TRUE;
    67             m_edtItemEdit.SetFocus();
    68             m_edtItemEdit.ShowWindow(SW_HIDE);
    69         }
    70         //ASSERT(hWnd != NULL);
    71         //VERIFY(m_edtItemEdit.SubclassWindow(hWnd));
    72 
    73         //move edit control text 4 pixel to the right of org label,
    74         //as Windows does it...编辑框定位
    75         rcSubItem.left += 4;
    76         m_edtItemEdit.MoveWindow (&rcSubItem) ;
    77         m_edtItemEdit.SetWindowText(GetItemText(item, m_iSubItem));
    78     }
    79 
    80 }

    注:本人的代码是只能修改列号为2的单元格

  • 相关阅读:
    Maven报错,没有有效的生命周期
    6张图解释IO流
    传统Java JDBC
    快速杀死占用8080端口进程的批处理(kill-8080.bat)
    ubuntu环境配置终极解答
    Linux系统下Java开发环境的配置(未完...)
    Linux常用命令及操作(第二弹)
    Linux下安装Mysql
    Linux常用命令及操作
    int转LPCTSTR
  • 原文地址:https://www.cnblogs.com/TaigaCon/p/2570422.html
Copyright © 2011-2022 走看看