📄 listview.c
字号:
if (GetCapture() != hwnd) break; ScreenToClient (hwnd, &mouseX, &mouseY); p1 = plvdata->pHdrClicked; LV_GET_HDR_RECT(p1, rc); if (PtInRect(&rc, mouseX, mouseY)) { if (!(LVSTATUS(hwnd) & LVST_INHEAD)) { LVSTATUS(hwnd) |= LVST_INHEAD; InvalidateRect (hwnd, &rc, FALSE); } } else if (LVSTATUS(hwnd) & LVST_INHEAD) { rc.left -= 1; rc.right += 1; LVSTATUS(hwnd) &= ~LVST_INHEAD; InvalidateRect (hwnd, &rc, FALSE); } } //in border dragged status else if (LVSTATUS(hwnd) & LVST_BDDRAG) lvBorderDrag (hwnd, mouseX, mouseY); break; } case MSG_LBUTTONDOWN: { int mouseX = LOSWORD (lParam); int mouseY = HISWORD (lParam); int nCols, nRows; RECT rect, rcClient; PLSTHDR p1; PITEMDATA p2; GetClientRect (hwnd, &rcClient); nCols = isInListViewHead (mouseX, mouseY, &p1, plvdata); if (nCols > 0) // clicks on the header { if (GetCapture() == hwnd) break; SetCapture (hwnd); LVSTATUS(hwnd) |= LVST_HEADCLICK; LVSTATUS(hwnd) |= LVST_INHEAD; plvdata->pHdrClicked = p1; SetRect (&rect, p1->x - plvdata->nOriginalX, LV_HDR_TOP, p1->x - plvdata->nOriginalX+ p1->width, LV_HDR_TOP + LV_HDR_HEIGHT); InvalidateRect (hwnd, &rect, FALSE); } else { if ((nCols = lvInWhichHeadBorder (mouseX, mouseY, &p1, plvdata)) > 0) { LVSTATUS(hwnd) |= LVST_BDDRAG; plvdata->nItemDraged = nCols; SetCapture (hwnd); } else if ((nRows = isInLVItem (mouseX, mouseY, &p2, plvdata)) > 0) { lvSelectItem (hwnd, nRows, plvdata); lvMakeItemVisible (hwnd, plvdata, nRows); NotifyParent (hwnd, GetDlgCtrlID(hwnd), LVN_SELCHANGE); } } break; } case MSG_LBUTTONUP: { PLSTHDR p1; int nCols; int mouseX = LOSWORD (lParam); int mouseY = HISWORD (lParam); if (LVSTATUS(hwnd) & LVST_HEADCLICK) { if (GetCapture() != hwnd) break; ReleaseCapture (); LVSTATUS(hwnd) &= ~LVST_HEADCLICK; LVSTATUS(hwnd) &= ~LVST_INHEAD; ScreenToClient (hwnd, &mouseX, &mouseY); nCols = isInListViewHead (mouseX, mouseY, NULL, plvdata); p1 = lvGetHdrByCol (plvdata, nCols); if (p1 != plvdata->pHdrClicked) break; lvToggleSortStatus(p1); lvSortItem (NULL, nCols, p1->sort, plvdata); plvdata->nItemSelected = sGetItemSeq (plvdata); InvalidateRect (hwnd, NULL, FALSE); } else if (LVSTATUS(hwnd) & LVST_BDDRAG) { ReleaseCapture (); lstSetHScrollInfo (plvdata); LVSTATUS(hwnd) &= ~LVST_BDDRAG; InvalidateRect (hwnd, NULL, FALSE); } break; } /* listview defined messages */ case LVM_COLSORT: { int nCols = (int)wParam; if (lvSortItem (NULL, nCols, LOSORTED, plvdata) == 0) { plvdata->nItemSelected = sGetItemSeq (plvdata); InvalidateRect (hwnd, NULL, FALSE); return LV_OKAY; } return LV_ERR; } case LVM_SORTITEMS: { //PLVSORTDATA sortData = (PLVSORTDATA)wParam; PFNLVCOMPARE pfn = (PFNLVCOMPARE)lParam; if (lvSortItem (pfn, 0, LOSORTED, plvdata) == 0) { plvdata->nItemSelected = sGetItemSeq (plvdata); InvalidateRect (hwnd, NULL, FALSE); return LV_OKAY; } return LV_ERR; } case LVM_SETITEMHEIGHT: { int height = (int)wParam; plvdata->nItemHeight = height; if (height < LV_ITEMH_DEF(hwnd)) plvdata->nItemHeight = LV_ITEMH_DEF(hwnd); lstSetVScrollInfo (plvdata); InvalidateRect (hwnd, NULL, FALSE); return TRUE; } case LVM_SETHEADHEIGHT: { int height = (int)wParam; plvdata->nHeadHeight = height; if (height < LV_HDRH_DEF(hwnd)) plvdata->nHeadHeight = LV_HDRH_DEF(hwnd); lstSetVScrollInfo (plvdata); InvalidateRect (hwnd, NULL, FALSE); return TRUE; } case LVM_ADDITEM: { PLVITEM p1; PITEMDATA pnew; int index; p1 = (PLVITEM) lParam; pnew = itemNew (plvdata->nCols); pnew->addData = p1->itemData; index = sAddItemToList (p1->nItem, pnew, plvdata); lstSetVScrollInfo (plvdata); InvalidateRect (hwnd, NULL, FALSE); return index; } case LVM_SETSUBITEMCOLOR: { PLVSUBITEM p1; RECT rect; p1 = (PLVSUBITEM) lParam; lvSetSubItemTextColor(p1->nItem, p1->subItem, p1->nTextColor, plvdata); LV_GET_SUBITEM_RECT(p1->nItem, p1->subItem, rect); InvalidateRect (hwnd, &rect, FALSE); return 0; } case LVM_SETSUBITEMTEXT: { PLVSUBITEM p1; RECT rect; p1 = (PLVSUBITEM) lParam; if (lvFillSubItem(p1->nItem, p1->subItem, p1->pszText, plvdata) < 0) return LV_ERR; LV_GET_SUBITEM_RECT(p1->nItem, p1->subItem, rect); InvalidateRect (hwnd, &rect, FALSE); return LV_OKAY; } case LVM_FILLSUBITEM: case LVM_SETSUBITEM: { PLVSUBITEM p1; RECT rect; p1 = (PLVSUBITEM) lParam; if ( (lvSetSubItem(p1, plvdata)) < 0 ) return LV_ERR; LV_GET_SUBITEM_RECT(p1->nItem, p1->subItem, rect); InvalidateRect (hwnd, &rect, FALSE); return LV_OKAY; } case LVM_GETITEM: { PLVITEM p1; PITEMDATA pitem; p1 = (PLVITEM) lParam; pitem = lvGetItemByRow (plvdata, p1->nItem); if (!pitem) return LV_ERR; p1->itemData = pitem->addData; return LV_OKAY; } case LVM_GETITEMCOUNT: { return plvdata->nRows; } case LVM_GETSELECTEDITEM: { return plvdata->nItemSelected; } case LVM_GETCOLUMN: { int col = (int)wParam; PLVCOLUMN pcol = (PLVCOLUMN)lParam; PLSTHDR ph = lvGetHdrByCol(plvdata, col); if (!ph) return -1; pcol->width = ph->width; strncpy (pcol->pszHeadText, ph->pTitle, pcol->nTextMax); pcol->pszHeadText[pcol->nTextMax] = 0; pcol->image = ph->Image; pcol->pfnCompare = ph->pfnCmp; pcol->colFlags = ph->flags; } case LVM_GETCOLUMNWIDTH: { int col = (int)wParam; PLSTHDR ph = lvGetHdrByCol(plvdata, col); if (ph) return ph->width; else return -1; } case LVM_GETCOLUMNCOUNT: { return plvdata->nCols; } case LVM_GETSUBITEMLEN: { PLVSUBITEM p1; PSUBITEMDATA p2; p1 = (PLVSUBITEM) lParam; p2 = lvGetSubItem (p1->nItem, p1->subItem, plvdata); if (p2 == NULL || p2->pszInfo == NULL) return LV_ERR; return strlen (p2->pszInfo); } case LVM_GETSUBITEMTEXT: { PLVSUBITEM p1; PSUBITEMDATA p2; p1 = (PLVSUBITEM) lParam; p2 = lvGetSubItem (p1->nItem, p1->subItem, plvdata); strcpy (p1->pszText, p2->pszInfo); return 0; } case LVM_ADDCOLUMN: { PLVCOLUMN p1; if ( !(p1 = (PLVCOLUMN)lParam) ) return LV_ERR; if (!lvAddColumnToList (p1, plvdata)) return LV_ERR; lstSetHScrollInfo (plvdata); InvalidateRect (hwnd, NULL, FALSE); return LV_OKAY; } case LVM_MODIFYHEAD: { PLVCOLUMN p1 = (PLVCOLUMN) lParam; if (!p1) return LV_ERR; if (sModifyHeadText (p1->nCols, p1->pszHeadText, plvdata) >= 0) { InvalidateRect (hwnd, NULL, FALSE); return LV_OKAY; } return LV_ERR; } case LVM_SETCOLUMN: { PLVCOLUMN p1 = (PLVCOLUMN) lParam; PLSTHDR ph; if (!p1) return LV_ERR; if ( !(ph = lvGetHdrByCol (plvdata, p1->nCols)) ) return LV_ERR; sModifyHeadText (p1->nCols, p1->pszHeadText, plvdata); lvSetColumnWidth (p1->nCols, p1->width, plvdata); ph->Image = p1->image; ph->flags = p1->colFlags; InvalidateRect (hwnd, NULL, FALSE); return LV_OKAY; } case LVM_FINDITEM: { PLVFINDINFO p1; p1 = (PLVFINDINFO) lParam; return lvFindItem(p1, plvdata); } case LVM_DELITEM: { if (sRemoveItemFromList ((int)wParam, plvdata)) return LV_ERR; return LV_OKAY; } case LVM_DELALLITEM: { sRemoveAllItem (plvdata); return LV_OKAY; } //TODO case LVM_CLEARSUBITEM: break; case LVM_DELCOLUMN: { if (lvRemoveColumn ((int)wParam, plvdata)) return LV_ERR; return LV_OKAY; } case LVM_SELECTITEM: lvSelectItem (hwnd, (int)wParam, plvdata); return 0; case LVM_SHOWITEM: lvMakeItemVisible (hwnd, plvdata, (int)wParam); return 0; case LVM_CHOOSEITEM: lvSelectItem(hwnd, (int)wParam, plvdata); lvMakeItemVisible (hwnd, plvdata, (int)wParam); return 0; case LVM_GETITEMADDDATA: { PITEMDATA pitem = lvGetItemByRow (plvdata, (int)wParam); if (pitem) return pitem->addData; else return LV_ERR; } case LVM_SETITEMADDDATA: { PITEMDATA pitem = lvGetItemByRow (plvdata, (int)wParam); if (pitem) { pitem->addData = (DWORD)lParam; return LV_OKAY; } else return LV_ERR; } case LVM_SETSTRCMPFUNC: if (lParam) { plvdata->str_cmp = (STRCMP)lParam; return 0; } return -1; break; case MSG_VSCROLL: { lvVScroll (hwnd, wParam, lParam); return 0; } case MSG_HSCROLL: { lvHScroll (hwnd, wParam, lParam); return 0; } case MSG_FONTCHANGED: { if (plvdata->nItemHeight < LV_ITEMH_DEF(hwnd)) { plvdata->nItemHeight = LV_ITEMH_DEF(hwnd); } if (plvdata->nHeadHeight < LV_HDRH_DEF(hwnd)) { plvdata->nHeadHeight = LV_HDRH_DEF(hwnd); } lstSetVScrollInfo (plvdata); InvalidateRect (hwnd, NULL, FALSE); return 0; } case MSG_LBUTTONDBLCLK: { int mouseX = LOSWORD (lParam); int mouseY = HISWORD (lParam); PITEMDATA p2; if (isInLVItem (mouseX, mouseY, &p2, plvdata) > 0) NotifyParent (hwnd, GetDlgCtrlID(hwnd), LVN_ITEMDBCLK); break; } case MSG_RBUTTONUP: case MSG_RBUTTONDOWN: { int mouseX = LOSWORD (lParam); int mouseY = HISWORD (lParam); int nCols, nRows; RECT rcClient; PLSTHDR p1; PITEMDATA p2; LVNM_NORMAL lvnm; lvnm.wParam = wParam; lvnm.lParam = lParam; GetClientRect (hwnd, &rcClient); // clicks on the header if ( (nCols = isInListViewHead (mouseX, mouseY, &p1, plvdata)) > 0 ) { if (message == MSG_RBUTTONDOWN) NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_HEADRDOWN, (DWORD)&lvnm); else NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_HEADRUP, (DWORD)&lvnm); } // clicks on an item else if ( (nRows = isInLVItem (mouseX, mouseY, &p2, plvdata)) > 0) { if (message == MSG_RBUTTONDOWN) { lvSelectItem (hwnd, nRows, plvdata); lvMakeItemVisible (hwnd, plvdata, nRows); NotifyParent (hwnd, GetDlgCtrlID(hwnd), LVN_SELCHANGE); NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_ITEMRDOWN, (DWORD)&lvnm); } else { NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_ITEMRUP, (DWORD)&lvnm); } } break; } case MSG_KEYDOWN: { int id = LOWORD (wParam); LVNM_NORMAL lvnm; int nItem = 0; switch (id) { case SCANCODE_CURSORBLOCKDOWN: nItem = plvdata->nItemSelected+1; break; case SCANCODE_CURSORBLOCKUP: nItem = plvdata->nItemSelected-1; break; case SCANCODE_HOME: nItem = 1; break; case SCANCODE_END: nItem = plvdata->nRows; break; case SCANCODE_CURSORBLOCKLEFT: break; case SCANCODE_CURSORBLOCKRIGHT: break; case SCANCODE_PAGEUP: SendMessage (hwnd, MSG_VSCROLL, SB_PAGEUP, 0); break; case SCANCODE_PAGEDOWN: SendMessage (hwnd, MSG_VSCROLL, SB_PAGEDOWN, 0); break; } if (LV_BE_VALID_ROW(nItem)) { lvSelectItem (hwnd, nItem, plvdata); lvMakeItemVisible (hwnd, plvdata, nItem); } lvnm.wParam = wParam; lvnm.lParam = lParam; NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_KEYDOWN, (DWORD)&lvnm); break; } case MSG_DESTROY: { lvDataDestory (plvdata); break; } } return DefaultControlProc (hwnd, message, wParam, lParam);}BOOL RegisterListViewControl (void){ WNDCLASS WndClass; WndClass.spClassName = CTRL_LISTVIEW; WndClass.dwStyle = WS_NONE; WndClass.dwExStyle = WS_EX_NONE; WndClass.hCursor = GetSystemCursor (0); WndClass.iBkColor = PIXEL_lightwhite; WndClass.WinProc = sListViewProc; return RegisterWindowClass (&WndClass);}void ListViewControlCleanup (void){ UnregisterWindowClass (CTRL_LISTVIEW);}#endif /* _EXT_CTRL_LISTVIEW */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -