📄 edit.c
字号:
HDC dc=GetClientDC(hWnd);
GroupOn(dc);
dummybottom=pSLEditData->buffer[pSLEditData->editPos+chars];
pSLEditData->buffer[pSLEditData->editPos+chars]='\0';
EraseBackground(dc,pSLEditData->caretx,pSLEditData->carety,tw,th);
TextOut (dc, pSLEditData->caretx,pSLEditData->carety, &pSLEditData->buffer[pSLEditData->editPos]);
pSLEditData->buffer[pSLEditData->editPos+chars]=dummybottom;
GroupOff(dc,pSLEditData->caretx,pSLEditData->carety,tw,th);
ReleaseDC(dc);
}
}
pSLEditData->editPos+=chars;
pSLEditData->caretx = newcaretx;
SetCaretPos (hWnd,pSLEditData->caretx-1,pSLEditData->carety-CARET_HEIGHT_OVERLAP);
CMD_NotifyParent(hWnd,EN_CHANGED);
}
void SLEdit_GetKeyDown(HWND hWnd,UINT Key)
{ PSLEDITDATA pSLEditData =(SLEDITDATA *)WndClsBuf(hWnd);
switch (Key)
{ case VK_HOME:
if (pSLEditData->editPos != 0)
{ pSLEditData->editPos = 0;
pSLEditData->caretx=pSLEditData->textArea.left;
SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
if (pSLEditData->startPos != 0)
{ InvalidateClient(hWnd,&pSLEditData->textArea);
}
pSLEditData->startPos = 0;
}
return;
case VK_END:
if (pSLEditData->editPos != pSLEditData->dataEnd)
{ int textwidth,newStartPos = EdtGetStartDispPosAtEnd (hWnd, pSLEditData,&textwidth);
pSLEditData->editPos = pSLEditData->dataEnd;
pSLEditData->caretx=pSLEditData->textArea.left+textwidth;
SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
if (pSLEditData->startPos != newStartPos)
{ InvalidateClient(hWnd,&pSLEditData->textArea);
pSLEditData->startPos = newStartPos;
}
}
return;
case VK_LEFT:
if (pSLEditData->editPos > 0)
{ int chars = (EdtIsACCharBeforePosition (pSLEditData->buffer, pSLEditData->editPos))?2:1;
pSLEditData->editPos -= chars;
pSLEditData->caretx -= (chars*GetSysCharWidth(hWnd)+pSLEditData->colspace);
if(pSLEditData->caretx<pSLEditData->textArea.left || (pSLEditData->caretx==pSLEditData->textArea.left && pSLEditData->editPos > 0))
{ if(pSLEditData->editPos>0)
{ int pre_chars =(EdtIsACCharBeforePosition (pSLEditData->buffer, pSLEditData->editPos))?2:1;
pSLEditData->startPos -= (pSLEditData->caretx==pSLEditData->textArea.left)?pre_chars:chars+pre_chars;
pSLEditData->caretx = pSLEditData->textArea.left + (pre_chars*GetSysCharWidth(hWnd)+pSLEditData->colspace);
}
else
{ pSLEditData->startPos = 0;
pSLEditData->caretx=pSLEditData->textArea.left;
}
InvalidateClient(hWnd,&pSLEditData->textArea); /*need scroll*/
}
SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
}
return;
case VK_RIGHT:
if (pSLEditData->editPos < pSLEditData->dataEnd)
{ int chars = (EdtIsACCharAtPosition (pSLEditData->buffer, pSLEditData->editPos))?2:1;
int newcaretx=pSLEditData->caretx + chars*GetSysCharWidth(hWnd)+pSLEditData->colspace;
if (newcaretx >= pSLEditData->textArea.right)
{ int scrollStep=0;
if (EdtIsACCharAtPosition(pSLEditData->buffer, pSLEditData->startPos))
{ scrollStep = 2;
newcaretx -= (2*GetSysCharWidth(hWnd)+pSLEditData->colspace);
}
else
{ if (chars==2)
{ if (EdtIsACCharAtPosition(pSLEditData->buffer, pSLEditData->startPos + 1))
{ scrollStep = 3;
newcaretx -= (3*GetSysCharWidth(hWnd)+2*pSLEditData->colspace);
}
else
{ scrollStep = 2;
newcaretx -= ((GetSysCharWidth(hWnd)+pSLEditData->colspace)<<1);
}
}
else
{ scrollStep = 1;
newcaretx -= (GetSysCharWidth(hWnd)+pSLEditData->colspace);
}
}
pSLEditData->startPos += scrollStep;
InvalidateClient(hWnd, &pSLEditData->textArea);
}
pSLEditData->editPos+=chars;
pSLEditData->caretx=newcaretx;
SetCaretPos(hWnd,pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
}
return;
case VK_INSERT:
WNDPTR(hWnd)->Style ^= ES_REPLACE;
return;
case VK_DELETE:
if (!WndGetAttr(hWnd,ES_READONLY) && (pSLEditData->editPos != pSLEditData->dataEnd))
{ TRECT InvRect=pSLEditData->textArea;
int i,deleted;
deleted = (EdtIsACCharAtPosition(pSLEditData->buffer, pSLEditData->editPos))?2:1;
for (i = pSLEditData->editPos; i < pSLEditData->dataEnd - deleted; i++)
{ pSLEditData->buffer [i] = pSLEditData->buffer [i + deleted];
}
pSLEditData->buffer[i]='\0';
pSLEditData->dataEnd -= deleted;
InvalidateClient(hWnd,&InvRect);
CMD_NotifyParent(hWnd,EN_CHANGED);
}
return;
case VK_BACK:
if ( !WndGetAttr(hWnd,ES_READONLY) && (pSLEditData->editPos != 0))
{ SLEdit_GetKeyDown(hWnd,VK_LEFT);
SLEdit_GetKeyDown(hWnd,VK_DELETE);
}
return;
}
}
static HRESULT CALLBACK SLEditCtrlProc(HWND hWnd,UINT Message,WPARAM WParam,LPARAM LParam)
{ switch (Message)
{ case WM_CHAR:
if (!WndGetAttr(hWnd,ES_READONLY))
{ BYTE wordlo=LOBYTE(WParam),wordhi=HIBYTE(WParam);
if(wordlo>0xA0 && wordhi==0)
{ BYTE savedchar=(BYTE)IME_PopChar();
if(savedchar>0xA0)
{ SLEdit_GetChar(hWnd,savedchar,wordlo,LParam);
}
else
{ IME_PushChar(wordlo);
}
return 0;
}
if(IME_Window && WNDPTR(IME_Window)->UserData==1)/*中文输入法*/
{ if(SendMessage((HWND)IME_Window,WM_CHAR,WParam,LParam)==0)return 0;
}
SLEdit_GetChar(hWnd,wordlo,wordhi,LParam);
}
return 0;
case WM_COMMAND:
if(LParam==WM_CHAR && !WndGetAttr(hWnd,ES_READONLY))
{ SLEdit_GetChar(hWnd,LOBYTE(WParam),HIBYTE(WParam),0);
}
return 0;
case WM_KEYDOWN:
if(WParam!=VK_TAB)
{ if(IME_Window && WNDPTR(IME_Window)->UserData==1)/*中文输入法*/
{ if(!IME_isEmpty())
{ if(SendMessage((HWND)IME_Window,WM_KEYDOWN,WParam,LParam))return 0;
}
}
if(WParam!=VK_UP && WParam!=VK_DOWN)
{ SLEdit_GetKeyDown(hWnd,WParam);
return 0;
}
}
break;
case WM_GETTEXTLENGTH:
{ PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
return pSLEditData->dataEnd;
}
case WM_GETTEXT:
{ char* buffer = (char*)LParam;
int len;
PSLEDITDATA pSLEditData =(SLEDITDATA *)WndClsBuf(hWnd);
len = min ((int)WParam, pSLEditData->dataEnd);
memcpy (buffer, pSLEditData->buffer, len);
buffer [len] = '\0';
return len;
}
case WM_SETTEXT:
{ int len;
PSLEDITDATA pSLEditData= (SLEDITDATA *)WndClsBuf(hWnd);
len = strlen ((char*)LParam);
len = min (len, pSLEditData->bufferLen);
if (pSLEditData->hardLimit >= 0)
len = min (len, pSLEditData->hardLimit);
pSLEditData->dataEnd = len;
memcpy (pSLEditData->buffer, (char*)LParam, len);
pSLEditData->buffer[len]='\0';
pSLEditData->editPos = 0;
pSLEditData->caretx = pSLEditData->textArea.left;
pSLEditData->startPos = 0;
SetCaretPos(hWnd, pSLEditData->caretx-1,pSLEditData->carety-CARET_HEIGHT_OVERLAP);
InvalidateClient(hWnd,&pSLEditData->textArea);
}
return 0;
case WM_LBUTTONDOWN:
{ int cx=LOWORD(LParam)-WNDPTR(hWnd)->ClientRect.left;
int pos=Edit_LocateCarret(hWnd,&cx);
PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
if(pos!=pSLEditData->editPos)
{ pSLEditData->editPos=pos;
pSLEditData->caretx=cx;
SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
}
}
break;
case EM_SETREADONLY:
if (WParam)
{ WndAddAttr(hWnd,ES_READONLY);
}
else
{ WndSubAttr(hWnd,ES_READONLY);
}
return 0;
case EM_SETPASSWORDCHAR:
{ PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
if (pSLEditData->passwdChar != (int)WParam)
{ if (WndGetAttr(hWnd,ES_PASSWORD))
{ pSLEditData->passwdChar = (int)WParam;
InvalidateClient(hWnd,&pSLEditData->textArea);
}
}
}
return 0;
case EM_GETPASSWORDCHAR:
{ int *passwdchar;
PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
passwdchar = (int*)LParam;
*passwdchar = pSLEditData->passwdChar;
}
return 0;
case EM_LIMITTEXT:
{ int newLimit = (int)WParam;
if (newLimit >= 0)
{ PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
if (newLimit <= pSLEditData->bufferLen)
{ pSLEditData->hardLimit = newLimit;
}
else
{ char *oldtext=(char *)GetMem(pSLEditData->dataEnd);
memcpy(oldtext,pSLEditData->buffer,pSLEditData->dataEnd);
CM_AllocateWindowText(hWnd,oldtext,newLimit);
pSLEditData->bufferLen=newLimit;
pSLEditData->hardLimit = -1;
FreeMem(oldtext);
}
}
}
return 0;
case WM_CREATE:
SLEdit_OnCreate(hWnd);
return 0;
case WM_SETFOCUS:
{ PSLEDITDATA pSLEditData=(SLEDITDATA *)WndClsBuf(hWnd);
CreateCaret (hWnd, 1 , pSLEditData->caretheight);
SetCaretPos (hWnd,pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
CMD_NotifyParent(hWnd,CM_SETFOCUS);
}
return 0;
case WM_KILLFOCUS:
DestroyCaret(hWnd);
CMD_NotifyParent(hWnd,CM_KILLFOCUS);
return 0;
case WM_ENABLE:
InvalidateClient(hWnd,&((SLEDITDATA *)WndClsBuf(hWnd))->textArea);
return 0;
case WM_PAINT:
SLEdit_Repaint(hWnd);
return 0;
}
return DefWindowProc (hWnd, Message, WParam, LParam);
}
//---------------------------------------------------------------------------
void CM_RegisterSingleLineEdit(void)
{ TWNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.dwStyle=WS_BORDER_LOWERED;
wc.clForeground=CL_WINDOWTEXT;
wc.clBackground=CL_WHITE;
wc.cbTextHeap=LEN_SLEDIT_BUFFER;
wc.cbWndExtra=sizeof(SLEDITDATA);
wc.lpfnWndProc=SLEditCtrlProc;
wc.lpszClassName="Edit";
RegisterClass(&wc);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -