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

📄 edit.c

📁 lpc2478+ucosII+ucgui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                                uC/GUI
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              礐/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : EDIT.c
Purpose     : emWin GSC button widget
---------------------------END-OF-HEADER------------------------------
*/

#include <stdlib.h>
#include <string.h>

#define EDIT_C       /* Required to generate intermodule data */

#include "EDIT.h"
#include "GUIDebug.h"
#include "GUI_Protected.h"
#include "EDIT_Private.h"

#if GUI_WINSUPPORT

/*********************************************************************
*
*       Private config defaults
*
**********************************************************************
*/

#ifndef EDIT_LOG_ENABLE
  #ifdef _DEBUG
    #define EDIT_LOG_ENABLE 0
  #else
    #define EDIT_LOG_ENABLE 0
  #endif
#endif

/* Define default fonts */
#ifndef EDIT_FONT_DEFAULT
  #define EDIT_FONT_DEFAULT &GUI_Font13_1
#endif

#ifndef EDIT_ALIGN_DEFAULT
  #define EDIT_ALIGN_DEFAULT GUI_TA_LEFT | GUI_TA_VCENTER
#endif

/* Define colors */
#ifndef EDIT_BKCOLOR0_DEFAULT
  #define EDIT_BKCOLOR0_DEFAULT 0xc0c0c0
#endif

#ifndef EDIT_BKCOLOR1_DEFAULT
  #define EDIT_BKCOLOR1_DEFAULT GUI_WHITE
#endif

#ifndef EDIT_TEXTCOLOR0_DEFAULT
  #define EDIT_TEXTCOLOR0_DEFAULT GUI_BLACK
#endif

#ifndef EDIT_TEXTCOLOR1_DEFAULT
  #define EDIT_TEXTCOLOR1_DEFAULT GUI_BLACK
#endif

#ifndef EDIT_BORDER_DEFAULT
  #define EDIT_BORDER_DEFAULT 1
#endif

#ifndef EDIT_XOFF
  #define EDIT_XOFF 2
#endif

/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

static int _DefaultAlign              = EDIT_ALIGN_DEFAULT;
static int _DefaultBorder             = EDIT_BORDER_DEFAULT;
static const GUI_FONT * _pDefaultFont = EDIT_FONT_DEFAULT;

/*********************************************************************
*
*       Macros for internal use
*
**********************************************************************
*/

#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  #define OBJECT_ID 0x4569   /* Magic nubmer, should be unique if possible */
  #define INIT_ID(p)   p->DebugId = OBJECT_ID
  #define DEINIT_ID(p) p->DebugId = 0
#else
  #define INIT_ID(p)
  #define DEINIT_ID(p)
#endif

/*********************************************************************
*
*       Static routines
*
**********************************************************************
*/

#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
EDIT_Obj* EDIT_h2p(EDIT_Handle h) {
  EDIT_Obj* p = (EDIT_Obj*)WM_HMEM2Ptr(h);
  if (p) {
    if (p->DebugId != OBJECT_ID) {
      GUI_DEBUG_ERROROUT("EDIT.C: Wrong handle type or Object not init'ed");
      return 0;
    }
  }
  return p;
}
#endif

/*********************************************************************
*
*       _Paint
*/
static void _Paint(EDIT_Obj* pObj) {
  int PixelLen, xSize, ySize, xPosText, xPosCursor, yPosText, yPosCursor, XSizeCursor, YSizeCursor;
  int IsEnabled;
  GUI_RECT rClient, rWindow;
  char * s;
  s = (char*) WM_HMEM2Ptr(pObj->hpText);
  GUI_DEBUG_LOG("BUTTON: _Paint(..)\n");
  if (pObj->Border) {
    GUI_SetBkColor(pObj->aBkColor[0]);
    GUI_Clear();
  }
  IsEnabled = WIDGET__IsEnabled(&pObj->Widget);
  /* Set clipping rectangle */
  WIDGET__GetInsideRect(&pObj->Widget, &rWindow);
  WM_SetUserClipRect(&rWindow);
  /* Calculate size */
  GUI_GetClientRect(&rClient);
  xSize = rClient.x1 - rClient.x0 + 1;
  ySize = rClient.y1 - rClient.y0 + 1;
  /* Draw background */
  GUI_SetBkColor (pObj->aBkColor[IsEnabled]);
  GUI_SetColor   (pObj->aTextColor[0]);
  GUI_Clear();
  /* Calculate length */
  GUI_SetFont    (pObj->pFont);
  PixelLen = GUI_GetStringDistX(s);
  /* Calculate size of cursor */
  YSizeCursor = GUI_GetFontDistY();
  if (pObj->EditMode == GUI_EDIT_MODE_INSERT) {
    if (pObj->XSizeCursor != 0) {
      XSizeCursor = pObj->XSizeCursor;
    } else {
      XSizeCursor = GUI_GetCharDistX(' ');
    }
  } else {
    if (pObj->CursorPos < (int)strlen(s))  {
      XSizeCursor = GUI_GetCharDistX(*(s + pObj->CursorPos));
    } else {
      XSizeCursor = pObj->XSizeCursor;
    }
  }
  /* Calculate X-pos */
  switch (pObj->Align & GUI_TA_HORIZONTAL) {
    case GUI_TA_CENTER:
      xPosCursor = (xSize - PixelLen + 1) / 2;
      xPosText = xSize / 2;
      break;
    case GUI_TA_LEFT:
      xPosCursor = pObj->Border + EDIT_XOFF;
      xPosText   = pObj->Border + EDIT_XOFF;
      break;
    case GUI_TA_RIGHT:
      xPosCursor = xSize - (pObj->Border + EDIT_XOFF) - PixelLen;
      xPosText   = xSize - (pObj->Border + EDIT_XOFF);
      break;
  }
  /* Calculate Y-pos */
  switch (pObj->Align & GUI_TA_VERTICAL) {
    case GUI_TA_TOP:
      yPosCursor = 0;
      yPosText = 0;
      break;
    case GUI_TA_BOTTOM:
      yPosCursor = ySize - YSizeCursor;
      yPosText = ySize;
      break;
    case GUI_TA_VCENTER:
      yPosCursor = (ySize - YSizeCursor + 1) / 2;
      yPosText = ySize / 2;
      break;
  }
  /* Display text */
  GUI_SetTextAlign(pObj->Align);
  GUI_DispStringAt(s, xPosText, yPosText);
  /* Display cursor */
  if (pObj->Widget.State & WIDGET_STATE_FOCUS) {
    int i;
    for (i = 0; i != pObj->CursorPos; i++) {
      xPosCursor += GUI_GetCharDistX(*(s + i));
    }
    GUI_InvertRect(xPosCursor, 
                   yPosCursor, 
                   xPosCursor + XSizeCursor - 1, 
                   yPosCursor + YSizeCursor - 1);
  }
  WM_SetUserClipRect(NULL);
  /* Draw the 3D effect (if configured) */
  WIDGET__EFFECT_DrawDown(&pObj->Widget);
}

