📄 listbox.c
字号:
}
//return 0;
case MSG_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTCHARS | DLGC_WANTENTER;
case MSG_FONTCHANGED:
{
RECT rcClient;
pData = (PLISTBOXDATA)pCtrl->dwAddData2;
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 0;
}
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 (hwnd, hdc, pData, RECTW (rc));
//lstDrawFocusRect (hwnd, hdc, pData);
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 (hwnd, 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);
}
}
}
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, pData->itemHilighted, pData->itemHilighted, &rcInv);
InvalidateRect (hwnd, &rcInv, TRUE);
pData->itemHilighted = hit;
lstGetItemsRect (pData, hit, hit, &rcInv);
InvalidateRect (hwnd, &rcInv, TRUE);
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 (hwnd, 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 (hwnd, 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;
}
pData->itemHilighted = newSel;
lstGetItemsRect (pData, newSel, newSel, &rcInv);
InvalidateRect (hwnd, &rcInv, TRUE);
}
else {
lstGetItemsRect (pData, pData->itemHilighted, pData->itemHilighted, &rcInv);
InvalidateRect (hwnd, &rcInv, TRUE);
pData->itemHilighted = newSel;
lstGetItemsRect (pData, newSel, newSel, &rcInv);
InvalidateRect (hwnd, &rcInv, TRUE);
}
}
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 (hwnd, 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);
}
}
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 (hwnd, 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);
InvalidateRect (hwnd, NULL, 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 + -