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

📄 sledit.c

📁 详细的MiniGUI源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -