📄 combobox.c
字号:
lp->ListBoxRect.top + ((lp->uHeight-2) * nitems);
#endif
fprintf(stderr," (2.5)lp->ListBoxRect:(%d,%d,%d,%d)\n",
lp->ListBoxRect.left,
lp->ListBoxRect.top,
lp->ListBoxRect.right,
lp->ListBoxRect.bottom);
/* jmt: twine->mwin bug fixed: */
fprintf(stderr," 706: fixed: SetWindowPos(lp->ListBoxControl,,%d,%d,...)\n",cp.x,cp.y);
#if 0 /* twine->mwin bug */
SetWindowPos(lp->ListBoxControl,HWND_TOP,0,0,
lp->ListBoxRect.right - lp->ListBoxRect.left,
lp->ListBoxRect.bottom - lp->ListBoxRect.top,
SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
#else /* jmt: twine->mwin bug fixed: */
SetWindowPos(lp->ListBoxControl,HWND_TOP,cp.x,cp.y,
lp->ListBoxRect.right - lp->ListBoxRect.left,
lp->ListBoxRect.bottom - lp->ListBoxRect.top,
SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
#endif
#if 0
}
#endif
SET_STATE(lp, CSF_HASDROPPED);
}
/* End of addition */
ShowWindow(lp->ListBoxControl, SW_SHOW);
#if 0 /* orig(twine) */
SetFocus(lp->ListBoxControl);
#else /* jmt: mwclient */
SetForegroundWindow(lp->ListBoxControl);
#endif
CBoxCapture(hWnd, 1);
SET_STATE(lp, CSF_CAPTUREACTIVE);
SET_STATE(lp, CSF_BUTTONDOWN);
}
}
else
{ /* there is a listbox visible */
HWND hwndNewFocus = 0;
cpScreen = cp;
if ((lp->wStyle & 0xf) != CBS_SIMPLE)
{
ClientToScreen(hWnd, &cpScreen);
hwndNewFocus = WindowFromPoint(cpScreen);
}
fprintf(stderr," (3)lp->ListBoxRect:(%d,%d,%d,%d)\n",
lp->ListBoxRect.left,
lp->ListBoxRect.top,
lp->ListBoxRect.right,
lp->ListBoxRect.bottom);
if (PtInRect(&lp->ListBoxRect, cpScreen))
{
CBoxSendMouseToLBox(lp, WM_LBUTTONDOWN, wParam, cpScreen);
}
else
{
if (PtInRect(&lp->ButtonRect, cp))
CBoxDrawButton(hWnd, 0, lp);
if ((lp->wStyle & 0x0F) == CBS_DROPDOWN && hwndNewFocus == lp->EditControl)
/* don't close listbox */;
else {
SendMessage(lp->hWndParent, WM_COMMAND, GET_WM_COMMAND_MPS(lp->nID,hWnd,CBN_CLOSEUP));
fprintf(stderr," 802: (hide) SetWindowPos(lp->ListBoxControl, , 0, 0, 0, 0,..)\n");
SetWindowPos(lp->ListBoxControl, 0,
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_HIDEWINDOW);
#if MWCLIENT
MwLowerWindow(lp->ListBoxControl);
#endif
CBoxCapture(hWnd, 0);
CLEAR_STATE(lp, CSF_BUTTONDOWN);
}
CLEAR_STATE(lp, CSF_CAPTUREACTIVE);
if (hwndNewFocus && hwndNewFocus != hWnd)
{
ScreenToClient(hwndNewFocus, &cpScreen);
SetFocus(hwndNewFocus);
SendMessage(hwndNewFocus, WM_LBUTTONDOWN, wParam, MAKELONG(cpScreen.x, cpScreen.y));
}
} /* !(PtInRect(&lp->ListBoxRect, cpScreen)) */
}
break;
/* jmt: twine->mwin bug fixed: */
case WM_NCMOUSEMOVE:
#if 0 /* jmt: twine->mw buggy */
case WM_MOUSEMOVE:
#endif
if (!IS_SET(lp,CSF_BUTTONDOWN) && ((lp->wStyle & 0xf) == CBS_SIMPLE))
break;
cp.x = (int)(short)LOWORD(lParam);
cp.y = (int)(short)HIWORD(lParam);
#if 1 /* WM_NCMOUSEMOVE: */
ScreenToClient(hWnd, &cp); /* jmt: a must */
#endif
if (IS_SET(lp, CSF_CAPTUREACTIVE))
{
if (PtInRect(&lp->ButtonRect,cp))
{
if (!IS_SET(lp, CSF_LOCALBUTTONDOWN))
CBoxDrawButton(hWnd, 1, lp);
break;
}
if ((lp->wStyle & 0xf) != CBS_SIMPLE)
ClientToScreen(hWnd,&cp);
if (PtInRect(&lp->ListBoxRect,cp))
{
CBoxSendMouseToLBox(lp,WM_MOUSEMOVE,wParam,cp);
}
if (IS_SET(lp,CSF_LOCALBUTTONDOWN) && ((lp->wStyle & 0xf) != CBS_SIMPLE))
CBoxDrawButton(hWnd,0,lp);
}
break;
/* jmt: twine->mwin bug fixed: */
case WM_NCLBUTTONUP:
#if 0 /* twine->mw buggy */
case WM_LBUTTONUP:
#endif
if (!IS_SET(lp, CSF_CAPTUREACTIVE))
break;
cp.x = (int)(short)LOWORD(lParam);
cp.y = (int)(short)HIWORD(lParam);
#if 1 /* WM_NCLBUTTONUP */
ScreenToClient(hWnd, &cp); /* jmt: a must */
#endif
CLEAR_STATE(lp,CSF_BUTTONDOWN);
if (PtInRect(&lp->ButtonRect, cp))
/*(lp->wStyle & 0x0F) == CBS_DROPDOWNLIST)*/
{
if (PtInRect(&lp->ButtonRect, cp))
CBoxDrawButton(hWnd, 0, lp);
if (IS_SET(lp, CSF_LBOXBUTTONDOWN))
{
if ((lp->wStyle & 0xf) != CBS_SIMPLE)
ClientToScreen(hWnd, &cp);
CBoxSendMouseToLBox(lp, WM_LBUTTONUP, wParam, cp);
CLEAR_STATE(lp,CSF_LBOXBUTTONDOWN);
}
break;
}
if ((lp->wStyle & 0xf) != CBS_SIMPLE)
ClientToScreen(hWnd, &cp);
if (PtInRect(&lp->ListBoxRect, cp))
{
uiKey = (UINT)SendMessage(lp->ListBoxControl, LB_GETCURSEL, 0, 0);
if (uiKey != (UINT)LB_ERR)
{
if (lp->EditControl)
{
SetFocus(lp->EditControl);
CBoxDrawEdit(lp, hWnd, uiKey);
}
else {
SetFocus(hWnd);
CBoxDrawStatic(lp, hWnd, uiKey);
}
/* LATER check the WS_EX_NOPARENTNOTIFY bit in ext style.*/
/* ecw */ SendMessage(lp->hWndParent, WM_COMMAND, GET_WM_COMMAND_MPS(lp->nID,hWnd,CBN_SELENDOK));
SendMessage(lp->hWndParent, WM_COMMAND, GET_WM_COMMAND_MPS(lp->nID,hWnd,CBN_CLOSEUP));
fprintf(stderr," 844: (hide) SetWindowPos(lp->ListBoxControl, , 0, 0, 0, 0,..)\n");
SetWindowPos(lp->ListBoxControl, 0,
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_HIDEWINDOW);
CBoxCapture(hWnd, 0);
CLEAR_STATE(lp,CSF_CAPTUREACTIVE);
} /* uiKey ok */
CBoxSendMouseToLBox(lp, WM_LBUTTONUP, wParam, cp);
CLEAR_STATE(lp,CSF_LBOXBUTTONDOWN);
#if MWCLIENT
#if 0
GrLowerWindow(lp->ListBoxControl->wid);
#endif
MwLowerWindow(lp->ListBoxControl);
#endif
}
else /* clicked somewhere outside button or listbox -
** the listbox should stay intact... MiD
*/
if (IS_SET(lp, CSF_LBOXBUTTONDOWN))
{
if ((lp->wStyle & 0xf) != CBS_SIMPLE)
ClientToScreen(hWnd, &cp);
CBoxSendMouseToLBox(lp, WM_LBUTTONUP, wParam, cp);
CLEAR_STATE(lp,CSF_LBOXBUTTONDOWN);
}
break;
case WM_ERASEBKGND:
return 1L;
case WM_PAINT:
BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
if (!IsWindowVisible(hWnd) || !lp->bRedraw)
return 0L;
if ((lp->wStyle & 0xf) != CBS_SIMPLE)
CBoxDrawButton(hWnd, IS_SET(lp,CSF_LOCALBUTTONDOWN), lp);
uiKey = (UINT)SendMessage(lp->ListBoxControl, LB_GETCURSEL, 0, 0);
if (lp->EditControl)
CBoxDrawEdit(lp, hWnd, uiKey);
else CBoxDrawStatic(lp, hWnd, uiKey);
return 0L;
case WM_COMMAND:
if (GET_WM_COMMAND_ID(wParam,lParam) == CBC_EDITID) {
/* edit/static control notifications */
switch((short)GET_WM_COMMAND_CMD(wParam,lParam)) {
case EN_SETFOCUS:
#ifdef LATER
wCBN = CBN_SETFOCUS;
#else
wCBN = 0;
#endif
break;
case EN_KILLFOCUS:
wCBN = CBN_KILLFOCUS;
break;
case EN_CHANGE:
{
int index = 0;
char sz[128];
/*
** Advance listbox
** selection until there is string match. One first mismatch
** listbox advances to its first item.
*/
SendMessage(lp->EditControl, WM_GETTEXT, sizeof(sz)-1, (LPARAM)sz);
if (/*l*/strlen(sz) > 0/*L*/)
index = (int)SendMessage(lp->ListBoxControl, LB_FINDSTRING, -1, (LPARAM)sz);
if (index == LB_ERR)
index = 0;
SendMessage(lp->ListBoxControl, LB_SETTOPINDEX, index, 0L);
wCBN = CBN_EDITCHANGE;
break;
}
case EN_UPDATE:
wCBN = CBN_EDITUPDATE;
break;
case EN_ERRSPACE:
wCBN = CBN_ERRSPACE;
break;
default:
wCBN = 0;
break;
}
if (wCBN)
return SendMessage(lp->hWndParent,WM_COMMAND,
GET_WM_COMMAND_MPS(lp->nID,hWnd,wCBN));
else
return rc;
}
if (GET_WM_COMMAND_ID(wParam,lParam) == 0) {
/* listbox notifications */
switch ((short)GET_WM_COMMAND_CMD(wParam,lParam)) {
case LBN_ERRSPACE:
wCBN = CBN_ERRSPACE;
break;
case LBN_SELCHANGE:
if ((lp->wStyle & 0xf) == CBS_SIMPLE)
{
uiKey = (UINT)SendMessage(lp->ListBoxControl, LB_GETCURSEL, 0, 0);
if (uiKey != (UINT)LB_ERR)
if (lp->EditControl)
{
CBoxDrawEdit(lp, hWnd, uiKey);
}
}
wCBN = CBN_SELCHANGE;
break;
case LBN_DBLCLK:
wCBN = CBN_DBLCLK;
break;
case LBN_SELCANCEL: /* TODO */
wCBN = 0;
break;
case LBN_SETFOCUS:
wCBN = CBN_SETFOCUS;
break;
case LBN_KILLFOCUS:
wCBN = CBN_KILLFOCUS;
break;
default:
wCBN = 0;
break;
}
if (wCBN)
return SendMessage(lp->hWndParent, WM_COMMAND, GET_WM_COMMAND_MPS(lp->nID,hWnd,wCBN));
else
return rc;
}
break;
case WM_GETTEXT:
if ( lp->EditControl )
return SendMessage(lp->EditControl,uMsg,wParam,lParam);
else if ( lp->ListBoxControl ) {
WPARAM sel, len;
sel = (WPARAM)SendMessage(lp->ListBoxControl, LB_GETCURSEL, 0, 0);
if ( sel != (WPARAM)LB_ERR ) {
len = (WPARAM)SendMessage(lp->ListBoxControl, LB_GETTEXTLEN, 0, 0);
if ( len <= wParam )
return SendMessage(lp->ListBoxControl, LB_GETTEXT, sel, lParam);
}
}
return CB_ERR;
case WM_GETTEXTLENGTH:
if ( lp->EditControl )
return SendMessage(lp->EditControl,uMsg,wParam,lParam);
else if ( lp->ListBoxControl ) {
WPARAM sel;
sel = (WPARAM)SendMessage(lp->ListBoxControl, LB_GETCURSEL, 0, 0);
if ( sel != (WPARAM)LB_ERR )
return SendMessage(lp->ListBoxControl, LB_GETTEXTLEN, sel, 0);
}
return CB_ERR;
case WM_SETTEXT:
if ( lp->EditControl )
return SendMessage(lp->EditControl,uMsg,wParam,lParam);
return CB_ERR;
#if 0 /* jmt: fix: no WM_SETFONT/WM_GETFONT */
case WM_SETFONT:
lp->hFont = (HFONT)wParam;
hDC = GetDC(hWnd);
SelectObject(hDC,lp->hFont);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -