📄 listbox.c
字号:
case MSG_GETTEXTLENGTH: case MSG_GETTEXT: case MSG_SETTEXT: return -1; case MSG_PAINT: { RECT rc; hdc = BeginPaint (hwnd); GetClientRect (hwnd, &rc); pData = (PLISTBOXDATA)pCtrl->dwAddData2; lstOnDrawSListBoxItems (hdc, dwStyle, pData, RECTW (rc)); SetPenColor (hdc, PIXEL_lightwhite); lstDrawFocusRect (hdc, pData, &rc); EndPaint(hwnd,hdc); } return 0; case MSG_LBUTTONDBLCLK: if (dwStyle & LBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, LBN_DBLCLK); break; case MSG_LBUTTONDOWN: { int oldSel, mouseX, mouseY, hit; RECT rcInv; BOOL click_mark = FALSE; pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (pData->itemCount == 0) break; mouseX = LOSWORD (lParam); mouseY = HISWORD (lParam); hit = mouseY / pData->itemHeight; hit += pData->itemTop; if (hit >= pData->itemCount) break; oldSel = lstSelectItem (dwStyle, pData, hit); if (dwStyle & LBS_CHECKBOX) { if (mouseX > 0 && mouseX < LST_WIDTH_CHECKMARK) { click_mark = TRUE; if (dwStyle & LBS_NOTIFY) 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); } } } GetClientRect (hwnd, &rcInv); if ((dwStyle & LBS_NOTIFY)) { if (!click_mark) NotifyParent (hwnd, pCtrl->id, LBN_CLICKED); if (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); SetPenColor (hdc, PIXEL_lightwhite); lstDrawFocusRect (hdc, pData, &rcInv); ReleaseDC (hdc); } pData->itemHilighted = hit; lstSetVScrollInfo (hwnd, pData, TRUE); } break; case LB_GETITEMRECT: { RECT rcClient, *rcItem; int index; rcItem = (RECT*)lParam; index = wParam; pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (pData->itemCount == 0 || index > pData->itemCount) return LB_ERR; GetClientRect ( hwnd, &rcClient ); rcItem->right = rcClient.right; rcItem->left = rcClient.left; rcItem->top = (index-pData->itemTop)*pData->itemHeight; rcItem->bottom = (index-pData->itemTop+1)*(pData->itemHeight); return LB_OKAY; } case MSG_KEYDOWN: { int oldSel, newSel, newTop; RECT rcInv; pData = (PLISTBOXDATA)pCtrl->dwAddData2; if (pData->itemCount == 0) break; 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; case SCANCODE_ENTER: if (dwStyle & LBS_NOTIFY) NotifyParent (hwnd, pCtrl->id, LBN_ENTER); return 0; 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); SetPenColor (hdc, PIXEL_lightwhite); lstDrawFocusRect (hdc, pData, &rcInv); ReleaseDC (hdc); pData->itemHilighted = newSel; lstGetItemsRect (pData, newSel, newSel, &rcInv); InvalidateRect (hwnd, &rcInv, TRUE); } else { hdc = GetClientDC (hwnd); SetPenColor (hdc, PIXEL_lightwhite); lstDrawFocusRect (hdc, pData, &rcInv); pData->itemHilighted = newSel; GetClientRect (hwnd, &rcInv); lstDrawFocusRect (hdc, pData, &rcInv); ReleaseDC (hdc); } } lstSetVScrollInfo (hwnd, pData, TRUE); } } break; case MSG_CHAR: { unsigned 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) { if (dwStyle & LBS_NOTIFY) 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)) { int oldSel = lstSelectItem (dwStyle, pData, index); if ((dwStyle & LBS_NOTIFY) && (oldSel != index)) NotifyParent (hwnd, pCtrl->id, LBN_SELCHANGE); } 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 = MIN ((int)lParam, (pData->itemCount - pData->itemVisibles)); scrollHeight = (pData->itemTop - newTop)*pData->itemHeight; break; } if (scrollHeight) { pData->itemTop = newTop; lstSetVScrollInfo (hwnd, pData, TRUE); UpdateWindow (hwnd, 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);}#endif /* _CTRL_LISTBOX */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -