list可编辑框

 不得不说MFC还是让我很痛苦,不过相对于一开始来说现在看到这个东西居然不会恶心了,orz。
    所谓 List Contro l,就是用来做LIist的,至于编辑,估计MS也没提供这个功能。比较诡异的是在给 List Control 设置属性的时候居然看到 Edit Label ,处于好奇点了点,发现只能修改第一列,改了之后失去焦点又变回原来的文本。没有深入试下去,我估计可以修改第一列的数据。
    其实要实现编辑功能,只要做一个 Edit Control 就可以了,当需要编辑的时候,把这个 Edit Control 动态显示到需要显示的地方。看效果图:
双击输入框:
list可编辑框_第1张图片
输入完成,点击空白处:
list可编辑框_第2张图片     在这里,响应List Control的双击事件:
void CAddInstanceDlg::OnNMDblclkList3(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

    LVHITTESTINFO info;
    info.pt = pNMItemActivate->ptAction;

    if(listControl.SubItemHitTest(&info) != -1 )
    {
        hitRow = info.iItem;
        hitCol = info.iSubItem;
        if(editItem.m_hWnd == NULL)
        {
            RECT rect;
            rect.left = 0;
            rect.top = 0;
            rect.bottom = 15;
            rect.right = 200;
            m_EditItem.Create(WS_CHILD | ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN | ES_MULTILINE, rect, this, 101);
            editItem.SetFont(this->GetFont(), FALSE);
        }
        CRect rect;
        listControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
        rect.top += 12;
        rect.left += 13;
        rect.right += 13;
        rect.bottom += 12;

        editItem.SetWindowText(listControl.GetItemText(hi.iItem, hi.iSubItem));
        editItem.MoveWindow(&rect, TRUE);
        editItem.ShowWindow(1);
        editItem.SetFocus();
    }
    *pResult = 0;
}


    这里比较诡异的是我用Visual Studio 2008自动生成的事件响应函数的第一行居然出错,google之后第一个就是微软关于这个自动生成代码错误的修正。
    在这个代码里面先得到鼠标双击的位置,判断是否击中了单元格,击中就调用 Edit Control ,大小就是选中的单元格,至于为什么rect要+12啊+13什么的,那是因为他出来的输入框跟单元格没对齐,导致很丑。最后再给这个 Edit Control 一个焦点,就可以直接输入了。
    另外,为了能使输入之后有所反应,我们还要做一个鼠标的单击事件响应函数。
void CAddInstanceDlg::OnNMClickList3(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

    if(editItem.m_hWnd != NULL)
    {
        editItem.ShowWindow(0);
        if(hitRow != -1)
        {
            CString text;
            editItem.GetWindowText(text);
            listControl.SetItemText(hitRow, hitCol, text);
        }
    }
     hitCol = hitRow = -1;
    *pResult = 0;
}

    这里是要判断一下是不是已经选中了单元格,如果处在编辑状态,离开了编辑状态就将文本显示在单元格上。
    如此就OK了。

你可能感兴趣的:(list可编辑框)