⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 combobox.c

📁 一个嵌入式操作系统(microwindows)的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 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 + -