使用Win32 API的ListView对话框






3.44/5 (24投票s)
2004年9月1日

144117

7490
使用报表样式和图标样式的ListView的对话框
引言
这个程序在一个对话框中使用列表视图,通过切换选项卡,它可以以报表样式和图标样式重新显示。它解释了在使用列表视图时遇到的问题。
- 如何更改列表视图的样式?
- 如何获取你点击的条目的数据?
- 如何移除每个条目中的图标?
- 如何更改每个条目的背景色和文本颜色?
- 如何禁用鼠标左键和右键?
背景
我收到一个项目,需要编写一个使用列表视图的 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 中使用列表视图的人来说一定很有用。