📄 listbox.c
字号:
switch (lParam) { case CMFLAG_CHECKED: plbi->dwFlags |= LBIF_CHECKED; break; case CMFLAG_PARTCHECKED: plbi->dwFlags |= LBIF_PARTCHECKED; break; } lstInvalidateItem (hwnd, pData, (int)wParam, TRUE); return LB_OKAY; } break; case LB_GETSELITEMS: { int nItem; int nSel = 0; int index = 0; int* pInt; PLISTBOXITEM plbi; nItem = (int)wParam; pInt = (int*)lParam; pData = (PLISTBOXDATA)pCtrl->dwAddData2; plbi = pData->head; while (plbi) { if (plbi->dwFlags & LBIF_SELECTED) { if (pInt) { if (nSel < nItem) *(pInt + nSel) = index; else return nItem; } nSel ++; } plbi = plbi->next; index ++; } return nSel; } break; case LB_GETSEL: { PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->dwAddData2; plbi = lstGetItem (pData, (int)wParam); if (plbi) return plbi->dwFlags & LBIF_SELECTED; else return LB_ERR; } break; case LB_SETSEL: { PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->dwAddData2; plbi = lstGetItem (pData, (int)lParam); if (plbi) { if (wParam == -1) plbi->dwFlags ^= LBIF_SELECTED; else if (wParam == 0) plbi->dwFlags &= ~LBIF_SELECTED; else plbi->dwFlags |= LBIF_SELECTED; lstInvalidateItem (hwnd, pData, (int)lParam, FALSE); } else return LB_ERR; } break; case LB_GETITEMHEIGHT: pData = (PLISTBOXDATA)pCtrl->dwAddData2; return pData->itemHeight; break; case LB_SETITEMHEIGHT: pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (pData->itemHeight != LOWORD (lParam)) { RECT rcClient; pData->itemHeight = LOWORD (lParam); GetClientRect (hwnd, &rcClient); lstCalcParams (&rcClient, pData); lstSetVScrollInfo (hwnd, pData, TRUE); InvalidateRect (hwnd, NULL, TRUE); } return 0; case MSG_SETFOCUS: { RECT rc; pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (pData->dwFlags & LBF_FOCUS) break; pData->dwFlags |= LBF_FOCUS; GetClientRect (hwnd, &rc); hdc = GetClientDC (hwnd); lstDrawFocusRect (hdc, pData, &rc); ReleaseDC (hdc); NotifyParent (hwnd, pCtrl->id, LBN_SETFOCUS); } return 0; case MSG_KILLFOCUS: { RECT rc; GetClientRect (hwnd, &rc); pData = (PLISTBOXDATA)pCtrl->dwAddData2; hdc = GetClientDC (hwnd); lstDrawFocusRect (hdc, pData, &rc); ReleaseDC (hdc); pData->dwFlags &= ~LBF_FOCUS; NotifyParent (hwnd, pCtrl->id, LBN_KILLFOCUS); } return 0; case MSG_GETDLGCODE: return DLGC_WANTARROWS | DLGC_WANTCHARS; break; case MSG_GETTEXTLENGTH: case MSG_GETTEXT: case MSG_SETTEXT: return -1; case MSG_SETFONT: break; case MSG_GETFONT: break; case MSG_PAINT: { RECT rc; hdc = BeginPaint (hwnd); GetClientRect (hwnd, &rc); pData = (PLISTBOXDATA)pCtrl->dwAddData2; lstOnDrawSListBoxItems (hdc, dwStyle, pData, RECTW (rc)); lstDrawFocusRect (hdc, pData, &rc); EndPaint(hwnd,hdc); } break; case MSG_LBUTTONDBLCLK: if (dwStyle & LBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, LBN_DBLCLK); break; case MSG_LBUTTONDOWN: { int oldSel, mouseX, mouseY, hit; RECT rcInv; pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (pData->itemCount == 0) break; mouseX = LOWORD (lParam); mouseY = HIWORD (lParam); hit = mouseY / pData->itemHeight; hit += pData->itemTop; if (hit >= pData->itemCount) break; GetClientRect (hwnd, &rcInv); oldSel = lstSelectItem (dwStyle, pData, hit); if ((dwStyle & LBS_NOTIFY) && (oldSel != hit)) NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE); if (oldSel >= 0) { if (oldSel >= pData->itemTop && (oldSel <= pData->itemTop + pData->itemVisibles)) { lstGetItemsRect (pData, oldSel, oldSel, &rcInv); InvalidateRect (hwnd, &rcInv, TRUE); } } lstGetItemsRect (pData, hit, hit, &rcInv); InvalidateRect (hwnd, &rcInv, TRUE); if (pData->itemHilighted != hit) { hdc = GetClientDC (hwnd); lstDrawFocusRect (hdc, pData, &rcInv); ReleaseDC (hdc); } pData->itemHilighted = hit; if (dwStyle & LBS_CHECKBOX) { if (mouseX > 0 && mouseX < LST_WIDTH_CHECKMARK) { NotifyParent (hwnd, pCtrl->id, LBN_CLICKCHECKMARK); if (dwStyle & LBS_AUTOCHECK) { PLISTBOXITEM plbi; plbi = lstGetItem (pData, hit); switch (plbi->dwFlags & LBIF_CHECKMARKMASK) { case LBIF_CHECKED: plbi->dwFlags &= ~LBIF_CHECKMARKMASK; break; default: plbi->dwFlags &= ~LBIF_CHECKMARKMASK; plbi->dwFlags |= LBIF_CHECKED; break; } lstInvalidateItem (hwnd, pData, hit, TRUE); } } } lstSetVScrollInfo (hwnd, pData, TRUE); } break; case MSG_LBUTTONUP: break; case MSG_MOUSEMOVE: break; case MSG_KEYDOWN: { int oldSel, newSel, newTop; RECT rcInv; pData = (PLISTBOXDATA)pCtrl->dwAddData2; newTop = pData->itemTop; newSel = pData->itemHilighted; switch (LOWORD (wParam)) { case SCANCODE_HOME: newSel = 0; newTop = 0; break; case SCANCODE_END: newSel = pData->itemCount - 1; if (pData->itemCount > pData->itemVisibles) newTop = pData->itemCount - pData->itemVisibles; else newTop = 0; break; case SCANCODE_CURSORBLOCKDOWN: newSel ++; if (newSel >= pData->itemCount) return 0; if (newSel > ITEM_BOTTOM (pData)) newTop ++; break; case SCANCODE_CURSORBLOCKUP: newSel --; if (newSel < 0) return 0; if (newSel < pData->itemTop) newTop --; break; case SCANCODE_PAGEDOWN: newSel += pData->itemVisibles; if (newSel >= pData->itemCount) newSel = pData->itemCount - 1; if (pData->itemCount - newSel >= pData->itemVisibles) newTop = newSel; else newTop = max (pData->itemCount-pData->itemVisibles, 0); break; case SCANCODE_PAGEUP: newSel -= pData->itemVisibles; if (newSel < 0) newSel = 0; newTop -= pData->itemVisibles; if (newTop < 0) newTop = 0; break; default: return 0; } GetClientRect (hwnd, &rcInv); if (pData->itemHilighted != newSel) { if (pData->itemTop != newTop) { pData->itemTop = newTop; pData->itemHilighted = newSel; if (!(dwStyle & LBS_MULTIPLESEL)) { oldSel = lstSelectItem (dwStyle, pData, newSel); if ((dwStyle & LBS_NOTIFY) && (oldSel != newSel)) NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE); } InvalidateRect (hwnd, NULL, TRUE); } else { if (!(dwStyle & LBS_MULTIPLESEL)) { oldSel = lstSelectItem (dwStyle, pData, newSel); if ((dwStyle & LBS_NOTIFY) && (oldSel != newSel)) NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE); if (oldSel >= 0) { if (oldSel >= pData->itemTop && oldSel <= (ITEM_BOTTOM (pData) + 1)) { lstGetItemsRect (pData, oldSel, oldSel, &rcInv); InvalidateRect (hwnd, &rcInv, TRUE); } } if (newSel < newTop) { pData->itemHilighted = newSel; break; } lstGetItemsRect (pData, pData->itemHilighted, pData->itemHilighted, &rcInv); hdc = GetClientDC (hwnd); lstDrawFocusRect (hdc, pData, &rcInv); ReleaseDC (hdc); pData->itemHilighted = newSel; lstGetItemsRect (pData, newSel, newSel, &rcInv); InvalidateRect (hwnd, &rcInv, TRUE); } else { hdc = GetClientDC (hwnd); lstDrawFocusRect (hdc, pData, &rcInv); pData->itemHilighted = newSel; GetClientRect (hwnd, &rcInv); lstDrawFocusRect (hdc, pData, &rcInv); ReleaseDC (hdc); } } lstSetVScrollInfo (hwnd, pData, TRUE); } } break; case MSG_CHAR: { char head [2]; int index; int newTop; if (HIBYTE (wParam)) break; head [0] = LOBYTE (wParam); head [1] = '\0'; pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (head[0] == ' ') { if (dwStyle & LBS_MULTIPLESEL) { RECT rcInv; GetClientRect (hwnd, &rcInv); lstSelectItem (dwStyle, pData, pData->itemHilighted); lstGetItemsRect (pData, pData->itemHilighted, pData->itemHilighted, &rcInv); InvalidateRect (hwnd, &rcInv, TRUE); } else if (dwStyle & LBS_CHECKBOX) { NotifyParent (hwnd, pCtrl->id, LBN_CLICKCHECKMARK); if (dwStyle & LBS_AUTOCHECK) { PLISTBOXITEM plbi; plbi = lstGetItem (pData, pData->itemHilighted); switch (plbi->dwFlags & LBIF_CHECKMARKMASK) { case LBIF_CHECKED: plbi->dwFlags &= ~LBIF_CHECKMARKMASK; break; default: plbi->dwFlags &= ~LBIF_CHECKMARKMASK; plbi->dwFlags |= LBIF_CHECKED; break; } lstInvalidateItem (hwnd, pData, pData->itemHilighted, TRUE); } } break; } index = lstFindItem (pData, pData->itemHilighted + 1, head, FALSE); if (index < 0) { index = lstFindItem (pData, 0, head, FALSE); } if (index >= 0) { if (pData->itemCount - index >= pData->itemVisibles) newTop = index; else newTop = max (pData->itemCount - pData->itemVisibles, 0); pData->itemTop = newTop; pData->itemHilighted = index; if (!(dwStyle & LBS_MULTIPLESEL)) lstSelectItem (dwStyle, pData, index); InvalidateRect (hwnd, NULL, TRUE); lstSetVScrollInfo (hwnd, pData, TRUE); } } break; case MSG_VSCROLL: { int newTop; int scrollHeight = 0; pData = (PLISTBOXDATA)pCtrl->dwAddData2; newTop = pData->itemTop; switch(wParam) { case SB_LINEDOWN: if (ITEM_BOTTOM (pData) < (pData->itemCount - 1)) { newTop ++; scrollHeight = -pData->itemHeight; } break; case SB_LINEUP: if (pData->itemTop > 0) { newTop --; scrollHeight = pData->itemHeight; } break; case SB_PAGEDOWN: if ((pData->itemTop + (pData->itemVisibles << 1)) <= pData->itemCount) newTop += pData->itemVisibles; else newTop = pData->itemCount - pData->itemVisibles; if (newTop < 0) return 0; scrollHeight = -(newTop - pData->itemTop) *pData->itemHeight; break; case SB_PAGEUP: if (pData->itemTop >= pData->itemVisibles) newTop -= pData->itemVisibles; else newTop = 0; scrollHeight = (pData->itemTop - newTop)*pData->itemHeight; break; case SB_THUMBTRACK: newTop = (int)lParam; scrollHeight = (pData->itemTop - newTop)*pData->itemHeight; break; } if (scrollHeight) { pData->itemTop = newTop; ScrollWindow (hwnd, 0, scrollHeight, NULL, NULL); SendMessage (hwnd, MSG_PAINT, 0, 0); lstSetVScrollInfo (hwnd, pData, TRUE); return 0; } } break; case MSG_HSCROLL: pData = (PLISTBOXDATA)pCtrl->dwAddData2; switch (wParam) { case SB_LINERIGHT: break; case SB_LINELEFT: break; case SB_PAGELEFT: break; case SB_PAGERIGHT: break; } break; } return DefaultControlProc (hwnd, message, wParam, lParam);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -