65.9K
CodeProject 正在变化。 阅读更多。
Home

使用Win32 API的ListView对话框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.44/5 (24投票s)

2004年9月1日

viewsIcon

144117

downloadIcon

7490

使用报表样式和图标样式的ListView的对话框

引言

这个程序在一个对话框中使用列表视图,通过切换选项卡,它可以以报表样式和图标样式重新显示。它解释了在使用列表视图时遇到的问题。

  1. 如何更改列表视图的样式?
  2. 如何获取你点击的条目的数据?
  3. 如何移除每个条目中的图标?
  4. 如何更改每个条目的背景色和文本颜色?
  5. 如何禁用鼠标左键和右键?

背景

我收到一个项目,需要编写一个使用列表视图的 Win32 对话框。但是当我搜索网络时,使用列表视图的 Win32 文章和代码却很少,大部分都是 MFC 的。

使用代码

//
BOOL CALLBACK TableProc(HWND hDlg, UINT message, 
  WPARAM wParam, LPARAM lParam)
{
  int iIndex;
  LPNMLISTVIEW pnm;
  TCHAR *pVarName = NULL;
  POINT pt;
  static RECT lstRect;
  switch(message)
  {
  case WM_INITDIALOG:
    SendMessage(hDlg, WM_SETREDRAW, FALSE, 0);
    hListTab = GetDlgItem(hDlg, IDC_LISTTAB);
    InitListTab(hListTab);
    hTableList = GetDlgItem(hDlg, IDC_TABLELIST);
    InitTableImageList(hTableList);
    InitTableList(hTableList);
    InitTableDlg(hDlg);
        SetFocus(hTableList);
    SendMessage(hTableList, WM_SETREDRAW, TRUE, 0);
    GetWindowRect(hTableList, &lstRect);
    return TRUE;
  case WM_COMMAND:
    if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
      PostQuitMessage(0);
      EndDialog(hDlg, 0);
      return TRUE;
    }
    break;
  case WM_NCHITTEST:
    pt.x = LOWORD(lParam);
    pt.y = HIWORD(lParam);
    if(pt.x >= lstRect.left && pt.x <= lstRect.right &&
       pt.y >= lstRect.top && pt.y <= lstRect.right)
    {
      return (LRESULT)HTERROR;
    }
    break;
  case WM_NOTIFY:
    switch(LOWORD(wParam))
    {
    case IDC_TABLELIST:
      pnm = (LPNMLISTVIEW)lParam;
            if(pnm->hdr.hwndFrom == hTableList &&pnm->hdr.code == NM_CUSTOMDRAW)
            {
                SetWindowLong(hDlg, DWL_MSGRESULT, (LONG)TableDraw(lParam));
                return TRUE;
            }
      if(((LPNMHDR)lParam)->code == NM_CLICK)
      {
        // 1. get current selection
        iIndex = (int)SendMessage(hTableList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
        if(iIndex == -1)
          return FALSE;
        TCHAR itemTotle[MAX_PATH] = {0};
        GetItemText(hTableList, iIndex, itemTotle);
        return FALSE;
      }
      // here you must use LVN_ITEMCHANGED not LVN_ITEMCHANGING
      // because LVN_ITEMCHANGING is before focu on you clicked item;
      // LVN_ITEMCHANGED is after focu on you clicked item but before disapear it
      if(((LPNMHDR)lParam)->code == LVN_ITEMCHANGED)
      {
        iIndex = (int)SendMessage(hTableList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
        if(iIndex == -1)
          return FALSE;
        ListView_SetItemState(hTableList, iIndex, 0, LVIS_SELECTED | LVIS_FOCUSED);
        return TRUE;
      }
      break;
    case IDC_LISTTAB:
      if(((LPNMHDR)lParam)->code == TCN_SELCHANGE)
      {
        OnSelchangeListCtrlMode(hDlg);
        return TRUE;
      }
      break;
    }
    break;
  }
  return FALSE;
}
//

更新

我会持续更新这个简单程序的任何更改或改进。我认为这对于那些想在 Win32 中使用列表视图的人来说一定很有用。

© . All rights reserved.