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

📄 mledit.c

📁 详细的MiniGUI源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
edtScanCodeEnd(	HWND hWnd){	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	PMLEditData pEditData;	PLineData pLineData;	int iLineNumber;	int x, y;	int iStartPos;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	pEditData = (PMLEditData)pWin->dwData;	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;	if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos))		return false;	if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))		return false;	pEditData->iCaretXPos = strlen(pStrDisp);	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}//====================  LEFT ========================static BOOLedtScanCodeLeft(	HWND hWnd){	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	int x, y;	PMLEditData pEditData;	PLineData pLineData;	int iStartPos, iLineNumber;	BOOL bScroll;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	bScroll = false;	pEditData = (PMLEditData)pWin->dwData;	if(!pEditData)		return false;	//get string	if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos))		return false;	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;	if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))		return false;	if(pEditData->iCaretXPos != 0){		if(edtIsACCharBeforePos(pStrDisp + pEditData->iCaretXPos))			pEditData->iCaretXPos -= 2;		else			pEditData->iCaretXPos -= 1;	}	else{//have to move caret to the previous line		if(iLineNumber == pEditData->iDispPos){//caret at top line of the editbox			if(pEditData->iDispPos == 0)				return true;			else{				pEditData->iDispPos -- ;				if(!edtGetBoxTopLineInfo(pEditData, &pLineData, &iStartPos))					return false;				iLineNumber = pEditData->iDispPos;				if(!edtGetDispString(&pLineData, iLineNumber, pStrDisp))					return false;				pEditData->iCaretXPos = strlen(pStrDisp);				bScroll = true;			}		}		else{//caret not at top line of the editbox			pEditData->iCaretYPos -- ;			//if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos))			//	return false;			iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;			if(!edtGetDispString(&pLineData, iLineNumber, pStrDisp))				return false;			pEditData->iCaretXPos = strlen(pStrDisp);		}	}	if(bScroll){		edtReCalTopLine(hWnd);		edtSetVScrollInfo(hWnd, pEditData, true);		InvalidateRect(hWnd,NULL,true);	}	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}//====================  RIGHT========================static BOOLedtScanCodeRight(	HWND hWnd){	int x,y;	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	PMLEditData pEditData;	PLineData pLineData;	int iStartPos;	int iLineNumber;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	//get string	if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos))		return false;	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;	if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))		return false;		if(pEditData->iCaretXPos == (int)strlen(pStrDisp)){//move to next line		if(pEditData->iDispPos + pEditData->iCaretYPos + 1 >= pEditData->iTotalLines)			return true;//already at the end		else{			pEditData->iCaretXPos = 0;			if(pEditData->iCaretYPos + 2 > pEditData->iDispLines){				//pEditData->iCaretYPos += 1; //don't increase the value of caret y pos 				pEditData->iDispPos += 1;				bScroll = true;			}			else				pEditData->iCaretYPos += 1; 		}	}	else{		if(edtIsACChar(pEditData->pEditPos))			pEditData->iCaretXPos += 2;		else			pEditData->iCaretXPos += 1;	}	if(bScroll){		edtReCalTopLine(hWnd);		edtSetVScrollInfo(hWnd, pEditData, true);		InvalidateRect(hWnd,NULL,true);	}	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}static BOOLedtReCalCaretXPos(	PMLEditData pEditData,	int iPrevCaretYPos,	int *px){	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	int iLineNumber, iStartPos;	PLineData pLineData;	int iCharNumber, iByteNumber;	int x;	//get string	if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos))		return false;	iLineNumber = pEditData->iDispPos + iPrevCaretYPos;	if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))		return false;	//Get character number 	iCharNumber = iByteNumber = 0;	while(iByteNumber < pEditData->iCaretXPos){		if(edtIsACChar(pStrDisp + iCharNumber))			iByteNumber += 2;		else			iByteNumber += 1;		iCharNumber += 1;	}	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;	if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))		return false;		x = iByteNumber = 0;	while(x < iCharNumber){		if(!*(pStrDisp + iByteNumber))			break;		if(edtIsACChar(pStrDisp + iByteNumber))			iByteNumber += 2;		else			iByteNumber += 1;		x += 1;	}	*px = iByteNumber;	return true;}static BOOLedtReCalCaretXPosNoRef(	PMLEditData pEditData,	int *px){	char pStrDisp[LEN_MLEDIT_LINEBUFFER];	int iLineNumber, iStartPos;	PLineData pLineData;	int x;	//get string	if(!edtGetBoxTopLineInfo(pEditData,&pLineData, &iStartPos))		return false;	iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;	if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))		return false;	x = 0;	while(x < pEditData->iCaretXPos){		if(!*(pStrDisp + x))			break;		if(edtIsACChar(pStrDisp + x))			x += 2;		else			x += 1;	}	*px = x;	return true;}//====================  UP ========================static BOOLedtScanCodeUp(	HWND hWnd){	int x,y;	PMLEditData pEditData;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(pEditData->iCaretYPos == 0){//at top line of edit box		if(pEditData->iDispPos == 0)			return true;		else{			pEditData->iDispPos -- ;			bScroll = true;		}	}	else{		pEditData->iCaretYPos -- ;	}	//recalculate caret x position 	if(!edtReCalCaretXPos(pEditData, pEditData->iCaretYPos + 1, &x))		return false;	pEditData->iCaretXPos = x;		if(bScroll){		edtReCalTopLine(hWnd);		edtSetVScrollInfo(hWnd, pEditData, true);		InvalidateRect(hWnd,NULL,true);	}	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}//====================  Down ========================static BOOLedtScanCodeDown(	HWND hWnd){	int x,y;	PMLEditData pEditData;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	BOOL bScroll;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(pEditData->iCaretYPos + 2 > pEditData->iDispLines){//caret at bottom of the edit box		if(pEditData->iDispPos + pEditData->iCaretYPos + 1 >= pEditData->iTotalLines)			return true;//already at the end		else{			pEditData->iDispPos += 1;			bScroll = true;		}	}	else{//caret not at bottom of the edit box		pEditData->iCaretYPos += 1;	}	//recalculate caret x position 	if(!edtReCalCaretXPos(pEditData, pEditData->iCaretYPos - 1, &x))		return false;	pEditData->iCaretXPos = x;		if(bScroll){		edtReCalTopLine(hWnd);		edtSetVScrollInfo(hWnd, pEditData, true);		InvalidateRect(hWnd,NULL,true);	}	edtSetEditPos(hWnd);	edtCalCaretPos(hWnd,&x,&y);	SetCaretPos(hWnd,x,y);	return true;}//====================  Ins ========================static BOOLedtScanCodeIns(	HWND hWnd){	PMLEditData pEditData;	PWindowsTree pWin;	pWin = (PWindowsTree)hWnd;	pEditData = (PMLEditData)pWin->dwData;	if(!pEditData)		return false;	pEditData->dwStatus ^= EST_REPLACE;	return true;}static BOOLedtReIndexDataAfterDelWrapLine(	PMLEditData pEditData,	PLineData pCurLineData){	pCurLineData->iWrapLineNumber -= 1;	pCurLineData->WrapStartPos[pCurLineData->iWrapLineNumber] = 0;	pEditData->iTotalLines -= 1;	pCurLineData = pCurLineData->pNext;	while(pCurLineData){		pCurLineData->iLineNumber -= 1;		pCurLineData = pCurLineData->pNext;	}	return true;}static BOOLedtReIndexDataAfterDelChar(	PMLEditData pEditData, 	PLineData pCurLineData){	PLineData pLineData;	int iWrapLines;	char* pLine;	int iChars, iPos;	int iDecrease;	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){		iDecrease = pCurLineData->iWrapLineNumber - iWrapLines;		pCurLineData->iWrapLineNumber = iWrapLines;		pLineData = pCurLineData->pNext;		while(pLineData){			pLineData->iLineNumber -= iDecrease;			pLineData = pLineData->pNext;		}		pEditData->iTotalLines -= iDecrease;	}		return true;}//recalculate pCurLineData line wrap position//and recode the line numberstatic BOOLedtReIndexDataAfterDelLine(	PMLEditData pEditData,	PLineData pCurLineData){	PLineData pLineData;	int iChars, iWrapLines, iPos;	char* pLine;	int iDecrease;	//recalculate pCurLinedata line wrap position	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;		}	}	pCurLineData->iWrapLineNumber = iWrapLines;	pLineData = pCurLineData->pNext;	if(!pLineData){		pEditData->iTotalLines = pCurLineData->iLineNumber 			+ pCurLineData->iWrapLineNumber + 1;		return true;	}	iDecrease = pLineData->iLineNumber - 		(pCurLineData->iLineNumber + pCurLineData->iWrapLineNumber + 1);	if(!iDecrease)		return true;	while(pLineData){		pLineData->iLineNumber -= iDecrease;		pLineData = pLineData->pNext;	}		pEditData->iTotalLines -= iDecrease;	return true;}static BOOLedtCombineAdjLine(	PMLEditData pEditData,	PLineData pLineData){	PLineData pNextLineData;		pNextLineData = pLineData->pNext;	if(!pNextLineData)		return false;	if(pNextLineData->pNext){//pNextLineData is not the end of the link table		pLineData->pNext = pNextLineData->pNext;		pNextLineData->pNext->pPrev = pLineData;	}	else{//pNextLineData is at the end of the link table		pLineData->pNext = NULL;	}	strcat(pLineData->pString, pNextLineData->pString);	free(pNextLineData);		edtReIndexDataAfterDelLine(pEditData,pLineData);			return true;}//====================  Del ========================static BOOLedtScanCodeDel(	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 bChange;	BOOL bScroll;	bChange = false;	bScroll = false;	pEditData = (PMLEditData)(pWin->dwData);	if(!pEditData)		return false;	if(!edtGetCurLineData(pEditData,&pLineData))		return false;	if(edtIsCaretAtLineEnd(pEditData)){		if(!pLineData->pNext){//at the end of all text			if(strlen(pLineData->pString)==0){				//if it's not the last left line, remove it				pPrevLineData = pLineData->pPrev;				if(pPrevLineData){					if(pEditData->pDispPointer == pLineData)						pEditData->pDispPointer = pPrevLineData;					pPrevLineData->pNext = NULL;					free(pLineData);					pLineData = NULL;					pEditData->iTotalLines -= 1;									}				//process caret position				if(pEditData->iCaretYPos){					pEditData->iCaretYPos -= 1;					if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos))						return false;					iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;					if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))						return false;					pEditData->iCaretXPos = strlen(pStrDisp);				}				else{//caret at top line of the box					if(pEditData->iDispPos){						pEditData->iDispPos --;						bScroll = true;						if(!edtGetBoxTopLineInfo(pEditData,&pLineData,&iStartPos))							return false;						iLineNumber = pEditData->iDispPos + pEditData->iCaretYPos;						if(!edtGetDispString(&pLineData,iLineNumber,pStrDisp))							return false;						pEditData->iCaretXPos = strlen(pStrDisp);					}					else{//this is the last left line.						//no action					}				}			}		}		else{//not at the end of all text			//combine the next line to the current line 			edtCombineAdjLine(pEditData, pLineData);		}	}	else{//not at line end 		//delete a character at current position		pString = pEditData->pEditPos;		if(edtIsACChar(pString))			iLen = 2;		else			iLen = 1;		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;		if(strlen(pStrDisp) == 0){			if((pEditData->iDispPos + pEditData->iCaretYPos + 1	== pEditData->iTotalLines)				&& (strlen(pLineData->pString) !=0 )){//for caret y pos beyond the text content scale				//move caret to end of upper line				//but if current pLineData is empty after del this character,				//reserver this empty line and do not move caret to the upper line				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))

⌨️ 快捷键说明

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