zoukankan      html  css  js  c++  java
  • 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;
      }

     

     

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10910210.html
Copyright © 2011-2022 走看看