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

📄 myedit.c

📁 在ucos上实现了图形用户接口GUI;值得一看
💻 C
字号:
#include <stdlib.h>
#include <string.h>

#include "MYEDIT.H"
#include "GProtect.h"


MYEDIT_Obj* MYEDIT_h2p(MYEDIT_Handle h) {
  MYEDIT_Obj* p = (MYEDIT_Obj*)WM_HMEM2Ptr(h);
  return p;
}
/*********************************************************************
*
*       _Delete
*/
static void _Delete(MYEDIT_Obj* pObj) {
  WM_FREEPTR(&pObj->hpText);
}

/*********************************************************************
*
*       _Paint
*/
static void _Paint(MYEDIT_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);

  //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->bkcolor);
  GUI_Clear();
  /* Draw style */
  GUI_SetColor(GUI_BLACK);
  switch (pObj->style){
    case MYEDIT_STYLE_RECTANGLE:
      GUI_DrawRect(rClient.x0, rClient.y0, rClient.x1, rClient.y1); // Draw rectangle around it
      break;
    case MYEDIT_STYLE_LINE:
      GUI_DrawHLine(rClient.y1, rClient.x0, rClient.x1);
      break;
  }
  GUI_SetColor   (pObj->textcolor);
  /* Calculate length */
  GUI_SetFont    (pObj->pFont);
  PixelLen = GUI_GetStringDistX(s);
  /* Calculate size of cursor */
  YSizeCursor = GUI_GetFontDistY();
  if (YSizeCursor<HZSIZEY) YSizeCursor=HZSIZEY;
  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)){
      if (*(s + pObj->CursorPos)&0x80)
	XSizeCursor=HZSIZEX;
      else
	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 + MYEDIT_XOFF;
      xPosText   = pObj->Border + MYEDIT_XOFF;
      break;
    case GUI_TA_RIGHT:
      xPosCursor = xSize - (pObj->Border + MYEDIT_XOFF) - PixelLen;
      xPosText   = xSize - (pObj->Border + MYEDIT_XOFF);
      break;
  }
  /* Calculate Y-pos */
  switch (pObj->Align & GUI_TA_VERTICAL) {
    case GUI_TA_TOP:
      yPosCursor = 1;
      yPosText = 1;
      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++) {
      if ((*(s+i)) & 0x80){
	xPosCursor+=HZSIZEX;
	i++;
      }
      else
	xPosCursor += GUI_GetCharDistX(*(s + i));
    }
    GUI_InvertRect(xPosCursor,                //draw cursor
		   yPosCursor,
		   xPosCursor + XSizeCursor - 1,
		   yPosCursor + YSizeCursor - 1);
  }
  //WM_SetUserClipRect(NULL);
  /* Draw the 3D effect (if configured) */
  //WIDGET__EFFECT_DrawDown(&pObj->Widget);
}

/*********************************************************************
*
*       Callback
*/
static void MYEDIT__Callback (WM_MESSAGE * pMsg) {
  MYEDIT_Handle hObj = (MYEDIT_Handle)pMsg->hWin;
  MYEDIT_Obj* pObj = (MYEDIT_Obj*)WM_HMEM2Ptr(hObj);

  /* Let widget handle the standard messages */
  if (WIDGET_HandleActive(hObj, pMsg) == 0) {//let widget handle the message first.
    return;
  }
  switch (pMsg->MsgId) {
    case WM_PAINT:
      _Paint(pObj);
      return;
    case WM_DELETE:
      _Delete(pObj);
      break;       /* No return here ... WM_DefaultProc needs to be called */
    case WM_KEY:
      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:
	    MYEDIT_AddKey(hObj, Key);
	    return;
	}
      }
      break;
  }
  WM_DefaultProc(pMsg);
}

/*********************************************************************
*
*       Exported routines:  Create
*
**********************************************************************
*/

