📄 myedit.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 + -