📄 listbox.c
字号:
else if (newTop > pData->itemCount - pData->itemVisibles) newTop = pData->itemCount - pData->itemVisibles; if (pData->itemTop != newTop) { pData->itemTop = newTop; if (pData->itemHilighted < pData->itemTop) pData->itemHilighted = pData->itemTop; if (pData->itemHilighted > ITEM_BOTTOM (pData)) pData->itemHilighted = ITEM_BOTTOM (pData); lstSetVScrollInfo (hwnd, pData, TRUE); InvalidateRect (hwnd, NULL, TRUE); } } break; case LB_SETCURSEL: case LB_SETCARETINDEX: { int new = (int)wParam; int old, newTop; pData = (PLISTBOXDATA)pCtrl->userdata; if (new < 0 || new > pData->itemCount - 1) return LB_ERR; old = pData->itemHilighted; if (new >= 0 && new != old) { if (pData->itemCount - new >= pData->itemVisibles) newTop = new; else newTop = max (pData->itemCount - pData->itemVisibles, 0); pData->itemTop = newTop; pData->itemHilighted = new; lstSetVScrollInfo (hwnd, pData, TRUE); } if (!(dwStyle & LBS_MULTIPLESEL)) lstSelectItem (dwStyle, pData, new); InvalidateRect (hwnd, NULL, TRUE); return old; } break; case LB_GETCOUNT: pData = (PLISTBOXDATA)pCtrl->userdata; return pData->itemCount; break; case LB_GETCURSEL: { PLISTBOXITEM plbi; int index = 0; pData = (PLISTBOXDATA)pCtrl->userdata; if (dwStyle & LBS_MULTIPLESEL) return pData->itemHilighted; plbi = pData->head; while (plbi) { if (plbi->dwFlags & LBIF_SELECTED) return index; index ++; plbi = plbi->next; } return LB_ERR; } break; case LB_GETSELCOUNT: { int nSel; PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->userdata; nSel = 0; plbi = pData->head; while (plbi) { if (plbi->dwFlags & LBIF_SELECTED) nSel ++; plbi = plbi->next; } return nSel; } break; case LB_GETTOPINDEX: pData = (PLISTBOXDATA)pCtrl->userdata; return pData->itemTop; break; case LB_GETCARETINDEX: pData = (PLISTBOXDATA)pCtrl->userdata; return pData->itemHilighted; break; case LB_GETTEXTLEN: { PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->userdata; plbi = lstGetItem (pData, (int)wParam); if (plbi) return strlen (plbi->key); else return LB_ERR; } break; case LB_GETTEXT: { PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->userdata; plbi = lstGetItem (pData, (int)wParam); if (plbi) strcpy ((char*)lParam, plbi->key); else return LB_ERR; } break; case LB_SETTEXT: { PLISTBOXITEM plbi; char* newStr; pData = (PLISTBOXDATA)pCtrl->userdata; plbi = lstGetItem (pData, (int)wParam); if (plbi) { newStr = FixStrAlloc (strlen ((char*)lParam)); if (newStr) { FreeFixStr (plbi->key); plbi->key = newStr; strcpy (plbi->key, (char*)lParam); lstInvalidateItem (hwnd, pData, (int)wParam, TRUE); } else return LB_ERR; } else return LB_ERR; } break; case LB_GETITEMDATA: { PLISTBOXITEM plbi; PLISTBOXITEMINFO plbii; pData = (PLISTBOXDATA)pCtrl->userdata; if (!(plbi = lstGetItem (pData, (int)wParam))) return LB_ERR; if (!(dwStyle & LBS_CHECKBOX || dwStyle & LBS_USEICON)) { return plbi->dwData; } plbii = (PLISTBOXITEMINFO)lParam; if (!plbii) return LB_ERR; if (plbi->dwFlags & LBIF_CHECKED) plbii->cmFlag = CMFLAG_CHECKED; else if (plbi->dwFlags & LBIF_PARTCHECKED) plbii->cmFlag = CMFLAG_PARTCHECKED; else plbii->cmFlag = CMFLAG_BLANK; plbii->hIcon = (HICON)plbi->dwData; return LB_OKAY; } break; case LB_SETITEMDATA: { PLISTBOXITEM plbi; PLISTBOXITEMINFO plbii; pData = (PLISTBOXDATA)pCtrl->userdata; if (!(plbi = lstGetItem (pData, (int)wParam))) return LB_ERR; if (!(dwStyle & LBS_CHECKBOX || dwStyle & LBS_USEICON)) { plbi->dwData = (DWORD)lParam; return LB_OKAY; } plbii = (PLISTBOXITEMINFO)lParam; if (!plbii) return LB_ERR; plbi->dwFlags &= ~LBIF_CHECKMARKMASK; switch (plbii->cmFlag) { case CMFLAG_CHECKED: plbi->dwFlags |= LBIF_CHECKED; break; case CMFLAG_PARTCHECKED: plbi->dwFlags |= LBIF_PARTCHECKED; break; } if (dwStyle & LBS_USEICON) plbi->dwData = (DWORD)plbii->hIcon; else plbi->dwData = 0; lstInvalidateItem (hwnd, pData, (int)wParam, TRUE); return LB_OKAY; } break; case LB_GETITEMADDDATA: { PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->userdata; if (!(plbi = lstGetItem (pData, (int)wParam))) return LB_ERR; return plbi->dwAddData; } break; case LB_SETITEMADDDATA: { PLISTBOXITEM plbi; pData = (PLISTBOXDATA)pCtrl->userdata; if (!(plbi = lstGetItem (pData, (int)wParam))) return LB_ERR; plbi->dwAddData = (DWORD)lParam; return LB_OKAY; } break; case LB_GETCHECKMARK: { PLISTBOXITEM plbi; if (!(dwStyle & LBS_CHECKBOX)) return LB_ERR; pData = (PLISTBOXDATA)pCtrl->userdata; if (!(plbi = lstGetItem (pData, (int)wParam))) return LB_ERR; if (plbi->dwFlags & LBIF_CHECKED) return CMFLAG_CHECKED; if (plbi->dwFlags & LBIF_PARTCHECKED) return CMFLAG_PARTCHECKED; return CMFLAG_BLANK; } break; case LB_SETCHECKMARK: { PLISTBOXITEM plbi; if (!(dwStyle & LBS_CHECKBOX)) return LB_ERR; pData = (PLISTBOXDATA)pCtrl->userdata; if (!(plbi = lstGetItem (pData, (int)wParam))) return LB_ERR; plbi->dwFlags &= ~LBIF_CHECKMARKMASK; 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->userdata; 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->userdata; 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->userdata; plbi = lstGetItem (pData, (int)lParam); if (plbi) { pData->dwFlags &= ~LBF_NOTHINGSELECTED; 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->userdata; return pData->itemHeight; break; case LB_SETITEMHEIGHT: pData = (PLISTBOXDATA)pCtrl->userdata; 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); } break; case WM_SETFOCUS: { pData = (PLISTBOXDATA)pCtrl->userdata; if (pData->dwFlags & LBF_FOCUS) break; pData->dwFlags |= LBF_FOCUS; InvalidateRect(hwnd, NULL, TRUE); NotifyParent (hwnd, pCtrl->id, LBN_SETFOCUS); } break; case WM_KILLFOCUS: { pData = (PLISTBOXDATA)pCtrl->userdata; pData->dwFlags &= ~LBF_FOCUS; InvalidateRect(hwnd, NULL, TRUE); NotifyParent (hwnd, pCtrl->id, LBN_KILLFOCUS); } break; case WM_GETDLGCODE: return DLGC_WANTARROWS | DLGC_WANTCHARS; case WM_GETTEXTLENGTH: case WM_GETTEXT: case WM_SETTEXT: return -1;#if 0 case WM_SETFONT: break; case WM_GETFONT: break;#endif case WM_NCCALCSIZE: {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -