C++ C++;WinAPI-ListView排序

C++ C++;WinAPI-ListView排序,c++,listview,winapi,C++,Listview,Winapi,我正在尝试在列表视图中进行排序。没有找到任何完整的示例,只有一段代码。 我已经创建了ListView,添加了列和项,指定了我的Comp函数。然而,我的问题是lp1和lp2总是0。我检查了文档,它说:“这些是在项目的LVITEM结构的lParam成员中指定的值,当它们被插入到列表中时。”我设置了这些值。 代码如下: #include <windows.h> #include <stdio.h> #include <commctrl.h> #pragma comm

我正在尝试在列表视图中进行排序。没有找到任何完整的示例,只有一段代码。 我已经创建了ListView,添加了列和项,指定了我的Comp函数。然而,我的问题是lp1和lp2总是0。我检查了文档,它说:“这些是在项目的LVITEM结构的lParam成员中指定的值,当它们被插入到列表中时。”我设置了这些值。 代码如下:

#include <windows.h>
#include <stdio.h>
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")

HWND ListView;
HWND hwnd;
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    MSG messages;
    WNDCLASSEX wincl = { 0 };

    wincl.lpszClassName = "Testtttt";
    wincl.lpfnWndProc = WindowProc;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof(WNDCLASSEX);

    wincl.hIcon = 0;
    wincl.hIconSm = 0;
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,0,0));// COLOR_BACKGROUND;
    wincl.hInstance = GetModuleHandle(NULL);

    RegisterClassEx(&wincl);

    hwnd = CreateWindowEx(
        0,
        wincl.lpszClassName,
        "Test",
        WS_SYSMENU | WS_EX_STATICEDGE | WS_VISIBLE,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        1000,
        500,
        hwnd,
        NULL,
        GetModuleHandle(NULL),
        NULL);

    RECT rec;
    GetClientRect(hwnd, &rec);
    SetWindowPos(ListView, 0, 0, 0, rec.right, rec.bottom - 23, 0);

    ShowWindow(hwnd, nCmdShow);

    while (GetMessage(&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
}

void AddListViewItem(char item, char *text)
{
    static int i;
    LVITEM lis;
    lis.mask = LVIF_TEXT /*| LVIF_PARAM*/;
    lis.pszText = (LPSTR)(text);
    lis.iItem = i;
    lis.iSubItem = item;
    lis.lParam = i;
    if (item==1)
    i++;
    if (item == 0)
        ListView_InsertItem(ListView, &lis);
    else
        SendMessage(ListView, LVM_SETITEM, 0, (LPARAM)&lis);
}

int CALLBACK myCompFunc(LPARAM lp1, LPARAM lp2, LPARAM sortParam)
{
    bool isAsc = (sortParam > 0);
    int column = abs(sortParam) - 1;

    char tmp[128];
    sprintf_s(tmp,sizeof tmp, "%d %d %d", lp1, lp2, column);
    MessageBox(0, (LPCSTR)tmp, "myCompFunc", MB_OK);
    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if (message == WM_NOTIFY)
    {
        LPNMHDR lpnmh = (LPNMHDR)lParam;
        if (lpnmh->idFrom == 8553)
        if (lpnmh->code == LVN_COLUMNCLICK)
        {
            NMLISTVIEW*    pListView = (NMLISTVIEW*)lParam;
            ListView_SortItems(ListView, myCompFunc, pListView->iSubItem);
        }
    }
    else if (message == WM_CREATE)
    {
        ListView = CreateWindow(WC_LISTVIEW, (LPCSTR)L"", (WS_CHILD | WS_VISIBLE | LVS_REPORT), 0, 0, 900, 500, hwnd, (HMENU)8553, GetModuleHandle(NULL), NULL);
        SendMessage(ListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); // Set style

        LVCOLUMN listColumn = { 0 };
        listColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
        listColumn.pszText = "Column1";
        listColumn.cx = 150;
        listColumn.fmt = LVCFMT_LEFT;
        ListView_InsertColumn(ListView, 0, &listColumn);
        listColumn.pszText = "Column2";
        listColumn.cx = 150;
        listColumn.iSubItem = 1;
        ListView_InsertColumn(ListView, 1, &listColumn);

        {
            AddListViewItem(0, "a");
            AddListViewItem(1, "a 1");

            AddListViewItem(0, "b");
            AddListViewItem(1, "b 1");

            AddListViewItem(0, "c");
            AddListViewItem(1, "c 1");
        }
    }
    else if (message == WM_DESTROY)
    {
        PostQuitMessage(0);
    }
    else
        return DefWindowProc(hwnd, message, wParam, lParam);
    return DefWindowProc(hwnd, message, wParam, lParam);
    return 0;
}
#包括
#包括
#包括
#pragma注释(lib,“comctl32.lib”)
HWND列表视图;
HWND-HWND;
LRESULT回调WindowProc(HWND、UINT、WPARAM、LPARAM);
int WINAPI WinMain(HINSTANCE hInst、HINSTANCE hPrevInstance、LPSTR lpsz参数、int nCmdShow)
{
消息;
WNDCLASSEX wincl={0};
wincl.lpszClassName=“Testtttt”;
wincl.lpfnWndProc=WindowProc;
wincl.style=CS_DBLCLKS;
wincl.cbSize=sizeof(WNDCLASSEX);
wincl.hIcon=0;
wincl.hIconSm=0;
wincl.hCursor=LoadCursor(空,IDC_箭头);
wincl.hbrBackground=(HBRUSH)CreateSolidBrush(RGB(0,0,0));//颜色背景;
wincl.hInstance=GetModuleHandle(NULL);
寄存器类(&wincl);
hwnd=CreateWindowEx(
0,
wincl.lpszClassName,
“测试”,
WS_SYSMENU | WS_EX_STATICEDGE | WS_可见,
CW_使用默认值,
CW_使用默认值,
1000,
500,
hwnd,
无效的
GetModuleHandle(空),
无效);
RECT rec;
GetClientRect(hwnd和rec);
SetWindowPos(ListView,0,0,0,rec.right,rec.bottom-23,0);
显示窗口(hwnd、nCmdShow);
while(GetMessage(&messages,NULL,0,0))
{
翻译消息(和消息);
DispatchMessage(&messages);
}
}
void AddListViewItem(字符项,字符*文本)
{
静态int-i;
LVLIS项目;
lis.mask=LVIF_TEXT/*| LVIF_PARAM*/;
lis.pszText=(LPSTR)(文本);
lis.iItem=i;
lis.iSubItem=项目;
lis.lParam=i;
如果(项目==1)
i++;
如果(项==0)
ListView_插入项(ListView和lis);
其他的
SendMessage(ListView、LVM_SETITEM、0、(LPRAM)和lis);
}
int回调myCompFunc(LPARAM lp1、LPARAM lp2、LPARAM sortParam)
{
bool-isAsc=(排序图>0);
int column=abs(排序图)-1;
char-tmp[128];
sprintf_s(tmp,tmp大小,“%d%d”,lp1,lp2,列);
消息框(0,(LPCSTR)tmp,“myCompFunc”,MB_OK);
返回0;
}
LRESULT回调WindowProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM)
{
如果(消息==WM\U通知)
{
LPNMHDR lpnmh=(LPNMHDR)lpram;
如果(lpnmh->idFrom==8553)
如果(lpnmh->code==LVN\u列单击)
{
NMLISTVIEW*pListView=(NMLISTVIEW*)LPRAM;
ListView_SortItems(ListView、myCompFunc、pListView->iSubItem);
}
}
else if(message==WM_CREATE)
{
ListView=CreateWindow(WC_ListView,(LPCSTR)L“”(WS|u CHILD | WS|u VISIBLE | LVS|u REPORT),0,0,900,500,hwnd,(HMENU)8553,GetModuleHandle(NULL),NULL);
SendMessage(ListView,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT);//设置样式
LVCOLUMN listColumn={0};
listColumn.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_子项;
listColumn.pszText=“Column1”;
listColumn.cx=150;
listColumn.fmt=LVCFMT_左;
ListView\u InsertColumn(ListView、0和listColumn);
listColumn.pszText=“Column2”;
listColumn.cx=150;
listColumn.iSubItem=1;
ListView_InsertColumn(ListView,1和listColumn);
{
AddListViewItem(0,“a”);
AddListViewItem(1,“a 1”);
AddListViewItem(0,“b”);
AddListViewItem(1,“B1”);
AddListViewItem(0,“c”);
AddListViewItem(1,“C1”);
}
}
else if(消息==WM_DESTROY)
{
PostQuitMessage(0);
}
其他的
返回DefWindowProc(hwnd、message、wParam、lParam);
返回DefWindowProc(hwnd、message、wParam、lParam);
返回0;
}

假设您试图让listview对数据进行排序,您最好自己对数据进行排序,至少对于批量插入,在原始项目中大约有15列。当然,我可以清除整个ListView并再次插入,但即使现在插入cca。20000个项目*15列可能需要半分钟!我想看看比较函数的性能,为什么LPARAM总是为零,这让我很困扰。解决了这个问题。我的LVIF_参数由于某种原因被评论。。。