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

📄 medit.c

📁 一个嵌入式操作系统(microwindows)的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
					}					pMLEditData->editPos = 0;					pMLEditData->caretPos= 0;					pMLEditData->dispPos = 0;					if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)					{						pMLEditData->EndlineDisp++;						pMLEditData->linesDisp++;					}					else if(pMLEditData->editLine == pMLEditData->EndlineDisp) 					{						pMLEditData->StartlineDisp++;						pMLEditData->EndlineDisp++;					}					pMLEditData->editLine++;					pMLEditData->lines++;                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                             + pMLEditData->leftMargin,                         (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)							+pMLEditData->topMargin);    	            InvalidateRect (hWnd, NULL, FALSE);        	        return 0;				}                case VK_HOME: 	/* SCANCODE_HOME: */				{					PLINEDATA temp;                    if (pMLEditData->editPos == 0)                        return 0;                    pMLEditData->editPos  = 0;                    pMLEditData->caretPos = 0;                    SetCaretPos (pMLEditData->leftMargin,                         (pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)							+pMLEditData->topMargin);					temp = GetLineData(pMLEditData,pMLEditData->editLine);	                    if (pMLEditData->dispPos != 0)					{						pMLEditData->dispPos = 0;					    InvalidateRect (hWnd, NULL, FALSE);					}               		return 0;            	}                case VK_END: /* SCANCODE_END: */                {                    int newStartPos;                    pLineData = GetLineData(pMLEditData,pMLEditData->editLine);                    if (pMLEditData->editPos == pLineData->dataEnd)                        return 0;                    newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData);                                        pMLEditData->editPos = pLineData->dataEnd;                    pMLEditData->caretPos = pMLEditData->editPos - newStartPos;                                        SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                            + pMLEditData->leftMargin, 						(pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)	                        + pMLEditData->topMargin);                    if (pMLEditData->dispPos != newStartPos)                        InvalidateRect (hWnd, NULL, FALSE);					pMLEditData->dispPos = newStartPos;                }                return 0;                case VK_LEFT: /* SCANCODE_CURSORBLOCKLEFT: */                {                    BOOL bScroll = FALSE;                    int  scrollStep,newStartPos;					PLINEDATA temp;					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);                    if (pMLEditData->editPos == 0 )					{						temp = pLineData->previous;						if(temp && pMLEditData->editLine > pMLEditData->StartlineDisp)						{							pMLEditData->editLine --;													pMLEditData->editPos = temp->dataEnd; 		                    newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);                    		pMLEditData->caretPos = pMLEditData->editPos - newStartPos;                    		if (pMLEditData->dispPos != newStartPos)							{								pMLEditData->dispPos = newStartPos;								bScroll = TRUE;							}						}						else	                        return 0;					}					else                    {	if (edtIsACCharBeforePosition (pLineData->buffer,                                     pLineData->dataEnd,                        	    pMLEditData->editPos)) {                        	scrollStep = 2;                        	pMLEditData->editPos -= 2;                    	}                    	else {                       	 	scrollStep = 1;                        	pMLEditData->editPos --;                    	}                    	pMLEditData->caretPos -= scrollStep;                    	if (pMLEditData->caretPos == 0                         	    && pMLEditData->editPos != 0) {                        	bScroll = TRUE;                        	if (edtIsACCharBeforePosition (pLineData->buffer,                                     pLineData->dataEnd,                            	    pMLEditData->editPos)) {                           		pMLEditData->dispPos -= 2;                            	pMLEditData->caretPos = 2;                        	}                        	else {								pMLEditData->dispPos--;								                            pMLEditData->caretPos = 1;    	                    }        	            }            	        else if (pMLEditData->caretPos < 0) {							pMLEditData->dispPos = 0;                    	    pMLEditData->caretPos = 0;                    	}                    }                        SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                             + pMLEditData->leftMargin, 						(pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)                        	+ pMLEditData->topMargin);                    if (bScroll)                        InvalidateRect (hWnd, NULL, FALSE);                }                return 0;                		case VK_RIGHT: /* SCANCODE_CURSORBLOCKRIGHT: */                {                    BOOL bScroll = FALSE;                    int  scrollStep, moveStep;					PLINEDATA temp;					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);                    if (pMLEditData->editPos == pLineData->dataEnd)					{						temp = pLineData->next;						if(temp)						{							pMLEditData->editLine++;							pMLEditData->editPos  = 0;							pMLEditData->caretPos = 0;								if(pMLEditData->dispPos !=0)							{								pMLEditData->dispPos  = 0;								bScroll = TRUE;							}						}						else	                        return 0;					}					else                    {							if (edtIsACCharAtPosition (pLineData->buffer,                         	        pLineData->dataEnd,                            	    pMLEditData->dispPos)) {              	            if (edtIsACCharAtPosition (pLineData->buffer,                                     pLineData->dataEnd,                                    pMLEditData->editPos)) {                      	        scrollStep = 2;                        	    moveStep = 2;                            	pMLEditData->editPos  += 2;                        	}                        	else {                            	scrollStep = 2;	                            moveStep = 1;    	                        pMLEditData->editPos ++;        	                }            	        }                	    else {                    	    if (edtIsACCharAtPosition (pLineData->buffer,                         	            pLineData->dataEnd,                            	        pMLEditData->editPos)) {                                    	                            if (edtIsACCharAtPosition (pLineData->buffer,     	                                pLineData->dataEnd,        	                            pMLEditData->dispPos + 1))            	                    scrollStep = 3;                	            else                    	            scrollStep = 2;	    	                        moveStep = 2;        	                    pMLEditData->editPos += 2;            	            }                	        else {                    	        scrollStep = 1;                        	    moveStep = 1;                            	pMLEditData->editPos ++;	                        }    	                }        	            pMLEditData->caretPos += moveStep;            	        if (pMLEditData->caretPos * GetSysCharWidth (hWnd)                 	            > edtGetOutWidth (hWnd)) {                    	    bScroll = TRUE;                        	pMLEditData->dispPos += scrollStep;	                        pMLEditData->caretPos =     	                        pMLEditData->editPos - pMLEditData->dispPos;        	            }					}                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                             + pMLEditData->leftMargin,                         (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight (hWnd)                         	+ pMLEditData->topMargin);                    if (bScroll)                        InvalidateRect (hWnd, NULL, FALSE);                }                return 0;               			case VK_UP: /* SCANCODE_CURSORBLOCKUP: */		{                    BOOL bScroll = FALSE;                    int  newStartPos;					PLINEDATA temp;					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);					temp = pLineData->previous; 					if(pMLEditData->editLine == 0)						return 0;					else if (pMLEditData->editLine == pMLEditData->StartlineDisp)					{						bScroll = TRUE;						pMLEditData->StartlineDisp--;						pMLEditData->EndlineDisp--;						}					pMLEditData->editLine--;					if( pMLEditData->editPos >= temp->dataEnd ) 					{						pMLEditData->editPos = temp->dataEnd;						pMLEditData->dispPos = 0;	                   	newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);               			pMLEditData->dispPos =  newStartPos;						pMLEditData->caretPos = pMLEditData->editPos - newStartPos;						bScroll = TRUE;					}									else 					{       			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,                   				pMLEditData->caretPos * GetSysCharWidth (hWnd)                        			+ pMLEditData->leftMargin);						if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,								pMLEditData->dispPos))						{							bScroll = TRUE;							pMLEditData->dispPos--;        			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,                      				pMLEditData->caretPos * GetSysCharWidth (hWnd)                           			+ pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);						}	   	        	    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;   		    	        pMLEditData->caretPos = newStartPos;					}                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                             + pMLEditData->leftMargin, 					    (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)                            + pMLEditData->topMargin);					if(bScroll)						InvalidateRect(hWnd,NULL,FALSE);					}				break;		case VK_DOWN: /* SCANCODE_CURSORBLOCKDOWN: */		{                    BOOL bScroll = FALSE;                    int  newStartPos;					PLINEDATA temp;					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);					temp = pLineData->next; 					if(pMLEditData->editLine == pMLEditData->lines-1)						return 0;					else if (pMLEditData->editLine == pMLEditData->EndlineDisp)					{						bScroll = TRUE;						pMLEditData->StartlineDisp++;						pMLEditData->EndlineDisp++;						}					pMLEditData->editLine++;					if( pMLEditData->editPos >= temp->dataEnd ) 					{						pMLEditData->editPos = temp->dataEnd;						pMLEditData->dispPos = 0;	                   	newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);               			pMLEditData->dispPos =  newStartPos;						pMLEditData->caretPos = pMLEditData->editPos - newStartPos;						bScroll = TRUE;					}									else 					{       			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,                   				pMLEditData->caretPos * GetSysCharWidth (hWnd)                        			+ pMLEditData->leftMargin);						if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,								pMLEditData->dispPos))						{							bScroll = TRUE;							pMLEditData->dispPos--;           			   		newStartPos = edtGetOffset(hWnd, pMLEditData,temp,                       				pMLEditData->caretPos * GetSysCharWidth (hWnd)                            			+ pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);						}	   	        	    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;   		    	        pMLEditData->caretPos = newStartPos;					}                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)                             + pMLEditData->leftMargin, 					    (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)                            + pMLEditData->topMargin);					if(bScroll)						InvalidateRect(hWnd,NULL,FALSE);							}				break;                case VK_INSERT: /* SCANCODE_INSERT: */					dw = GetWindowAdditionalData(hWnd);	                    dw ^= EST_REPLACE;					SetWindowAdditionalData(hWnd,dw);                break;                case VK_DELETE: /* SCANCODE_REMOVE: */				{					PLINEDATA temp;					int leftLen;					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){#if 0	/* fix: no ping() */                        ping ();#endif                        return 0;                    }                   	temp = pLineData->next; 					if (pLineData->dataEnd == pMLEditData->editPos && temp)					{						if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)						{							memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,temp->dataEnd);								pLineData->dataEnd += temp->dataEnd;							pLineData->buffer[pLineData->dataEnd] = '\0';							if(temp->next)							{							    pLineData->next = temp->next;								temp->next->previous = pLineData;								}							else								pLineData->next = NULL;							free(temp);							temp = pLineData->next;							while (temp)							{								temp->lineNO--;								temp = temp->next;							}							if(pMLEditData->lines <= pMLEditData->MaxlinesDisp)							{								pMLEditData->EndlineDisp--;								pMLEditData->linesDisp--;							}							if(pMLEditData->EndlineDisp >= pMLEditData->lines-1)									{								pMLEditData->EndlineDisp--;								if(pMLEditData->StartlineDisp !=0)									pMLEditData->StartlineDisp--;								else									pMLEditData->linesDisp--;							}							pMLEditData->lines--;						}						else if (temp->dataEnd > 0)						{							leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd;							memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen);							pLineData->dataEnd +=leftLen;							pLineData->buffer[pLineData->dataEnd] = '\0';							memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen);  							temp->dataEnd -=leftLen;							temp->buffer[temp->dataEnd] = '\0';						}					}					else if (pMLEditData->editPos != pLineData->dataEnd)					{		                    if (edtIsACCharAtPosition (pLineData->buffer,     	                                pLineData->dataEnd,        	                            pMLEditData->editPos))	                        deleted = 2;    	                else        	                deleted = 1;                                    	        for (i = pMLEditData->editPos;                 	            i < pLineData->dataEnd - deleted;                    	        i++) 	                       pLineData->buffer [i]     	                        = pLineData->buffer [i + deleted];        	            pLineData->dataEnd -= deleted;						pLineData->buffer[pLineData->dataEnd] = '\0';					}                	bChange = TRUE;                    InvalidateRect (hWnd, NULL,FALSE);				}                break;                case VK_BACK: /* SCANCODE_BACKSPACE: */				{					PLINEDATA temp;					int leftLen,tempEnd;                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){#if 0	 /* fix: no Ping() */                        Ping ();#endif                        return 0;                    }					pLineData = GetLineData(pMLEditData,pMLEditData->editLine);					temp = pLineData->previous;						if (pMLEditData->editPos == 0 && temp)					{						tempEnd = temp->dataEnd;						if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)							{							memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,pLineData->dataEnd);								temp->dataEnd +=pLineData->dataEnd;							temp->buffer[temp->dataEnd] = '\0';							if(pLineData->next)							{							    temp->next = pLineData->next;								pLineData->next->previous = temp;							}							else								temp->next = NULL;							free(pLineData);							pLineData = temp;							temp = temp->next;							while(temp)

⌨️ 快捷键说明

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