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

📄 ebmedit.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 5 页
字号:


				//fprint (stderr, "textOut-buffer = %s\n", dispBuffer+pLineData->wrapStartPos[wrapline]);

				if (dwStyle & EES_AUTOWRAP)

				{				

                	TextOutLen (hdc, pMLEditData->leftMargin - pMLEditData->dispPos, y,

						dispBuffer+pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]],

						pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline+1]]

							-pMLEditData->pos_chars[pLineData->wrapStartPos[wrapline]]);

				}

				else

                	TextOut(hdc, pMLEditData->leftMargin - pMLEditData->dispPos, y, dispBuffer);

						

			}

            EndPaint (hWnd, hdc);

        }

        break;

        case MSG_KEYDOWN:

        {

            BOOL    bChange = FALSE;

            int     i;

           	int  	line, wrapline;

            RECT    InvRect; 

            int     deleted;

			PEBLINEDATA temp = NULL;

			char *  tempP = NULL;

						

	   		pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);

			GetClientRect (hWnd, &InvRect);

			InvRect.left = pMLEditData->leftMargin - 1;

        

            switch (LOWORD (wParam)) 

			{

                case SCANCODE_ENTER:

				{

		            if (dwStyle & EES_READONLY) 

					{

		                Ping();

		                return 0;

		            }

   		    		edtPosProc (hWnd); 



            		if ((pMLEditData->totalLimit >= 0) 

							&& ((pMLEditData->curtotalLen + 1) > pMLEditData->totalLimit)) 

					{

                		Ping ();

						NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_MAXTEXT);

        		        return 0;

		            }

					else

						pMLEditData->curtotalLen++;



					if (dwStyle & EES_AUTOWRAP)

					{

						edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);

						pLineData = GetLineData(pMLEditData, line);

					}

					else

						pLineData = GetLineData(pMLEditData,pMLEditData->editLine);

					

					edtGetLineInfo (hWnd, pLineData);

					

					if (pMLEditData->veditPos < pMLEditData->fit_chars)

						tempP = pLineData->buffer + pMLEditData->pos_chars[pMLEditData->veditPos];

				    temp = pLineData->next;

					pLineData->next = malloc( sizeof(EBLINEDATA) );

					pLineData->next->previous = pLineData;

					pLineData->next->next = temp;

					

					if(temp)

						temp->previous = pLineData->next;

					

					temp = pLineData->next;

					if(dwStyle & EES_AUTOWRAP)

						temp->lineNO = line + 1;

					else

						temp->lineNO  = pMLEditData->editLine + 1;

					

					if(tempP) 

					{

						memcpy(temp->buffer,tempP,strlen(tempP));

						temp->dataEnd = strlen(tempP);

					}

					else

						temp->dataEnd = 0;

					

					temp->buffer[temp->dataEnd] = '\0'; 

					pLineData->dataEnd = pMLEditData->pos_chars[pMLEditData->veditPos];

					pLineData->buffer[pLineData->dataEnd]='\0';

					temp = temp->next;

					while (temp)

					{

						temp->lineNO++;

						temp = temp->next;

					}

					

					if (dwStyle & EES_AUTOWRAP)

					{					

						if (!((pMLEditData->veditPos == pLineData->wrapStartPos[wrapline])

							   && (wrapline)))

							pMLEditData->editLine++;

						

						pMLEditData->wraplines -= pLineData->nwrapline;

        				calcLineInfo (hWnd, pMLEditData, pLineData);

						calcLineInfo (hWnd, pMLEditData, pLineData->next);

						edtGetLineInfo (hWnd, pLineData->next);

						pMLEditData->lines++;

						pMLEditData->wraplines += pLineData->nwrapline + pLineData->next->nwrapline;

						pMLEditData->veditPos=0;



						if (pMLEditData->editLine > pMLEditData->EndlineDisp)

						{

							pMLEditData->EndlineDisp = pMLEditData->editLine;

							if (pMLEditData->EndlineDisp > 

											pMLEditData->StartlineDisp+pMLEditData->MaxlinesDisp-1)

							{

								pMLEditData->StartlineDisp = pMLEditData->EndlineDisp

															-pMLEditData->MaxlinesDisp + 1;

							}

							else 

							{

								InvRect.top=(pMLEditData->editLine-pMLEditData->StartlineDisp -1) 

												*pMLEditData->lineHeight+pMLEditData->topMargin;

								InvRect.bottom  -=  pMLEditData->lineHeight;

							}

						}

						else 

						{

							pMLEditData->EndlineDisp = pMLEditData->StartlineDisp + 

								MIN (pMLEditData->wraplines - pMLEditData->StartlineDisp, 

								pMLEditData->MaxlinesDisp) - 1;

						}

						pMLEditData->linesDisp=pMLEditData->EndlineDisp-pMLEditData->StartlineDisp+1;

						NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_CHANGE);

    	            	InvalidateRect (hWnd, &InvRect, TRUE);

						edtSetCaretPos (hWnd, TRUE);

						edtSetScrollInfo (hWnd, pMLEditData, TRUE);

						

						if (pMLEditData->bSCROLL)

							InvalidateRect (hWnd, NULL, TRUE);

						

						if (pMLEditData->editLine > pMLEditData->MaxlinesDisp)

							NotifyParentPos(hWnd);

						return 0;

					}



					// added by leon to optimize display

					if ((pMLEditData->editLine - pMLEditData->StartlineDisp + 1) 

									< pMLEditData->MaxlinesDisp) 

					{

						if (!(pMLEditData->dx_chars[pMLEditData->veditPos] - pMLEditData->leftMargin

                	         	> edtGetOutWidth (hWnd))) 

                	    {

							InvRect.top  = (pMLEditData->editLine - pMLEditData->StartlineDisp -1) 

												* pMLEditData->lineHeight

										      	+ pMLEditData->topMargin;

						}

								

				    }

					else 

					{

						if ((pMLEditData->vdispPos == 0) 

								&& (pMLEditData->vdispPos == pMLEditData->veditPos))		 

							InvRect.bottom  -=  pMLEditData->lineHeight;

					 }

					// added by leon to optimize display

					pMLEditData->veditPos = 0;

					pMLEditData->vdispPos = 0;

				

					if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)

					{

						pMLEditData->EndlineDisp++;

						pMLEditData->linesDisp++;

					}

					else if(pMLEditData->editLine == pMLEditData->EndlineDisp) 

					{

						pMLEditData->StartlineDisp++;

						pMLEditData->EndlineDisp++;

					}

					pMLEditData->editLine++;

					edtGetLineInfo (hWnd, GetLineData(pMLEditData,pMLEditData->editLine));	

					pMLEditData->lines++;

					

					pMLEditData->dispPos = 0;



					pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];

					edtSetCaretPos (hWnd, TRUE);

					edtSetScrollInfo (hWnd, pMLEditData, TRUE);

    	            InvalidateRect (hWnd, &InvRect, TRUE); // modified by leon



					NotifyParent (hWnd, GetDlgCtrlID(hWnd), EEN_CHANGE);

					if (pMLEditData->bSCROLL)

						InvalidateRect (hWnd, NULL, TRUE);

        	        return 0;

				}

                case SCANCODE_HOME:

				{

					int 		line = 0, wrapline = 0;

                    BOOL 		bScroll = FALSE;



					pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);



                    if (pMLEditData->veditPos == 0)

                        return 0;



					if (dwStyle & EES_AUTOWRAP)

					{

						edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);

						pLineData = GetLineData(pMLEditData, line);



						pMLEditData->editLine -= wrapline;

						if (pMLEditData->editLine < pMLEditData->StartlineDisp)

						{

							pMLEditData->StartlineDisp = pMLEditData->editLine;

							pMLEditData->linesDisp =  MIN (pMLEditData->wraplines 

															- pMLEditData->StartlineDisp, 

														pMLEditData->MaxlinesDisp);

							pMLEditData->EndlineDisp = 

									pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;

							bScroll = TRUE;

						}

						edtGetCaretValid (hWnd, pMLEditData->editLine, 0, 0);



						edtSetCaretPos (hWnd, TRUE);

						if (bScroll)

						{

							InvalidateRect(hWnd,NULL,TRUE);	

							edtSetScrollInfo (hWnd, pMLEditData, TRUE);

						}

						if (pMLEditData->bSCROLL)

							InvalidateRect (hWnd, NULL, TRUE);

						return 0;

					}

					

					pMLEditData->veditPos = 0;



                    if (pMLEditData->vdispPos != 0)

					{

						pMLEditData->vdispPos = 0;

					    InvalidateRect (hWnd, NULL, TRUE);

					}

					pMLEditData->dispPos = 0;

					edtSetCaretPos (hWnd, TRUE);

					edtSetScrollInfo (hWnd, pMLEditData, TRUE);

					if (pMLEditData->bSCROLL)

						InvalidateRect (hWnd, NULL, TRUE);

               		return 0;

            	}

                case SCANCODE_END:

                {

                    int  	newStartPos, oldeditPos, line, wrapline;

                    BOOL 	bScroll = FALSE;



					pMLEditData =(PEBMLEDITDATA) GetWindowAdditionalData2(hWnd);



					if (dwStyle & EES_AUTOWRAP)

					{

						edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);

						pLineData = GetLineData(pMLEditData, line);

					}else 

	                    pLineData = GetLineData(pMLEditData,pMLEditData->editLine);

					

					edtGetLineInfo (hWnd, pLineData);

                    if (pMLEditData->veditPos == pMLEditData->fit_chars)

                        return 0;

					

					if (dwStyle & EES_AUTOWRAP)

					{

						pMLEditData->veditPos = pMLEditData->fit_chars;

						pMLEditData->editLine += pLineData->nwrapline - 1 - wrapline;

						if (pMLEditData->editLine > pMLEditData->EndlineDisp)

						{

							pMLEditData->EndlineDisp = pMLEditData->editLine;

							pMLEditData->StartlineDisp = 

									pMLEditData->EndlineDisp - pMLEditData->MaxlinesDisp + 1;

							bScroll = TRUE;

						}



						oldeditPos = pMLEditData->dx_chars[pMLEditData->veditPos] 

							- pMLEditData->dx_chars[pLineData->wrapStartPos[pLineData->nwrapline-1]];

						

						edtGetCaretValid (hWnd, pMLEditData->editLine, 0, oldeditPos);



						edtSetCaretPos (hWnd, TRUE);

						if (bScroll)

							InvalidateRect(hWnd,NULL,TRUE);	

						edtSetScrollInfo (hWnd, pMLEditData, TRUE);

						if (pMLEditData->bSCROLL)

							InvalidateRect (hWnd, NULL, TRUE);

						return 0;

					}



					

                    newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData);

                    pMLEditData->veditPos = pMLEditData->fit_chars;



					pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];

                    if (pMLEditData->vdispPos != newStartPos) {

                    	pMLEditData->vdispPos = newStartPos;

						pMLEditData->dispPos = pMLEditData->dx_chars[pMLEditData->vdispPos];

                        InvalidateRect (hWnd, NULL, TRUE);

					}

					edtSetCaretPos (hWnd, TRUE);

					edtSetScrollInfo (hWnd, pMLEditData, TRUE);

                }

					if (pMLEditData->bSCROLL)

						InvalidateRect (hWnd, NULL, TRUE);

                return 0;



                case SCANCODE_CURSORBLOCKLEFT: 

                {

                    BOOL 		bScroll = FALSE;

                    int  		newStartPos, line, wrapline;

					PEBLINEDATA 	temp;



   		    		edtPosProc (hWnd); 

					if (dwStyle & EES_AUTOWRAP)

					{

						edtGetLineNums (pMLEditData, pMLEditData->editLine, &line, &wrapline);

						pLineData = GetLineData(pMLEditData, line);

					}

					else

						pLineData = GetLineData(pMLEditData,pMLEditData->editLine);



					if (dwStyle & EES_AUTOWRAP)

					{

						if (!pMLEditData->veditPos && !pMLEditData->editLine) return 0;

						edtGetLineInfo (hWnd, pLineData);

						if (!pMLEditData->veditPos)

						{

							if (pMLEditData->editLine == pMLEditData->StartlineDisp) {

								bScroll = TRUE;

								pMLEditData->StartlineDisp--;

								if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)

									pMLEditData->EndlineDisp--;

							}

							pMLEditData->editLine--;

							temp = pLineData->previous;

							edtGetLineInfo (hWnd, temp);

							pMLEditData->veditPos = temp->wrapStartPos[temp->nwrapline];

						}else if (pMLEditData->veditPos == pLineData->wrapStartPos[wrapline]) {

							if (pMLEditData->editLine == pMLEditData->StartlineDisp) {

								bScroll = TRUE;

								pMLEditData->StartlineDisp--;

								if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)

									pMLEditData->EndlineDisp--;

							}

							pMLEditData->editLine--;

							pMLEditData->veditPos--; 

						}else 

							pMLEditData->veditPos--;



						pMLEditData->linesDisp = pMLEditData->EndlineDisp 

												- pMLEditData->StartlineDisp + 1;

						edtSetCaretPos (hWnd, TRUE);

						if (bScroll)

						{

							InvalidateRect(hWnd,NULL,TRUE);	

							edtSetScrollInfo (hWnd, pMLEditData, TRUE);

						}

						if (pMLEditData->bSCROLL)

							InvalidateRect (hWnd, NULL, TRUE);

						return 0;

					}



					

                    if (!pMLEditData->veditPos)

					{

						temp = pLineData->previous;

						if (!temp) return 0;

						if(pMLEditData->editLine > 0 )

						{

							if (pMLEditData->editLine == pMLEditData->StartlineDisp) {

								bScroll = TRUE;

								pMLEditData->StartlineDisp--;

								if (pMLEditData->EndlineDisp >= pMLEditData->MaxlinesDisp)

									pMLEditData->EndlineDisp--;

							}

							pMLEditData->editLine --;

							edtGetLineInfo (hWnd, GetLineData (pMLEditData, pMLEditData->editLine));

							pMLEditData->veditPos = pMLEditData->fit_chars; 

		                    newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);

                    		if (pMLEditData->vdispPos != newStartPos)

							{

								pMLEditData->vdispPos = newStartPos;

								bScroll = TRUE;

							}

						}

					}

					else

                    {	

						if (pMLEditData->veditPos == pMLEditData->vdispPos){

							pMLEditData->veditPos--;

							if (edtGetNewvPos (hWnd,

												GetLineData(pMLEditData,pMLEditData->editLine),

												pMLEditData->dx_chars[pMLEditData->veditPos] 

												- edtGetOutWidth (hWnd)/4) == -1)

								pMLEditData->vdispPos = 0;

							else {

								pMLEditData->vdispPos = edtGetNewvPos (hWnd,

												GetLineData(pMLEditData,pMLEditData->editLine),

												pMLEditData->dx_chars[pMLEditData->veditPos] 

												- edtGetOutWidth (hWnd)/4);

							}

⌨️ 快捷键说明

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