📄 listbox.c
字号:
pData->itemHilighted = pData->itemTop;
if (pData->itemHilighted > ITEM_BOTTOM (pData))
pData->itemHilighted = ITEM_BOTTOM (pData);
lstSetVScrollInfo (hwnd, pData, TRUE);
InvalidateRect (hwnd, NULL, TRUE);
}
return 0;
}
case LB_SETCURSEL:
case LB_SETCARETINDEX:
{
int new = (int)wParam;
int old, newTop;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (new < 0 || new > pData->itemCount - 1) {
if (dwStyle & LBS_MULTIPLESEL)
return LB_ERR;
else
return lstCancelSelected (hwnd, pData);
}
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 (hwnd, pData, new);
InvalidateRect (hwnd, NULL, TRUE);
return old;
}
case LB_GETCOUNT:
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
return pData->itemCount;
case LB_GETCURSEL:
{
PLISTBOXITEM plbi;
int index = 0;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
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;
}
case LB_GETSELCOUNT:
{
int nSel;
PLISTBOXITEM plbi;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
nSel = 0;
plbi = pData->head;
while (plbi) {
if (plbi->dwFlags & LBIF_SELECTED)
nSel ++;
plbi = plbi->next;
}
return nSel;
}
case LB_GETTOPINDEX:
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
return pData->itemTop;
case LB_GETCARETINDEX:
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
return pData->itemHilighted;
case LB_GETTEXTLEN:
{
PLISTBOXITEM plbi;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
plbi = lstGetItem (pData, (int)wParam);
if (plbi)
return strlen (plbi->key);
return LB_ERR;
}
case LB_GETTEXT:
{
PLISTBOXITEM plbi;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
plbi = lstGetItem (pData, (int)wParam);
if (plbi) {
strcpy ((char*)lParam, plbi->key);
return LB_OKAY;
}
return LB_ERR;
}
case LB_SETTEXT:
{
PLISTBOXITEM plbi;
char* newStr;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
plbi = lstGetItem (pData, (int)wParam);
if (plbi) {
#if _USE_FIXSTR
len = strlen ((char*)lParam);
newStr = FixStrAlloc (len);
if (newStr) {
FreeFixStr (plbi->key);
plbi->key = newStr;
if (len > 0)
strcpy (plbi->key, (char*)lParam);
#else
newStr = strdup ((const char*)lParam);
if (newStr) {
free (plbi->key);
plbi->key = newStr;
#endif
lstInvalidateItem (hwnd, pData, (int)wParam);
}
else
return LB_ERR;
}
return LB_ERR;
}
case LB_GETITEMDATA:
{
PLISTBOXITEM plbi;
PLISTBOXITEMINFO plbii;
if (!(dwStyle & LBS_CHECKBOX || dwStyle & LBS_USEICON)) {
return LB_ERR;
}
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (!(plbi = lstGetItem (pData, (int)wParam)))
return LB_ERR;
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;
if (plbi->dwFlags & LBIF_USEBITMAP)
plbii->cmFlag |= IMGFLAG_BITMAP;
plbii->hIcon = (HICON)plbi->dwImage;
return LB_OKAY;
}
case LB_SETITEMDATA:
{
PLISTBOXITEM plbi;
PLISTBOXITEMINFO plbii;
if (!(dwStyle & LBS_CHECKBOX || dwStyle & LBS_USEICON)) {
return LB_ERR;
}
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (!(plbi = lstGetItem (pData, (int)wParam)))
return LB_ERR;
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->dwImage = (DWORD)plbii->hIcon;
else
plbi->dwImage = 0;
lstInvalidateItem (hwnd, pData, (int)wParam);
return LB_OKAY;
}
case LB_GETITEMADDDATA:
{
PLISTBOXITEM plbi;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (!(plbi = lstGetItem (pData, (int)wParam)))
return LB_ERR;
return plbi->dwAddData;
}
case LB_SETITEMADDDATA:
{
PLISTBOXITEM plbi;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (!(plbi = lstGetItem (pData, (int)wParam)))
return LB_ERR;
plbi->dwAddData = (DWORD)lParam;
return LB_OKAY;
}
case LB_GETCHECKMARK:
{
PLISTBOXITEM plbi;
if (!(dwStyle & LBS_CHECKBOX))
return LB_ERR;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
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;
}
case LB_SETCHECKMARK:
{
PLISTBOXITEM plbi;
if (!(dwStyle & LBS_CHECKBOX))
return LB_ERR;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
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);
return LB_OKAY;
}
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;
return LB_ERR;
}
case LB_SETSEL:
{
PLISTBOXITEM plbi;
if (!(dwStyle & LBS_MULTIPLESEL))
return LB_ERR;
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);
}
return LB_ERR;
}
case LB_GETITEMHEIGHT:
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
return pData->itemHeight;
case LB_SETITEMHEIGHT:
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (pData->itemHeight != LOWORD (lParam)) {
RECT rcClient;
pData->itemHeight = LOWORD (lParam);
if (pData->itemHeight < pCtrl->pLogFont->size)
pData->itemHeight = pCtrl->pLogFont->size;
GetClientRect (hwnd, &rcClient);
lstCalcParams (&rcClient, pData);
lstSetVScrollInfo (hwnd, pData, TRUE);
InvalidateRect (hwnd, NULL, TRUE);
}
return pData->itemHeight;
case MSG_SETFOCUS:
{
RECT rc;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (pData->dwFlags & LBF_FOCUS)
break;
pData->dwFlags |= LBF_FOCUS;
if (pData->itemHilighted >= 0) {
GetClientRect (hwnd, &rc);
lstGetItemsRect (pData, pData->itemHilighted, pData->itemHilighted, &rc);
InvalidateRect (hwnd, &rc, TRUE);
}
if (dwStyle & LBS_NOTIFY)
NotifyParent (hwnd, pCtrl->id, LBN_SETFOCUS);
break;
}
//return 0;
case MSG_KILLFOCUS:
{
RECT rc;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
if (pData->itemHilighted >= 0) {
GetClientRect (hwnd, &rc);
lstGetItemsRect (pData, pData->itemHilighted, pData->itemHilighted, &rc);
InvalidateRect (hwnd, &rc, TRUE);
}
pData->dwFlags &= ~LBF_FOCUS;
if (dwStyle & LBS_NOTIFY)
NotifyParent (hwnd, pCtrl->id, LBN_KILLFOCUS);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -