📄 combobox.c
字号:
/* 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); GetTextMetrics(hDC,&tm); ReleaseDC(hWnd,hDC); wEditHeight = tm.tmHeight + 3 * tm.tmInternalLeading; if (wEditHeight == lp->uHeight) return 0L; lp->uHeight = (UINT)wEditHeight; lp->ButtonRect.bottom = wEditHeight; /* ** The following SetWindowPos causes WM_WINDOWPOSCHANGING message ** where child windows are resized and/or moved. */ ShowWindow(hWnd, SW_HIDE); GetClientRect(hWnd,&rcClient); if ((lp->wStyle & 0xf) != CBS_SIMPLE) SetWindowPos(hWnd, 0, 0, 0, rcClient.right, (int)wEditHeight, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW); else SetWindowPos(hWnd, 0, 0, 0, rcClient.right, (int)wEditHeight + lp->ListBoxRect.bottom - lp->ListBoxRect.top + 1, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW); ShowWindow(hWnd, SW_SHOWNA); if (lp->EditControl) SendMessage(lp->EditControl, WM_SETFONT, wParam,lParam); SendMessage(lp->ListBoxControl, WM_SETFONT, wParam,lParam); if(LOWORD(lParam)) RedrawWindow(hWnd,(const RECT *)0,(HRGN)0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW ); return (LRESULT)0; case WM_GETFONT: return lp->hFont;#endif /* WM_SETFONT/WM_GETFONT */ case WM_MOVE: /*WM_WINDOWPOSCHANGING:*/#if 0 lpwp = (LPWINDOWPOS)lParam;#else pp.x=LOWORD(lParam); pp.y=HIWORD(lParam);#endif if (1)/*(lpwp)*/ { if (1)/*(!(lpwp->flags & SWP_NOSIZE))*/ { lp->ButtonRect.right = (hWnd->winrect.right-hWnd->winrect.left); /* lpwp->cx; */ if ((lp->wStyle & 0xf) == CBS_SIMPLE) lp->ButtonRect.left = lp->ButtonRect.right; else lp->ButtonRect.left = (hWnd->winrect.right-hWnd->winrect.left)/*lpwp->cx*/ - 1 - GetSystemMetrics(SM_CXVSCROLL); if (lp->EditControl) { wEditWidth = lp->ButtonRect.left + 1; if ((lp->wStyle & 0xf) == CBS_SIMPLE) wEditWidth --; if ((lp->wStyle & 0xf) == CBS_DROPDOWN) wEditWidth -= 5; SetWindowPos(lp->EditControl,(HWND)0, 0,0, wEditWidth, lp->uHeight, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER); } if (lp->ListBoxControl) { if ((lp->wStyle & 0x0F) == CBS_SIMPLE) { lp->ListBoxRect.left = 5; lp->ListBoxRect.top = lp->uHeight - 1; lp->ListBoxRect.right = (hWnd->winrect.right-hWnd->winrect.left); /* lpwp->cx; */ lp->ListBoxRect.bottom = (hWnd->winrect.bottom-hWnd->winrect.top)/*lpwp->cy*/ - 2; } else { POINT cp; cp.x = 0; cp.y = lp->uHeight - 1; ClientToScreen(hWnd, &cp); OffsetRect(&lp->ListBoxRect, cp.x - lp->ListBoxRect.left, cp.y - lp->ListBoxRect.top); lp->ListBoxRect.right = lp->ListBoxRect.left + (hWnd->winrect.right-hWnd->winrect.left)/*lpwp->cx*/; if ((lp->wStyle & 0xf) != CBS_DROPDOWNLIST) lp->ListBoxRect.right -= 5; } SetWindowPos(lp->ListBoxControl,(HWND)0, lp->ListBoxRect.left, lp->ListBoxRect.top, lp->ListBoxRect.right - lp->ListBoxRect.left, lp->ListBoxRect.bottom - lp->ListBoxRect.top, SWP_NOACTIVATE|SWP_NOZORDER); }#if 0 /* jmt: fix: no WM_WINDOWPOSCHANGING */ /* the height of the normal state stays the same */ if ((lp->wStyle & 0xf) != CBS_SIMPLE) lpwp->cy = (int)lp->uHeight;#endif } } return (LRESULT)0; case WM_WINDOWPOSCHANGED: DefWindowProc(hWnd,uMsg,wParam,lParam); lpwp = (LPWINDOWPOS)lParam; if (lpwp) { if (!(lpwp->flags & SWP_NOSIZE)) /* TODO */#if 0 RedrawWindow(hWnd,(const RECT *)0,(HRGN)0, RDW_INVALIDATE|RDW_ERASE);#else InvalidateRect(hWnd,NULL,TRUE);#endif } return (LRESULT)0;#if 0 /* jmt: fix: no ownerdraw */ /*********************************************/ /* ownerdraw stuff */ /*********************************************/ case WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT)lParam; lpdis->CtlType = ODT_COMBOBOX; lpdis->CtlID = lp->nID; lpdis->hwndItem = hWnd; return SendMessage(lp->hWndParent,WM_DRAWITEM, (WPARAM)lp->nID,lParam); case WM_MEASUREITEM: lpmis = (LPMEASUREITEMSTRUCT)lParam; lpmis->CtlType = ODT_COMBOBOX; lpmis->CtlID = lp->nID; return SendMessage(lp->hWndParent,WM_MEASUREITEM, (WPARAM)lp->nID,lParam); case WM_DELETEITEM: lpdlis = (LPDELETEITEMSTRUCT)lParam; lpdlis->CtlType = ODT_COMBOBOX; lpdlis->CtlID = lp->nID; lpdlis->hwndItem = hWnd; return SendMessage(lp->hWndParent,WM_DELETEITEM, (WPARAM)lp->nID,lParam); case WM_CONVERT: if (!lpComboBinToNat) { hComboClass32 = FindClass("COMBOBOX",0); lpComboBinToNat = (WNDPROC)GetClassHandleLong( hComboClass32,GCL_BINTONAT); } if (lpComboBinToNat) return lpComboBinToNat(hWnd, uMsg, wParam, lParam); else return (LRESULT)0;#endif /* ownerdraw */ default: return DefCBProc( hWnd, uMsg, wParam, lParam); } return rc;}/**************************************************************************************************************************************************/static LRESULT DefCBProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ int len,index; COMBOBOX *lp; char *selection; int rc; POINT cp; lp = (COMBOBOX *) hWnd->userdata/*GetWindowLong(hWnd,CWD_LPCBDATA)*/; switch(uMsg) { /*********************************************/ /* messages specific to the list box control */ /*********************************************/ case CB_ADDSTRING: lp->nListItems++; /* shd. test for successful return */ return SendMessage(lp->ListBoxControl,LB_ADDSTRING, wParam,lParam); case CB_DELETESTRING: if (lp->nListItems) lp->nListItems--; return SendMessage(lp->ListBoxControl,LB_DELETESTRING, wParam,lParam); case CB_DIR: return SendMessage(lp->ListBoxControl,LB_DIR, wParam,lParam); case CB_FINDSTRING: return SendMessage(lp->ListBoxControl,LB_FINDSTRING, wParam,lParam); case CB_FINDSTRINGEXACT: return SendMessage(lp->ListBoxControl,LB_FINDSTRINGEXACT, wParam,lParam); case CB_GETCOUNT: return SendMessage(lp->ListBoxControl,LB_GETCOUNT, wParam,lParam); case CB_GETCURSEL: return SendMessage(lp->ListBoxControl,LB_GETCURSEL, wParam,lParam); case CB_GETITEMDATA: return SendMessage(lp->ListBoxControl,LB_GETITEMDATA, wParam,lParam); case CB_GETITEMHEIGHT: return SendMessage(lp->ListBoxControl,LB_GETITEMHEIGHT, wParam,lParam); case CB_GETLBTEXT: return SendMessage(lp->ListBoxControl,LB_GETTEXT, wParam,lParam); case CB_GETLBTEXTLEN: return SendMessage(lp->ListBoxControl,LB_GETTEXTLEN, wParam,lParam); case CB_INSERTSTRING: return SendMessage(lp->ListBoxControl,LB_INSERTSTRING, wParam,lParam); case CB_SETITEMDATA: return SendMessage(lp->ListBoxControl,LB_SETITEMDATA, wParam,lParam); /*********************************************/ /* messages specific to the edit control */ /*********************************************/ case CB_GETEDITSEL: return SendMessage(lp->EditControl,EM_GETSEL,0,0); case CB_LIMITTEXT: return SendMessage(lp->EditControl,EM_LIMITTEXT, wParam,lParam); case CB_SETEDITSEL: return SendMessage(lp->EditControl,EM_SETSEL, wParam,lParam); /*********************************************/ /* messages handled by the combobox */ /*********************************************/ case CB_GETDROPPEDCONTROLRECT: CopyRect((LPRECT)lParam,&lp->ListBoxRect); break; case CB_GETDROPPEDSTATE: return IS_SET(lp,CSF_CAPTUREACTIVE); case CB_GETEXTENDEDUI: return (LRESULT)lp->bExtended; case CB_RESETCONTENT: SendMessage(lp->ListBoxControl,LB_RESETCONTENT,0,0); if (lp->EditControl) SendMessage(lp->EditControl,WM_SETTEXT,0,(LPARAM)(LPSTR)""); break; case CB_SELECTSTRING: index = (int)SendMessage(lp->ListBoxControl, LB_SELECTSTRING, wParam, lParam); if (index == LB_ERR) return CB_ERR; len = (int)SendMessage(lp->ListBoxControl, LB_GETTEXTLEN, index, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -