RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1566145
Accepted
jrfdsa
jrfdsa
Asked:2024-02-13 22:25:03 +0000 UTC2024-02-13 22:25:03 +0000 UTC 2024-02-13 22:25:03 +0000 UTC

ListView_SortItemsEx 之后 ListView_FindItem 始终返回 -1

  • 772

ListView_SortItemsEx之后ListView_FindItem总是返回-1,即没有找到任何东西。告诉我为什么会有这种行为?最小可重复示例

#include "windows.h"
#include "commctrl.h"
#include "vector"
#include "string"
#pragma comment(lib, "Comctl32.lib")

HINSTANCE hinst;
HWND hwndMain;
HWND hwndList;

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int CreateColumn(HWND hwndLV, int iCol, CHAR* Text, int iWidth)
{
    LVCOLUMN lvc;

    lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    lvc.fmt = LVCFMT_LEFT;
    lvc.cx = iWidth;
    lvc.pszText = Text;
    lvc.iSubItem = iCol;
    return ListView_InsertColumn(hwndLV, iCol, &lvc);
}

int CreateItem(HWND hwndList, CHAR* text, int index)
{
    LVITEM lvi = { 0 };
    int res;

    lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
    lvi.iItem = index;
    lvi.pszText = text;
    lvi.lParam = 0;
    res = ListView_InsertItem(hwndList, &lvi);

    if (res >= 0)
    {
        ListView_SetItemText(hwndList, res, 0, text);
    }

    return res;
}

void fillListView()
{
    for (int i = 0; i < 10; ++i)
    {
        CreateItem(hwndList, (CHAR*)std::to_string(i).c_str(), i);
    }
}

// функция обратново вызова для сортировки
int CALLBACK CompareListViewFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    std::vector<CHAR> str1(MAX_PATH);
    std::vector<CHAR> str2(MAX_PATH);

    ListView_GetItemText(hwndList, lParam1, 0, &str1.front(), MAX_PATH);
    ListView_GetItemText(hwndList, lParam2, 0, &str2.front(), MAX_PATH);

    if (strcmp(&str1.front(), &str2.front()) == 0)
    {
        return NULL;
    }

    if (strcmp(&str1.front(), &str2.front()) == 1)
    {
        return TRUE;
    }

    return -1;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine, int nCmdShow)
{
    MSG msg;
    BOOL bRet;
    WNDCLASS wc;
    UNREFERENCED_PARAMETER(lpszCmdLine);

    // Register the window class for the main window. 

    if (!hPrevInstance)
    {
        wc.style = 0;
        wc.lpfnWndProc = (WNDPROC)WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.hIcon = LoadIcon((HINSTANCE)NULL,
            IDI_APPLICATION);
        wc.hCursor = LoadCursor((HINSTANCE)NULL,
            IDC_ARROW);
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName = "MainMenu";
        wc.lpszClassName = "MainWndClass";

        if (!RegisterClass(&wc))
            return FALSE;
    }

    hinst = hInstance;  

    hwndMain = CreateWindow("MainWndClass", "Sample",
        WS_OVERLAPPEDWINDOW, 500, 30, 700, 700, (HWND)NULL,
        (HMENU)NULL, hinst, (LPVOID)NULL);

    hwndList = CreateWindow(WC_LISTVIEW, "", WS_VISIBLE | WS_BORDER | WS_CHILD | LVS_REPORT |
        LVS_NOCOLUMNHEADER | LVS_SORTDESCENDING, 5, 5, 470, 630, hwndMain, (HMENU)44444, 0, 0);

    HWND btn = CreateWindow("Button", "Select element 2", WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE, 500, 5, 150, 30, hwndMain, (HMENU)44445, 0, 0);

    HWND btn2 = CreateWindow("Button", "Sorting", WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE, 500, 55, 150, 30, hwndMain, (HMENU)44446, 0, 0);

    ListView_SetExtendedListViewStyleEx(hwndList, 0, LVS_EX_FULLROWSELECT | LVS_EX_FLATSB);

    CreateColumn(hwndList, 1, 0, 450);

    fillListView();


    if (!hwndMain)
        return FALSE;

    ShowWindow(hwndMain, nCmdShow);
    UpdateWindow(hwndMain);

    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {

    case WM_COMMAND:
    {
        int wmId = LOWORD(wParam);
        switch (wmId)
        {
        case 44445:
        {
            LVFINDINFO lvfiInfo;
            lvfiInfo.flags = LVFI_STRING;
            lvfiInfo.psz = "2";
            int iIndex = ListView_FindItem(hwndList, -1, &lvfiInfo);
            if (iIndex != -1)
            {
                ListView_SetItemState(hwndList, iIndex, LVIS_SELECTED, LVIS_SELECTED);
                SetFocus(hwndList);
            }
            else
            {
                MessageBox(hWnd, "Not found", "ERROR", MB_ICONINFORMATION);
            }

            break;
        }
        case 44446:
        {
            ListView_SortItemsEx(hwndList, CompareListViewFunc, 0);

            break;
        }
        }
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
c++
  • 1 1 个回答
  • 56 Views

1 个回答

  • Voted
  1. Best Answer
    jrfdsa
    2024-02-14T19:09:10Z2024-02-14T19:09:10Z

    问题是反向排序函数和窗口样式 LVS_SORTDESCENDING 之间存在冲突,它也对自身进行排序,更多详细信息 - https://learn.microsoft.com/en-us/windows/win32/controls/list-view-controls -概述#排列-排序和查找项目

    • 1

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5