📄 sledit.c
字号:
if (IsACCharBeforePos (pEditData->buffer, pEditData->iEditPos)) { scrollStep = 2; pEditData->iEditPos -= 2; } else { scrollStep = 1; pEditData->iEditPos --; } pEditData->iCaretPos -= scrollStep; if (pEditData->iCaretPos == 0 && pEditData->iEditPos != 0) { bScroll = TRUE; if (IsACCharBeforePos(pEditData->buffer, pEditData->iEditPos)) { pEditData->iStartPos -= 2; pEditData->iCaretPos = 2; } else{ pEditData->iStartPos --; pEditData->iCaretPos = 1; } } else if (pEditData->iCaretPos < 0) { pEditData->iStartPos = 0; pEditData->iCaretPos = 0; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); break; case SCANCODE_RIGHT: bScroll = FALSE; if (pEditData->iEditPos == pEditData->iDataLen) return 0; if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos)) { if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) { scrollStep = 2; moveStep = 2; pEditData->iEditPos += 2; } else { scrollStep = 2; moveStep = 1; pEditData->iEditPos ++; } } else {// isn't a chinese character at start position if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) { if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos + 1)) scrollStep = 3; else scrollStep = 2; moveStep = 2; pEditData->iEditPos += 2; } else { scrollStep = 1; moveStep = 1; pEditData->iEditPos ++; } } iLimit = pWin->rect.right - pWin->rect.left + 1 - 2 * wndGetBorder(hWnd) - pEditData->iLeftMargin - pEditData->iRightMargin; pEditData->iCaretPos += moveStep; if (pEditData->iCaretPos * GetSysCharWidth () > iLimit) { bScroll = TRUE; pEditData->iStartPos += scrollStep; pEditData->iCaretPos = pEditData->iEditPos - pEditData->iStartPos; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); if (bScroll) InvalidateRect (hWnd, NULL, TRUE); break; case SCANCODE_INS: pEditData = (PSLEditData) (pWin->dwData); pEditData->dwStatus ^= EST_REPLACE; break; case SCANCODE_DEL: { int i; pEditData = (PSLEditData) (pWin->dwData); if ((pWin->dwStyle & ES_READONLY) || (pEditData->iEditPos == pEditData->iDataLen)){ return 0; } if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) deleted = 2; else deleted = 1; for(i=pEditData->iEditPos; i<pEditData->iDataLen; i++) pEditData->buffer[i] = pEditData->buffer[i+deleted]; //for (i = pEditData->iEditPos; // i < pEditData->iDataLen - deleted; i++) // pEditData->buffer [i] = pEditData->buffer [i + deleted]; pEditData->iDataLen -= deleted; bChange = TRUE; InvRect.left = pEditData->iLeftMargin + pEditData->iCaretPos * GetSysCharWidth (); InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; InvalidateRect (hWnd, &InvRect, TRUE); break; } case SCANCODE_BACKSPACE: { int i; pEditData = (PSLEditData) (pWin->dwData); if ((pEditData->dwStatus & ES_READONLY) || (pEditData->iEditPos == 0)) { return 0; } if (IsACCharBeforePos (pEditData->buffer, pEditData->iEditPos)) deleted = 2; else deleted = 1; for (i = pEditData->iEditPos - deleted; i < pEditData->iDataLen; i++) pEditData->buffer [i] = pEditData->buffer [i + deleted]; pEditData->iDataLen -= deleted; pEditData->iEditPos -= deleted; bChange = TRUE; pEditData->iCaretPos -= deleted; if (pEditData->iCaretPos == 0 && pEditData->iEditPos != 0) { if (IsACCharBeforePos (pEditData->buffer, pEditData->iEditPos)) { pEditData->iStartPos -= 2; pEditData->iCaretPos = 2; } else { pEditData->iStartPos --; pEditData->iCaretPos = 1; } InvRect.left = pEditData->iLeftMargin; InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } else { InvRect.left = pEditData->iLeftMargin + pEditData->iCaretPos * GetSysCharWidth (); InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); InvalidateRect (hWnd, &InvRect, TRUE); break; } } if (bChange) NotifyParent (hWnd, EN_CHANGE); return 0;}static intedtProcessChar( HWND hWnd, WPARAM wParam, LPARAM lParam){ PWindowsTree pWin; PSLEditData pEditData; char charBuffer[2]; int chars, inserting, scrollStep, iLimit; RECT InvRect; int i; pWin = (PWindowsTree)hWnd; pEditData = (PSLEditData) (pWin->dwData); if (pWin->dwStyle & ES_READONLY) { return 0; } if (HIBYTE (wParam)) { charBuffer [0] = LOBYTE (wParam); charBuffer [1] = HIBYTE (wParam); chars = 2; } else { charBuffer [0] = LOBYTE (wParam); chars = 1; } if (chars == 1) { switch (charBuffer [0]){ case 0x00: // NULL case 0x07: // BEL case 0x08: // BS case 0x09: // HT case 0x0A: // LF case 0x0B: // VT case 0x0C: // FF case 0x0D: // CR case 0x1B: // Escape return 0; } } if (pEditData->dwStatus & EST_REPLACE) { if (pEditData->iDataLen == pEditData->iEditPos) inserting = chars; else if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iEditPos)) { if (chars == 2) inserting = 0; else inserting = -1; } else { if (chars == 2) inserting = 1; else inserting = 0; } } else inserting = chars; // check space if (pEditData->iDataLen + inserting > pEditData->iBufferLen) { NotifyParent(hWnd,EN_MAXTEXT); return 0; } if (inserting == -1) { for (i = pEditData->iEditPos; i < pEditData->iDataLen-1; i++) pEditData->buffer [i] = pEditData->buffer [i + 1]; } else if (inserting > 0) { for (i = pEditData->iDataLen + inserting - 1; i > pEditData->iEditPos + inserting - 1;i--) pEditData->buffer [i] = pEditData->buffer [i - inserting]; } for (i = 0; i < chars; i++) pEditData->buffer [pEditData->iEditPos + i] = charBuffer [i]; pEditData->iEditPos += chars; pEditData->iCaretPos += chars; pEditData->iDataLen += inserting; iLimit = pWin->rect.right - pWin->rect.left + 1 - 2 * wndGetBorder(hWnd) - pEditData->iLeftMargin - pEditData->iRightMargin; if (pEditData->iCaretPos * GetSysCharWidth () > iLimit){ if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos)) scrollStep = 2; else { if (chars == 2) { if (IsACCharAtPos (pEditData->buffer, pEditData->iDataLen, pEditData->iStartPos + 1)) scrollStep = 3; else scrollStep = 2; } else scrollStep = 1; } pEditData->iStartPos += scrollStep; pEditData->iCaretPos = pEditData->iEditPos - pEditData->iStartPos; InvRect.left = pEditData->iLeftMargin; InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } else { InvRect.left = pEditData->iLeftMargin + (pEditData->iCaretPos - chars) * GetSysCharWidth (); InvRect.top = pEditData->iTopMargin; InvRect.right = pWin->rect.right - pWin->rect.left; InvRect.bottom = pWin->rect.bottom - pWin->rect.top; } SetCaretPos (hWnd, pEditData->iCaretPos * GetSysCharWidth () + pEditData->iLeftMargin, pEditData->iTopMargin); InvalidateRect (hWnd, &InvRect, TRUE); NotifyParent (hWnd, EN_CHANGE); return 0; }static BOOLIsACCharBeforePos( char* pBuffer, int iPos){ if(iPos < 2) return false; if(((unsigned char)*(pBuffer + iPos - 1) > 0xA0) && ((unsigned char)*(pBuffer + iPos - 2) > 0xA0)) return true; return false;}static BOOLIsACCharAtPos( char* pBuffer, int iLen, int iPos){ if(iPos > iLen - 2) return false; if(((unsigned char)*(pBuffer + iPos) > 0xA0) && ((unsigned char)*(pBuffer + iPos + 1) > 0xA0)) return true; return false; }//get caret position according to the pendown postion static int edtGetCaretPos( PSLEditData pEditData, int x){ char* pBuffer; int iRet; int iWidth, iSysCharWidth, iSysCCharWidth; int iOffset; iWidth = 0; iRet = 0; iSysCharWidth = GetSysCharWidth(); iSysCCharWidth = GetSysCCharWidth(); iOffset = x - pEditData->iLeftMargin; pBuffer = pEditData->buffer; while(*pBuffer){ if((unsigned char)*pBuffer > 0xA0){ iWidth += iSysCCharWidth; pBuffer += 2; iRet += 2; } else{ iWidth += iSysCharWidth; pBuffer ++; iRet += 1; } if(iWidth >= iOffset) break; } return iRet;}static intGetEditBoxDispLen( HWND hWnd){ PWindowsTree pWin; PSLEditData pEditData; int iRet,iCurWidth; int iLimit; int iSysCharWidth, iSysCCharWidth; char* pBuffer; pWin = (PWindowsTree)hWnd; if(!pWin) return -1; pEditData = (PSLEditData)(pWin->dwData); if(!pEditData) return -1; iLimit = pWin->rect.right - pWin->rect.left + 1 - 2 * wndGetBorder(hWnd) - pEditData->iLeftMargin - pEditData->iRightMargin; pBuffer = pEditData->buffer; iCurWidth = 0; iRet = 0; iSysCharWidth = GetSysCharWidth(); iSysCCharWidth = GetSysCCharWidth(); while(pBuffer){ if((unsigned char)*pBuffer>0xA0){ iCurWidth += iSysCCharWidth; iRet += 2; pBuffer += 2; } else{ iCurWidth += iSysCharWidth; iRet += 1; pBuffer ++; } if(iCurWidth >= iLimit) break; } return iRet; }//In case of moving the cursor to the end of the boxstatic int GetStartPos( HWND hWnd, PSLEditData pEditData){ PWindowsTree pWin; char* pBuffer; int iLimit; int iPos; pWin = (PWindowsTree)hWnd; if(!pWin) return -1; pBuffer = pEditData->buffer; if(!pBuffer) return -1; iLimit = pWin->rect.right - pWin->rect.left + 1 - 2 * wndGetBorder(hWnd) - pEditData->iLeftMargin - pEditData->iRightMargin; iPos = 0; while(pBuffer){ if((unsigned char)*pBuffer > 0xA0){ iPos +=2; pBuffer += 2; } else{ iPos ++; pBuffer ++; } if((pEditData->iDataLen - iPos)*GetSysCharWidth() < iLimit) return iPos; } return -1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -