• SDK_列表控件的使用


    列表控件的使用

    • 列表控件是通用控件,响应WM_NOTIFY 消息

      • 主要包含了 4 种风格,我们学的是 report 风格

    • 如何设置列表的扩展风格

      • LVS_EX_GRIDLINES: 列表拥有表格线

      • LVS_EX_FULLROWSELECT:可以进行整行选中

      // 1. 设置列表的风格
      ListView_SetExtendedListViewStyle(hListView, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
    • 如何添加一个列:想要添加行必须拥有列( LVCOLUMN )

      • 使用 ListView_InsertColumn 宏进行设置

      // 向列表中的添加列
      VOID InsertListViewColumns(HWND hListView)
      {
      // 1. 初始化一个列结构体进行设置
      // 1.1 第一个字段 mask 表示想要应用哪些设置(对齐方式,文字,宽度)
      LVCOLUMN lvColumn = { LVCF_FMT | LVCF_TEXT | LVCF_WIDTH };
      // 1.2 设置对齐方式,第一列的对其方式始终是左对齐
      lvColumn.fmt = LVCFMT_CENTER;
      // 1.3 设置每一列的宽度
      lvColumn.cx = 100;

      // 2. 设置列名并添加列
      lvColumn.cx = 100;
      lvColumn.pszText = (LPWSTR)L"姓名";
      ListView_InsertColumn(hListView, 0, &lvColumn);

      lvColumn.cx = 50;
      lvColumn.pszText = (LPWSTR)L"年龄";
      ListView_InsertColumn(hListView, 1, &lvColumn);

      lvColumn.cx = 260;
      lvColumn.pszText = (LPWSTR)L"学校";
      ListView_InsertColumn(hListView, 2, &lvColumn);
      }
    • 如何添加一个行:插入一行数据+设置行的信息

      • ListView_InsertItem + ListView_SetItemText

      // 添加数据到某一行
      VOID InsertListViewItem(HWND hListView, int index, LPCWSTR Name, LPCWSTR Age, LPCWSTR School)
      {
      // 1. 先添加一行数据,并且设置第一列的信息
      LVITEM lvItem = { LVIF_TEXT };
      lvItem.iItem = index;
      lvItem.pszText = (LPWSTR)Name;
      ListView_InsertItem(hListView, &lvItem);

      // 2. 设置每一行中的元素信息
      ListView_SetItemText(hListView, index, 1, (LPWSTR)Age);
      ListView_SetItemText(hListView, index, 2, (LPWSTR)School);
      }
    • 如何获取列表的选中项

      • 需要注意通知码的筛选, NM_XXXX

      • 当响应的是列表控件产生的通知消息时, LParam 保存的是一个指针,指向 NMLISTVIEW

      // 2. 筛选消息是由谁产生的
      if (lpNmhdr->idFrom == IDC_LIST1)
      {
         // 3. 如果产生的是列表的通知消息,lParam 指向的是另外一个结构
         LPNMLISTVIEW lpNmListVew = (LPNMLISTVIEW)lParam;

         // 4. 如果产生的是鼠标的点击消息
         if (lpNmhdr->code == NM_CLICK)
        {
             // 判断点击的行是否有效
             // int n = ListView_GetItemCount(lpNmhdr->hwndFrom);
             if (-1 != lpNmListVew->iItem)
            {
                 // 4.1 可以通过 LPNMLISTVIEW 获取点击的位置
                 LVITEM lvItem = { LVIF_TEXT };
                 // 4.2 必须要将 pszText 指向一个有效的位置
                 lvItem.pszText = new WCHAR[0x10];
                 // 4.3 设置缓冲区的大小
                 lvItem.cchTextMax = 0x10;

                 // 4.4 设置要获取的行列信息学
                 lvItem.iItem = lpNmListVew->iItem;
                 lvItem.iSubItem = lpNmListVew->iSubItem;

                 // 4.5 发送消息获取数据
                 ListView_GetItem(lpNmhdr->hwndFrom, &lvItem);

                 // 4.6 显示获取的数据
                 MessageBox(hWnd, lvItem.pszText, L"左键点击", MB_OK);
            }
        }
      }
    • 在列表中弹出一个菜单项

      case WM_NOTIFY:
      {
         // 1. 响应 WM_NOTIFY 消息的时候, lParam 指向的但通常十一个结构体
         LPNMHDR lpNmhdr = (LPNMHDR)lParam;

         // 2. 筛选消息是由谁产生的
         if (lpNmhdr->idFrom == IDC_LIST1)
        {
             // 右键弹出菜单
             if (NM_RCLICK == lpNmhdr->code)
            {
                 // 1. 获取点击的位置,获取的是相对于桌面的
                 POINT Point = { 0 };
                 GetCursorPos(&Point);

                 // 2. 获取一个子菜单
                 HMENU hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MENU1));
                 HMENU hSubMenu = GetSubMenu(hMenu, 0);

                 // 3. 弹出菜单
                 TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, Point.x, Point.y, NULL, hWnd, nullptr);
            }
        }

         break;
      }

     

     

  • 相关阅读:
    REST API和微服务
    mormot报错: too many fields: 72>=64
    delphi操作blobfield
    cossacklabs acra 开源数据库安全套件
    dremio 对于iceberg 的操作支持
    数据应用访问控制的一些参考资料
    hasura graphqlengine 二进制运行方法说明
    openmetadata abac 实现简单说明
    hasura graphqlengine 源码构建问题
    dremio 22 发布
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10910210.html
Copyright © 2020-2023  润新知