【问题标题】:In a Win32 ListView I have both regular and state icons. This works on Win7, but not on XP在 Win32 ListView 中,我有常规图标和状态图标。这适用于Win7,但不适用于XP
【发布时间】:2011-02-11 08:51:18
【问题描述】:

我查看了 Microsoft 文档,但它说应该没有区别。

请注意,这是一个虚拟 ListView,因此如果在 LV_ITEM::mask 中设置了 LVIF_STATE 标志,我会在实现 LVN_GETDISPINFO 消息的代码中提供状态图标索引。

有谁知道可能导致这种行为差异的任何细微差异?

【问题讨论】:

    标签: windows winapi listview icons virtual


    【解决方案1】:

    不在您的问题中发布任何示例代码并不能完全帮助...

    此代码适用于我:

    #include <Windows.h>
    #include <commctrl.h>
    #pragma comment(lib, "comctl32.lib")
    
    typedef struct {
        LPTSTR text;
        UINT icon;
        UINT stateicon;
    } MYITEM;
    HWND g_hLV=NULL;
    MYITEM g_myitems[2]={{"item1",0,0},{"item2",2,2}};
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) 
    {
        switch(msg) 
        {
        case WM_NOTIFY:
            if (lp) 
            {
                NMLVDISPINFO*pLVDI=(NMLVDISPINFO*)lp;
                NMLISTVIEW*&pLV=(NMLISTVIEW*&)pLVDI;
                switch(pLVDI->hdr.code) 
                {
                case LVN_GETDISPINFO:
                    if (LVIF_TEXT&pLVDI->item.mask) pLVDI->item.pszText=g_myitems[pLVDI->item.iItem].text;
                    if (LVIF_IMAGE&pLVDI->item.mask) pLVDI->item.iImage=g_myitems[pLVDI->item.iItem].icon;
                    if (LVIF_STATE&pLVDI->item.mask) 
                    {
                        pLVDI->item.state=INDEXTOSTATEIMAGEMASK(1+g_myitems[pLVDI->item.iItem].stateicon);
                        pLVDI->item.stateMask=pLVDI->item.state;
                    }
                    return 0;
                }
            }
            break;
        case WM_CREATE:
            {
                g_hLV=CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,0,WS_VISIBLE|WS_CHILD|LVS_OWNERDATA|LVS_REPORT|LVS_SHAREIMAGELISTS,0,0,0,0,hwnd,0,0,0);
                LVCOLUMN lvc={LVCF_TEXT|LVCF_WIDTH};
                lvc.pszText="dummy";
                lvc.cx=99;
                ListView_InsertColumn(g_hLV,0,&lvc);
                SHFILEINFO sfi;
                HIMAGELIST hil=(HIMAGELIST)SHGetFileInfo(".\\",FILE_ATTRIBUTE_DIRECTORY,&sfi,0,SHGFI_SMALLICON|SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES);
                ListView_SetImageList(g_hLV,hil,LVSIL_SMALL);
                ListView_SetImageList(g_hLV,hil,LVSIL_STATE);
                g_myitems[1].stateicon=g_myitems[1].icon=sfi.iIcon;//assuming the imagelist has icons is wrong, so set at least one of them to a valid index
                ListView_SetCallbackMask(g_hLV,LVIS_STATEIMAGEMASK);
                ListView_SetItemCount(g_hLV,2);
            }
            return 0;
        case WM_SIZE:
            SetWindowPos(g_hLV,0,0,0,LOWORD(lp),HIWORD(lp),SWP_NOZORDER|SWP_NOACTIVATE);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        }
        return DefWindowProc(hwnd,msg,wp,lp);
    }
    
    int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
    {
        InitCommonControls();
        //This dialog subclassing is a ugly hack, but this is just sample code!
        HWND hwnd=CreateWindowEx(0,WC_DIALOG,"LVTest",WS_OVERLAPPEDWINDOW,0,0,99,99,0,0,0,0);
        SetWindowLongPtr(hwnd,GWLP_WNDPROC,(LONG_PTR)WndProc);
        SendMessage(hwnd,WM_CREATE,0,0);
        ShowWindow(hwnd,nShowCmd);
        MSG msg;
        while (GetMessage(&msg,0,0,0) > 0) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }
    

    【讨论】:

    • 感谢安德斯的努力。然而,我问是否有人遇到过和我一样的问题,所以我可以使用他们的解决方案来解决我的问题。不显示代码的原因是其庞大的规模。我正在使用 wxWidgets 库,它将 ListCtrl 隐藏在一个类中,但不实现状态图标。所以我有自己的消息处理程序,它拦截 LVN_GETDISPINFO 消息并添加状态图像索引。当然,这是有风险的业务,但当它在 Win7 上运行良好时,我真的很高兴。这就是我提出问题的背景......
    • @Bengt:你是在调用 ListView_SetCallbackMask 等吗?
    猜你喜欢
    • 2011-11-11
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多