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

📄 combobox.c

📁 TN-kernel内核针对LPC系列ARM7处理器和S3C44B0X重新定制好的源代码包。内含Nano-X GUI。
💻 C
📖 第 1 页 / 共 5 页
字号:
                      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 + -