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

📄 mledit.c

📁 详细的MiniGUI源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
					return false;				pEditData->iCaretXPos = strlen(pStrDisp);				edtReIndexDataAfterDelWrapLine(pEditData, pLineData);			}//			else{//combine next line//				if(pLineData->pNext)//					edtCombineAdjLine(pEditData, pLineData);//			}					}		else{			edtReIndexDataAfterDelChar(pEditData, pLineData);		}	}	edtSetVScrollInfo(hWnd, pEditData, true);	GetWindowRect(hWnd, &rtInvalid);	iWinHeight = rtInvalid.bottom - rtInvalid.top - 1;	iWinWidth = rtInvalid.right - rtInvalid.left - 1;	rtInvalid.top = 0;	rtInvalid.left = 0;	rtInvalid.bottom = iWinHeight - 1;	rtInvalid.right = iWinWidth - 1;	rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight;	InvalidateRect(hWnd,&rtInvalid,true);	if(bScroll)		edtReCalTopLine(hWnd);	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	NotifyParent(hWnd,EN_CHANGE);	return true;}//====================  BackSpace ========================static BOOLedtScanCodeBackSpace(	HWND hWnd){	int iStartPos;	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	char* pString;	int iLineNumber, iLen;	int x, y;	int iWinHeight, iWinWidth;	RECT rtInvalid;		PMLEditData pEditData;	PLineData pLineData, pPrevLineData;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(!edtGetCurLineData(pEditData,&pLineData))		return false;	//whether at the begin position of a plinedata line	if(pEditData->iCaretXPos == 0){		if(pEditData->pEditPos == pLineData->pString){//at pLineData begin positioin			//combine with previous line			pPrevLineData = pLineData->pPrev;			if(!pPrevLineData)				return true;			if(pEditData->iCaretYPos){				pEditData->iCaretYPos --;			}			else if(pEditData->iDispPos){				pEditData->iDispPos --;				pEditData->pDispPointer = pPrevLineData;				bScroll = true;			}			iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;			if(!edtGetDispString(&pPrevLineData,iLineNumber,pStrDisp))				return false;			pEditData->iCaretXPos = strlen(pStrDisp);			if(!edtCombineAdjLine(pEditData,pPrevLineData))				return false;		}		else{			if(pEditData->iCaretYPos){				pEditData->iCaretYPos -- ;			}			else if(pEditData->iDispPos){				pEditData->iDispPos --;				bScroll = true;			}			iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;			if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))				return false;						pString = pEditData->pEditPos;			if(edtIsACCharBeforePos(pString))				iLen = 2;			else				iLen = 1;			pString -= iLen;			while(1){				*pString = *(pString+iLen);				if(!*(pString+iLen))					break;				pString ++;			}			pEditData->iTotalLen -= iLen;					edtReIndexDataAfterDelChar(pEditData, pLineData);			pEditData->iCaretXPos = strlen(pStrDisp) - iLen;					}	}	else{//caret not at the begin positon of a line		//delete a left character 		pString = pEditData->pEditPos;		if(edtIsACCharBeforePos(pString))			iLen = 2;		else			iLen = 1;		pString -= iLen;		while(1){			*pString = *(pString+iLen);			if(!*(pString+iLen))				break;			pString ++;		}		pEditData->iTotalLen -= iLen;		iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;		if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))			return false;		pEditData->iCaretXPos -= iLen;		if(strlen(pStrDisp) == 0){//the deleted character is an only character of this line 			if(strlen(pLineData->pString) !=0){				if(pEditData->iCaretYPos){					pEditData->iCaretYPos --;				}				else if(pEditData->iDispPos){					pEditData->iDispPos -= 1;					bScroll = true;				}				iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;				if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos))					return false;				if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))					return false;				pEditData->iCaretXPos = strlen(pStrDisp);				edtReIndexDataAfterDelWrapLine(pEditData, pLineData);			}			else{//combine next line				if(pLineData->pNext)					edtCombineAdjLine(pEditData, pLineData);			}		}		else{// strlen(pStrDisp) != 0, 			edtReIndexDataAfterDelChar(pEditData, pLineData);		}	}	edtSetVScrollInfo(hWnd, pEditData, true);	GetWindowRect(hWnd, &rtInvalid);	iWinHeight = rtInvalid.bottom - rtInvalid.top - 1;	iWinWidth = rtInvalid.right - rtInvalid.left - 1;	rtInvalid.top = 0;	rtInvalid.left = 0;	rtInvalid.bottom = iWinHeight - 1;	rtInvalid.right = iWinWidth - 1;	rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight;	InvalidateRect(hWnd,&rtInvalid,true);	if(bScroll)		edtReCalTopLine(hWnd);	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	NotifyParent(hWnd,EN_CHANGE);	return true;}//====================  PageUp ========================static BOOLedtScanCodePageUp(	HWND hWnd){	PMLEditData pEditData;	int x, y;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(pEditData->iDispPos == 0)		return true;	if(pEditData->iDispPos > pEditData->iDispLines)		pEditData->iDispPos -= pEditData->iDispLines;	else		pEditData->iDispPos = 0;	//recalculate caret x position 	if(!edtReCalCaretXPosNoRef(pEditData, &x))		return false;	pEditData->iCaretXPos = x;	edtReCalTopLine(hWnd);	edtSetVScrollInfo(hWnd, pEditData, true);	InvalidateRect(hWnd,NULL,true);	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}//====================  PageDown ========================static BOOLedtScanCodePageDown(	HWND hWnd){	PMLEditData pEditData;	int x, y;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(pEditData->iDispPos + pEditData->iDispLines == pEditData->iTotalLines)		return true;		if(pEditData->iDispPos + 2* pEditData->iDispLines < pEditData->iTotalLines)		pEditData->iDispPos += pEditData->iDispLines;	else		pEditData->iDispPos = pEditData->iTotalLines - pEditData->iDispLines;	//recalculate caret x position 	if(!edtReCalCaretXPosNoRef(pEditData, &x))		return false;	pEditData->iCaretXPos = x;	edtReCalTopLine(hWnd);	edtSetVScrollInfo(hWnd, pEditData, true);	InvalidateRect(hWnd,NULL,true);	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}static BOOLedtReIndexDataAfterInsChar(	PMLEditData pEditData, 	PLineData pCurLineData){	PLineData pLineData;	int iWrapLines;	char* pLine;	int iChars, iPos;	int iIncrease;	pLine = pCurLineData->pString;	iChars = 0;	iWrapLines = 0;	iPos = 0;	while(*pLine){		if(edtIsACChar(pLine)){			iChars += 2;			if(iChars > pEditData->iDispChars){				pCurLineData->WrapStartPos[iWrapLines] = iPos;				iWrapLines ++;				iChars = 2;			}			iPos += 2;			pLine += 2;			}		else {			iChars += 1;			if(iChars > pEditData->iDispChars){				pCurLineData->WrapStartPos[iWrapLines] = iPos;				iWrapLines ++;				iChars = 1;			}			iPos += 1;			pLine += 1;		}	}	if(iWrapLines != pCurLineData->iWrapLineNumber){		iIncrease = iWrapLines - pCurLineData->iWrapLineNumber;		pCurLineData->iWrapLineNumber = iWrapLines;		pLineData = pCurLineData->pNext;		while(pLineData){			pLineData->iLineNumber += iIncrease;			pLineData = pLineData->pNext;		}		pEditData->iTotalLines += iIncrease;	}		return true;}static BOOLedtProChar(	HWND hWnd,	char* charBuffer,	int iChars){	if(edtIsReplace(hWnd))		return edtProCharReplace(hWnd,charBuffer,iChars);	else		return edtProCharInsert(hWnd,charBuffer,iChars);}static BOOLedtProCharInsert(	HWND hWnd,	char* charBuffer,	int iChars){	RECT rtInvalid;	char pString[LEN_MLEDIT_LINEBUFFER];	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	int iLineNumber;	int iLen;	PMLEditData pEditData;	PLineData pLineData;	int x, y;	int iWinHeight, iWinWidth;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(!edtGetCurLineData(pEditData, &pLineData))		return false;	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;		if(!edtGetDispString(&pLineData, iLineNumber, pStrDisp))		return false;	if(strlen(pLineData->pString) + iChars > LEN_MLEDIT_LINEBUFFER){		NotifyParent(hWnd,EN_MAXTEXT);		return false;	}	GetWindowRect(hWnd, &rtInvalid);	iWinHeight = rtInvalid.bottom - rtInvalid.top + 1;	iWinWidth = rtInvalid.right - rtInvalid.left + 1;	rtInvalid.top = 0;	rtInvalid.left = 0;	rtInvalid.bottom = iWinHeight - 1;	rtInvalid.right = iWinWidth - 1;	rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight;	if(pEditData->iCaretXPos + iChars > pEditData->iDispChars){		//need wrap to next line		if(pEditData->iCaretYPos == pEditData->iDispLines - 1){			pEditData->iDispPos ++;			pEditData->iCaretXPos = iChars;			bScroll = true;		}		else{			pEditData->iCaretYPos ++;			pEditData->iCaretXPos = iChars;		}	}	else{		pEditData->iCaretXPos += iChars;	}	//at plinedata end ?	if(!*pEditData->pEditPos){		iLen = strlen(pLineData->pString);		strncat(pLineData->pString, charBuffer, iChars);		pLineData->pString[iLen + iChars] = '\0';	}	else{//insert into current position		strcpy(pString,pEditData->pEditPos);		strncpy(pEditData->pEditPos,charBuffer,iChars);		*(pEditData->pEditPos + iChars) = '\0';		strcat(pEditData->pEditPos,pString);	}	pEditData->pEditPos += iChars;	pEditData->iTotalLen += iChars;	if(!edtReIndexDataAfterInsChar(pEditData, pLineData))		return false;		if(bScroll)		edtReCalTopLine(hWnd);	edtSetVScrollInfo(hWnd, pEditData, true);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	if(bScroll)		InvalidateRect(hWnd, NULL, true);	else		InvalidateRect(hWnd,&rtInvalid,true);	NotifyParent(hWnd,EN_CHANGE);	return true;}static BOOLedtReplaceChar(	char* pString,	char* pChars,	int iChars,	int* pReplaced){	char pBuffer[LEN_MLEDIT_LINEBUFFER];	int iLen;	if(!*pString)		return false;	if(edtIsACChar(pString))		iLen = 2;	else		iLen = 1;	*pReplaced = iLen;	strcpy(pBuffer,pString+iLen);	strncpy(pString, pChars, iChars);	pString[iChars] = '\0';	strcat(pString, pBuffer);	pString[iChars + strlen(pBuffer)] = '\0';	return true;}static BOOLedtProCharReplace(	HWND hWnd,	char* charBuffer,	int iChars){	RECT rtInvalid;	int iLineNumber;	int iLen, iReplaced;	PMLEditData pEditData;	PLineData pLineData;	int x, y;	int iWinHeight, iWinWidth;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(!edtGetCurLineData(pEditData, &pLineData))		return false;	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;		GetWindowRect(hWnd, &rtInvalid);	iWinHeight = rtInvalid.bottom - rtInvalid.top - 1;	iWinWidth = rtInvalid.right - rtInvalid.left - 1;	rtInvalid.top = 0;	rtInvalid.left = 0;	rtInvalid.bottom = iWinHeight - 1;	rtInvalid.right = iWinWidth - 1;	rtInvalid.top = pEditData->iCaretYPos * pEditData->iLineHeight;		if(edtIsCaretAtLineEnd(pEditData)){		if(strlen(pLineData->pString) + iChars > LEN_MLEDIT_LINEBUFFER){			NotifyParent(hWnd,EN_MAXTEXT);			return false;		}		if(!pLineData->pNext){//at the end of total text			iLen = strlen(pLineData->pString);			strncat(pLineData->pString, charBuffer, iChars);			pLineData->pString[iLen + iChars] = '\0';			if(!edtReIndexDataAfterInsChar(pEditData, pLineData))				return false;		}		else{//not at the end of total text			//need wrap to next line?			if(pEditData->iCaretXPos + iChars > pEditData->iDispChars){				//is next line empty?				pLineData = pLineData->pNext;				if(*pLineData->pString){//next line not empty					//replace this character					if(!edtReplaceChar(pLineData->pString, charBuffer, iChars, &iReplaced))						return false;					pEditData->iTotalLen += (iChars - iReplaced);					if(iChars > iReplaced){						if(!edtReIndexDataAfterInsChar(pEditData, pLineData))							return false;					}					else if(iChars < iReplaced){						if(!edtReIndexDataAfterDelChar(pEditData, pLineData))							return false;					}				}				else{//next line is empty					strncpy(pLineData->pString, charBuffer, iChars);					pLineData->pString[iChars] = '\0';					pEditData->iTotalLen += iChars;				}			}			else{//doesn't need wrap to next line				//append to end of this line				iLen = strlen(pLineData->pString);				strncat(pLineData->pString, charBuffer, iChars);				pLineData->pString[iLen + iChars] = '\0';			}		}	}	else{//caret not at line end		if(edtIsACChar(pEditData->pEditPos))			iLen = 2;		else			iLen = 1;		if(strlen(pLineData->pString) + iChars - iLen > LEN_MLEDIT_LINEBUFFER){			NotifyParent(hWnd,EN_MAXTEXT);			return false;		}		edtReplaceChar(pEditData->pEditPos, charBuffer, iChars, &iReplaced);		if(iChars > iReplaced){			if(!edtReIndexDataAfterInsChar(pEditData, pLineData))				return false;		}		else if(iChars < iReplaced){			if(!edtReIndexDataAfterDelChar(pEditData, pLineData))				return false;		}		pEditData->iTotalLen += (iChars - iReplaced);	}	if(pEditData->iCaretXPos + iChars > pEditData->iDispChars){		//need wrap to next line		if(pEditData->iCaretYPos == pEditData->iDispLines - 1){			pEditData->iDispPos ++;			pEditData->iCaretXPos = iChars;			bScroll = true;		}		else{			pEditData->iCaretYPos ++;			pEditData->iCaretXPos = iChars;		}	}	else{		pEditData->iCaretXPos += iChars;	}	if(bScroll)		edtReCalTopLine(hWnd);	edtSetVScrollInfo(hWnd, pEditData, true);		edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	if(bScroll)		InvalidateRect(hWnd,NULL,true);	else		InvalidateRect(hWnd,&rtInvalid,true);	NotifyParent(hWnd,EN_CHANGE);	return true;}//SCROLLstatic void edtSetVScrollInfo (	HWND hWnd, 	PMLEditData  pEditData, 	BOOL fRedraw

⌨️ 快捷键说明

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