MYEDIT_Handle MYEDIT_CreateAsChild  (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int MaxLen) {
  MYEDIT_Handle hObj;
  if (MaxLen == 0) {
    MaxLen = 8;
  }
  /* Alloc memory for obj */
  WM_LOCK();
  hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent,
		       WM_CF_SHOW | Flags, MYEDIT__Callback,
		       sizeof(MYEDIT_Obj)-sizeof(WM_Obj));
  if (hObj) {
    MYEDIT_Obj* pObj = (MYEDIT_Obj*)WM_HMEM2Ptr(hObj);
    /* init widget specific variables */
    WIDGET__Init(&pObj->Widget, WIDGET_STATE_FOCUSSABLE  | WIDGET_STATE_ENABLED);
    pObj->Widget.Id     = Id;
    /* init member variables */
    pObj->pFont         = MYEDIT_FONT_DEFAULT;
    pObj->bkcolor       = GUI_WHITE;
    pObj->textcolor     = GUI_RED;
    pObj->Align         = GUI_TA_LEFT ;//| GUI_TA_VCENTER;
    pObj->style         = MYEDIT_STYLE_RECTANGLE;
    pObj->Border        = 1;
    pObj->XSizeCursor   = 1;
    pObj->MaxLen        = MaxLen;
    if ((pObj->hpText = WM_ALLOC(MaxLen+1)) ==0) {
      MYEDIT_Delete(hObj);
      hObj =0;
    }
  }
  WM_UNLOCK();
  return hObj;
}

MYEDIT_Handle MYEDIT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* pCallback) {
  MYEDIT_Handle hEdit;
  GUI_USE_PARA(pCallback);
  hEdit = MYEDIT_CreateAsChild(
    pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize,
    hWinParent, pCreateInfo->Id, pCreateInfo->Flags, pCreateInfo->Para);
  return hEdit;
}

void MYEDIT_SetText (MYEDIT_Handle hObj, const char* sNew) {
  MYEDIT_Obj* pObj;
  if (hObj == 0)
    return;
  WM_LOCK();
  pObj = MYEDIT_h2p(hObj);
  if (pObj) {
    char *sDest = (char*) WM_HMEM2Ptr(pObj->hpText);
    int Len = sNew ? strlen(sNew) : 0;
    if (Len > pObj->MaxLen)
      Len = pObj->MaxLen;
    memcpy(sDest, sNew, Len);
    *(sDest+Len) = 0;
    pObj->CursorPos = Len;
    //if (pObj->CursorPos == pObj->MaxLen)
    //  pObj->CursorPos--;
    MYEDIT_Invalidate(hObj);
  }
  WM_UNLOCK();
}

/*********************************************************************
*
*       Exported routines:  Various methods
*
**********************************************************************
*/

void MYEDIT_AddKey(MYEDIT_Handle hObj, int Key) {
  MYEDIT_Obj* pObj;
  if (hObj == 0)
    return;
  WM_LOCK();
  pObj = MYEDIT_h2p(hObj);
  if (pObj) {
    char *s = (char*) WM_HMEM2Ptr(pObj->hpText);
    int len = strlen(s);
    switch (Key) {
      case GUI_KEY_UP:
	if (pObj->CursorPos < len){
	  char c = *(s + pObj->CursorPos);
	  if (c & 0x80){//is HanZi
	    WM_UNLOCK();
	    return;
	  }
	  if (c < 0x7f) {
	    *(s + pObj->CursorPos) = c + 1;
	    WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
	  }
	}
	break;
      case GUI_KEY_DOWN:
	if (pObj->CursorPos < len){
	  char c = *(s + pObj->CursorPos);
	  if (c & 0x80){//is HanZi
	    WM_UNLOCK();
	    return;
	  }
	  if (c > 0x20) {
	    *(s + pObj->CursorPos) = c - 1;
	    WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
	  }
	}
	break;
      case GUI_KEY_RIGHT:
	if (pObj->CursorPos < len){
	  if (*(s + pObj->CursorPos) & 0x80)
	    pObj->CursorPos+=2;
	  else
	    pObj->CursorPos++;
	}
	else{
	  WM_UNLOCK();
	  return;
	}
	break;
      case GUI_KEY_LEFT:
	if (pObj->CursorPos > 0){
	  if (*(s + pObj->CursorPos-1) & 0x80)
	    pObj->CursorPos-=2;
	  else
	    pObj->CursorPos--;
	}
	else{
	  WM_UNLOCK();
	  return;
	}
	break;
      case GUI_KEY_END:
	if (pObj->CursorPos!=len)
	  pObj->CursorPos=len;
	else{
	  WM_UNLOCK();
	  return;
	}
	break;
      case GUI_KEY_HOME:
	if (pObj->CursorPos!=0)
	  pObj->CursorPos=0;
	else{
	  WM_UNLOCK();
	  return;
	}

	break;
      case GUI_KEY_BACKSPACE:
	if ((len > 0) && (pObj->CursorPos > 0)) {
	  int CopyLength = pObj->MaxLen - pObj->CursorPos;
	  if (*(s+pObj->CursorPos-1)&0x80){
	    strncpy (s + pObj->CursorPos - 2, s + pObj->CursorPos, CopyLength);
	    *(s + len - 2) = 0;
	    pObj->CursorPos-=2;
	  }
	  else{
	    strncpy (s + pObj->CursorPos - 1, s + pObj->CursorPos, CopyLength);
	    *(s + len - 1) = 0;
	    pObj->CursorPos--;
	  }
	  WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
	}
	break;
      case GUI_KEY_DELETE:
	if ((len > 0) && (pObj->CursorPos < len)) {
	  if (len > 1) {
	    if (*(s+pObj->CursorPos)&0x80){
	      if (len>2){//more then one HanZi
		int CopyLength = pObj->MaxLen - pObj->CursorPos - 2;
		strncpy(s + pObj->CursorPos, s + pObj->CursorPos + 2, CopyLength);
	      }
	      *(s + len - 2) = 0;
	    }
	    else{
	      int CopyLength = pObj->MaxLen - pObj->CursorPos - 1;
	      strncpy(s + pObj->CursorPos, s + pObj->CursorPos + 1, CopyLength);
	      *(s + len - 1) = 0;
	    }
	  }
	  else
	    *(s + len - 1) = 0;
	  WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
	}
	break;
      case GUI_KEY_INSERT:
	if (pObj->EditMode == GUI_EDIT_MODE_OVERWRITE)
	  pObj->EditMode = GUI_EDIT_MODE_INSERT;
	else
	  pObj->EditMode = GUI_EDIT_MODE_OVERWRITE;
	break;
      case GUI_KEY_ENTER:
      case GUI_KEY_ESCAPE:
	break;
      default:
	if ((Key >= 0x20) && (Key <= 0x7f)) {
	  if (pObj->EditMode == GUI_EDIT_MODE_INSERT) {
	    if (len < pObj->MaxLen) {
	      int CopyLength = pObj->MaxLen - pObj->CursorPos - 1;//can't be (pObj->MaxLen - pObj->CursorPos)!
	      memmove(s + pObj->CursorPos + 1, s + pObj->CursorPos, CopyLength);
	      *(s + pObj->CursorPos) = Key;
	      WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
	      if (pObj->CursorPos < pObj->MaxLen)
		pObj->CursorPos++;
	    }
	  }
	  else {
	    if (*(s+pObj->CursorPos)&0x80){
	      int CopyLength = pObj->MaxLen - pObj->CursorPos - 2;
	      memmove(s + pObj->CursorPos + 1, s + pObj->CursorPos + 2, CopyLength);
	    }
	    *(s + pObj->CursorPos) = Key;
	    WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
	    if (pObj->CursorPos < pObj->MaxLen)
	      pObj->CursorPos++;
	  }
	}
	break;
    }
    MYEDIT_Invalidate(hObj);
  }
  WM_UNLOCK();
}

/*********************************************************************
*
*       _SetCursor
*/

/*
static void _SetCursor(MYEDIT_Handle hObj, MYEDIT_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 + MYEDIT_XOFF);
      break;
    case GUI_TA_RIGHT:
      xPos -= xSize - PixelLen - (pObj->Border + MYEDIT_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;
    MYEDIT_Invalidate(hObj);
  }
  GUI_SetFont(pOldFont);
}
*/

⌨️ 快捷键说明

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