加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

子类化列表视图以仅编辑其子项

发布时间:2020-12-16 07:28:20 所属栏目:百科 来源:网络整理
导读:我写了这个小程序,它显示了一个列表视图,并使项目和子项目可编辑. 我想改变它,只使子项可编辑.我想让列表视图窗口程序站立起来,我不必每次都转发WM_NOTIFY消息,就像我现在在WndProcMain中所做的那样.目的是我在程序中不使用一个带有可编辑子项的列表视图,我
我写了这个小程序,它显示了一个列表视图,并使项目和子项目可编辑.

我想改变它,只使子项可编辑.我想让列表视图窗口程序站立起来,我不必每次都转发WM_NOTIFY消息,就像我现在在WndProcMain中所做的那样.目的是我在程序中不使用一个带有可编辑子项的列表视图,我将在许多不同的窗口中使用它.

LVN_ENDLABELEDIT通知由WndProcList处理,因为必须更改bEditing.必须编辑子项时,此标志用于WM_PAINT.这是一个修复,否则第一个子项中的文本会消失,因为它认为正在编辑第一个项目.但是,我还希望在列表视图所有者窗口(在本例中为WndProcMain)的窗口过程中收到类似LVN_ENDLABELEDIT的消息,因为我还想操纵用户输入.

如果您有任何疑问,请询问.

提前致谢

迈达斯

WNDPROC     wpOrigEditProc;
RECT        rcSubItem;

LRESULT CALLBACK WndProcEditList(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
    switch (uMsg) {
        case WM_WINDOWPOSCHANGING:
            {
                WINDOWPOS *pos = (WINDOWPOS*) lParam;

                pos->x  = rcSubItem.left;
                pos->cx = rcSubItem.right;
            }
            break;
        default:
            return CallWindowProc(wpOrigEditProc,hWnd,uMsg,wParam,lParam);
    }
    return 1;
} 

LRESULT CALLBACK WndProcList(HWND hWnd,LPARAM lParam) {
    static HWND             hEdit;
    static RECT             rc;
    static LVITEM           lvI;
    static unsigned char    bEditing = 0;
    switch (uMsg) {
        case WM_NOTIFY:
            switch (((NMHDR*) lParam)->code) {
                case NM_CLICK:
                    lvI.iItem       = ((NMITEMACTIVATE*) lParam)->iItem;
                    lvI.iSubItem    = ((NMITEMACTIVATE*) lParam)->iSubItem;
                    break;
                case NM_DBLCLK:
                    SendMessage(hWnd,LVM_EDITLABEL,lvI.iItem,0);
                    break;
                case LVN_BEGINLABELEDIT:
                    {
                        char    text[32];
                        bEditing        = 1;
                        hEdit           = (HWND) SendMessage(hWnd,LVM_GETEDITCONTROL,0);
                        rcSubItem.top   = lvI.iSubItem;
                        rcSubItem.left  = LVIR_LABEL;
                        SendMessage(hWnd,LVM_GETSUBITEMRECT,(long) &rcSubItem);
                        rcSubItem.right = SendMessage(hWnd,LVM_GETCOLUMNWIDTH,lvI.iSubItem,0);
                        wpOrigEditProc  = (WNDPROC) SetWindowLong(hEdit,GWL_WNDPROC,(long) WndProcEditList);
                        lvI.pszText     = text;
                        lvI.cchTextMax  = 32;
                        SendMessage(hWnd,LVM_GETITEMTEXT,(long) &lvI);
                        SetWindowText(hEdit,lvI.pszText);
                    }
                    break;
                case LVN_ENDLABELEDIT:
                    bEditing = 0;
                    SetWindowLong(hEdit,(long) wpOrigEditProc);
                    if (!lvI.iSubItem) return 1;
                    lvI.pszText = ((NMLVDISPINFO*) lParam)->item.pszText;
                    if (!lvI.pszText) return 1;
                    SendMessage(hWnd,LVM_SETITEMTEXT,(long) &lvI);
                    break;
                default:
                    return CallWindowProc((WNDPROC) GetClassLong(hWnd,GCL_WNDPROC),lParam);
            }
            break;
        case WM_PAINT:
            if (bEditing) {
                RECT rcItem;
                if (lvI.iSubItem > 0) {
                    rcItem.left = LVIR_LABEL;
                    if (SendMessage(hWnd,LVM_GETITEMRECT,(long) &rcItem))
                        ValidateRect(hWnd,&rcItem);
                }
            }
        default:
            return CallWindowProc((WNDPROC) GetClassLong(hWnd,lParam);
    }
    return 0;
}

LRESULT CALLBACK WndProcMain(HWND hWnd,LPARAM lParam) {
    static HWND hList;
    static RECT rc;
    switch (uMsg) {
        case WM_NOTIFY:
            switch (((NMHDR*) lParam)->code) {
                case NM_CLICK:
                case NM_DBLCLK:
                case LVN_BEGINLABELEDIT:
                case LVN_ENDLABELEDIT:
                    return CallWindowProc(WndProcList,((NMHDR*) lParam)->hwndFrom,lParam);
            }
            break;
        case WM_CREATE:
            {
                LVCOLUMN        lvc;
                LVITEM          lvI;
                unsigned int    i;
                float           vertex;
                char            text[32];

                hList = CreateWindow(WC_LISTVIEW,WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_EDITLABELS,rc.left,rc.top,rc.right,rc.bottom,hInstance,0);
                SendMessage(hList,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
                SetWindowLong(hList,(long) WndProcList);

                lvc.mask    = LVCF_WIDTH;
                lvc.cx      = 30;
                SendMessage(hList,LVM_INSERTCOLUMN,(LPARAM) &lvc);

                lvc.mask    = LVCF_TEXT;
                lvc.pszText = "Vertex";
                SendMessage(hList,1,(LPARAM) &lvc);
                SendMessage(hList,LVM_SETCOLUMNWIDTH,LVSCW_AUTOSIZE_USEHEADER);

                lvI.mask    = LVIF_TEXT;
                lvI.pszText = text;

                for (i = 0; i < 10; i++) {
                    vertex = (float) i;
                    lvI.iItem       = i;
                    lvI.iSubItem    = 0;    
                    sprintf(text,"%d",i);
                    SendMessage(hList,LVM_INSERTITEM,(LPARAM) &lvI);
                    lvI.iSubItem    = 1;    
                    sprintf(text,"%f,%f,%f",vertex - 1,vertex,vertex + 1);
                    SendMessage(hList,LVM_SETITEM,(LPARAM) &lvI);
                }
            }
            break;
        case WM_SIZE:
            GetClientRect(hWnd,&rc);
            MoveWindow(hList,1);
            SendMessage(hList,LVSCW_AUTOSIZE_USEHEADER);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd,lParam);
    }
    return 0;
}

解决方法

我发布了与该问题相关的答案,但它是在C#中.从来没有在winapi有太多的专业知识,而不是很久以前作为业余爱好者玩它,这篇文章最后的答案看起来很有希望 – http://cboard.cprogramming.com/windows-programming/122733-%5Bc%5D-editing-subitems-listview-win32-api.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读