/*********************************************************************
*
*       _Delete
*/
static void _Delete(EDIT_Obj* pObj) {
  WM_FREEPTR(&pObj->hpText);
}


/*********************************************************************
*
*       _SetCursor
*/
static void _SetCursor(EDIT_Handle hObj, EDIT_Obj* pObj, int x) {
  int xPos, xSize, PixelLen, Len;
  char * s = (char*) WM_HMEM2Ptr(pObj->hpText);
  const GUI_FONT *pOldFont = GUI_SetFont(pObj->pFont);
  xSize = WM_GetWindowSizeX(hObj);
  PixelLen = GUI_GetStringDistX(s);
  xPos = x;
  switch (pObj->Align & GUI_TA_HORIZONTAL) {
    case GUI_TA_CENTER:
      xPos -= (xSize - PixelLen + 1) / 2;
      break;
    case GUI_TA_LEFT:
      xPos -= (pObj->Border + EDIT_XOFF);
      break;
    case GUI_TA_RIGHT:
      xPos -= xSize - PixelLen - (pObj->Border + EDIT_XOFF);
      break;
  }
  Len = strlen(s);
  if (xPos < 0) {
    pObj->CursorPos = 0;
  } else if (xPos > PixelLen) {
    pObj->CursorPos = Len;
  } else {
    int i, x;
    for (i = 0, x = 0; (i < Len) && (x < xPos); i++) {
      int xLenChar = GUI_GetCharDistX(*(s + i));
      if (xPos < (x + xLenChar))
        break;
      x += xLenChar;
    }
    pObj->CursorPos = i;
    EDIT_Invalidate(hObj);
  }
  GUI_SetFont(pOldFont);
}

/*********************************************************************
*
*       _OnTouch
*/
static void _OnTouch(EDIT_Handle hObj, EDIT_Obj* pObj, WM_MESSAGE*pMsg) {
  GUI_TOUCH_tState* pState = (GUI_TOUCH_tState*)pMsg->Data.p;
  if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */
    if (pState->Pressed) {
      GUI_DEBUG_LOG1("EDIT__Callback(WM_TOUCH, Pressed, Handle %d)\n",1);
      _SetCursor(hObj, pObj, pState->x);
      WM_SetFocus(hObj);
    } else {
      GUI_DEBUG_LOG1("EDIT__Callback(WM_TOUCH, Released, Handle %d)\n",1);
    }
  } else {
    GUI_DEBUG_LOG1("_EDIT_Callback(WM_TOUCH, Moved out, Handle %d)\n",1);
  }
}

/*********************************************************************
*
*       Callback
*/
static void EDIT__Callback (WM_MESSAGE * pMsg) {
  int IsEnabled;
  EDIT_Handle hObj = (EDIT_Handle)pMsg->hWin;
  EDIT_Obj* pObj = (EDIT_Obj*)WM_HMEM2Ptr(hObj);
  IsEnabled = WIDGET__IsEnabled(&pObj->Widget);
  /* Let widget handle the standard messages */
  if (WIDGET_HandleActive(hObj, pMsg) == 0) {
    return;
  }
  switch (pMsg->MsgId) {
  case WM_TOUCH:
    if (IsEnabled) {
      _OnTouch(hObj, pObj, pMsg);
    }
    break;
  case WM_PAINT:
    GUI_DEBUG_LOG("EDIT: _Callback(WM_PAINT)\n");
    _Paint(pObj);
    return;
  case WM_DELETE:
    GUI_DEBUG_LOG("EDIT: _Callback(WM_DELETE)\n");
    _Delete(pObj);
    break;       /* No return here ... WM_DefaultProc needs to be called */
  case WM_KEY:
    if (IsEnabled) {
      if ( ((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) {
        int Key = ((WM_KEY_INFO*)(pMsg->Data.p))->Key;
        switch (Key) {
          case GUI_KEY_TAB:
            break;                    /* Send to parent by not doing anything */
          default:
            EDIT_AddKey(hObj, Key);
            return;
        }
      }
    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -