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

📄 ebedit.c

📁 基于minigui开发的一套图形控件系统
💻 C
📖 第 1 页 / 共 4 页
字号:
			        	default:
			        	break;
			        }
			    }
			}
            SetTextColor (hdc, pEBEditData->textcolor);
            dispLen = edtGetDispLen (hWnd);
            
            if (dispLen == 0) 
			{
                EndPaint (hWnd, hdc);
                break;
            }
                      
            dispBuffer = alloca (dispLen + 1);

            if (dwStyle & EES_PASSWORD)
                memset (dispBuffer, '*', dispLen);
            else
                memcpy (dispBuffer, pEBEditData->buffer + pEBEditData->startPos, dispLen);
                    
            dispBuffer [dispLen] = '\0';
			
            // only implemented ES_LEFT align format for single line edit.
			#if 1 //edit by tjb 2005-7-18 修改原因:文字不能居中、不能垂直居中
			
			uFormat = DT_SINGLELINE | DT_LEFT | DT_TOP;
			
			GetClientRect(hWnd, &rect);

			rect.left += pEBEditData->leftMargin;
            rect.top += pEBEditData->topMargin;
            rect.right -= pEBEditData->rightMargin;
            rect.bottom -= pEBEditData->bottomMargin;
			
			if (dwStyle & EES_VCENTER)
				uFormat |= DT_VCENTER;
			else if(dwStyle & EES_BOTTOM)
				uFormat |= DT_BOTTOM;

			if(dwStyle & EES_CENTER)
				uFormat |= DT_CENTER;
			else if(dwStyle & EES_RIGHT)
				uFormat |= DT_RIGHT;

			DrawText (hdc, dispBuffer, -1, &rect, uFormat);
			#else
			
			rect.left += pEBEditData->leftMargin;
            rect.top += pEBEditData->topMargin;
            rect.right -= pEBEditData->rightMargin;
            rect.bottom -= pEBEditData->bottomMargin;
            
            ClipRectIntersect (hdc, &rect);
			
			if ((dwStyle&EES_ALIGNSMASK) == EES_VCENTER)
			{
				int topoff;
				RECT rc;
				
				GetWindowRect(hWnd, &rc);
				topoff = (RECTH(rc) - GetFontHeight(hdc))/2;
				TextOut (hdc,pEBEditData->leftMargin, topoff, dispBuffer);
			}
			else
				TextOut (hdc, pEBEditData->leftMargin, pEBEditData->topMargin, dispBuffer);
			#endif
            EndPaint (hWnd, hdc);
        }
        break;
		
        case MSG_KEYDOWN:
        {
            BOOL    bChange = FALSE;
            int     i;
            RECT    InvRect;
            int     deleted;
        
            switch (LOWORD (wParam))
            {
                case SCANCODE_ENTER:
                    NotifyParent (hWnd, id, EEN_ENTER);
                	return 0;

                case SCANCODE_HOME:
                { 			
                    if (pEBEditData->editPos == 0)
                        return 0;

                    pEBEditData->editPos  = 0;
                    pEBEditData->caretOff = 0;
					
	                if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
					{
						POINT oldpos;
						GetCaretPos(hWnd, &oldpos);
						SetCaretPos (hWnd, pEBEditData->leftMargin, oldpos.y);
					}
					else
						SetCaretPos (hWnd, pEBEditData->leftMargin, pEBEditData->topMargin);

                    if (pEBEditData->startPos != 0)
                        InvalidateRect (hWnd, NULL, TRUE);
                    
                    pEBEditData->startPos = 0;
                }
                return 0;
           
                case SCANCODE_END:
                {
                    int newStartPos;
                    int fontsize = GetSysCharWidth();
		    /*PLOGFONT pfont = GetWindowFont(hWnd);
		    if(pfont)
		    	fontsize = GetFontCharWidth(pfont);
                    */
                    
                    if (pEBEditData->editPos == pEBEditData->dataEnd)
                        return 0;

                    newStartPos = edtGetStartDispPosAtEnd (hWnd, pEBEditData);
                    
                    pEBEditData->editPos = pEBEditData->dataEnd;
                    pEBEditData->caretOff = pEBEditData->editPos - newStartPos;
                    
                    fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
                    			pEBEditData->caretOff);

					if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
					{
						POINT oldpos;
						GetCaretPos(hWnd, &oldpos);
						SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, oldpos.y);
					}
					else
						SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, pEBEditData->topMargin);

                    if (pEBEditData->startPos != newStartPos)
                        InvalidateRect (hWnd, NULL, TRUE);
                    
                    pEBEditData->startPos = newStartPos;
                }
                return 0;

                case SCANCODE_CURSORBLOCKLEFT:
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep;
                    int fontsize = GetSysCharWidth();
		    		PLOGFONT pfont = GetWindowFont(hWnd);
					
		    		if(pfont)
		    			fontsize = GetFontCharWidth(pfont);
                    	
                    if (pEBEditData->editPos == 0)
                        return 0;

                    if (edtIsACCharBeforePosition (pEBEditData->buffer, pEBEditData->editPos)) 
					{
                        scrollStep = 2;
                        pEBEditData->editPos -= 2;
                    }
                    else 
					{
                        scrollStep = 1;
                        pEBEditData->editPos --;
                    }

                    pEBEditData->caretOff -= scrollStep;
                    if (pEBEditData->caretOff == 0 && pEBEditData->editPos != 0) 
					{
                        bScroll = TRUE;

                        if (edtIsACCharBeforePosition (pEBEditData->buffer, pEBEditData->editPos)) 
						{
                            pEBEditData->startPos -= 2;
                            pEBEditData->caretOff = 2;
                        }
                        else 
						{
                            pEBEditData->startPos --;
                            pEBEditData->caretOff = 1;
                        }
                    }
                    else if (pEBEditData->caretOff < 0) 
					{
                        pEBEditData->startPos = 0;
                        pEBEditData->caretOff = 0;
                    }
                    fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
                    			pEBEditData->caretOff);
                    //pEBEditData->caretOff * fontsize 
                    
                    if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
					{
						POINT oldpos;
						GetCaretPos(hWnd, &oldpos);
						SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, oldpos.y);
					}
					else
						SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin,pEBEditData->topMargin);
                        
                    if (bScroll)
                        InvalidateRect (hWnd, NULL, TRUE);
                }
                return 0;
                
                case SCANCODE_CURSORBLOCKRIGHT:
                {
                    BOOL bScroll = FALSE;
                    int  scrollStep, moveStep;
				    int fontsize = GetSysCharWidth();
				    PLOGFONT pfont = GetWindowFont(hWnd);
					
				    if(pfont)
				    	fontsize = GetFontCharWidth(pfont);
                    	
                    if (pEBEditData->editPos == pEBEditData->dataEnd)
                        return 0;

                    if (edtIsACCharAtPosition (pEBEditData->buffer, 
                                pEBEditData->dataEnd, pEBEditData->startPos)) 
					{
                        if (edtIsACCharAtPosition (pEBEditData->buffer, 
                                    pEBEditData->dataEnd, pEBEditData->editPos)) 
                        {
                            scrollStep = 2;
                            moveStep = 2;
                            pEBEditData->editPos  += 2;
                        }
                        else 
						{
                            scrollStep = 2;
                            moveStep = 1;
                            pEBEditData->editPos ++;
                        }
                    }
                    else 
					{
                        if (edtIsACCharAtPosition (pEBEditData->buffer, 
                                    pEBEditData->dataEnd, pEBEditData->editPos)) 
                        {
                                    
                            if (edtIsACCharAtPosition (pEBEditData->buffer, 
                                    pEBEditData->dataEnd, pEBEditData->startPos + 1))
                                scrollStep = 3;
                            else
                                scrollStep = 2;

                            moveStep = 2;
                            pEBEditData->editPos += 2;
                        }
                        else 
						{
                            scrollStep = 1;
                            moveStep = 1;
                            pEBEditData->editPos ++;
                        }
                    }

                    pEBEditData->caretOff += moveStep;
                    fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
                    			pEBEditData->caretOff);
                    //pEBEditData->caretOff * fontsize 		
                    if ( fontsize > edtGetOutWidth (hWnd,pEBEditData)) 
					{
                        bScroll = TRUE;
                        pEBEditData->startPos += scrollStep;

                        pEBEditData->caretOff = 
                            pEBEditData->editPos - pEBEditData->startPos;
                    }

		    		fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
                    			pEBEditData->caretOff);
                    //pEBEditData->caretOff * fontsize 	
                    if (dwStyle & EES_VCENTER)//add by tjb 2005-6-15 当文字居中时,光标也居中
					{
						POINT oldpos;
						GetCaretPos(hWnd, &oldpos);
						SetCaretPos (hWnd, fontsize+pEBEditData->leftMargin, oldpos.y);
					}
					else
						SetCaretPos(hWnd, fontsize+pEBEditData->leftMargin, pEBEditData->topMargin);                

                    if (bScroll)
                        InvalidateRect (hWnd, NULL, TRUE);
                }
                return 0;
                
                case SCANCODE_INSERT:
                     pEBEditData->status ^= EEST_REPLACE;
                break;

                case SCANCODE_REMOVE:
                {
                    RECT rect;
                    int fontsize = GetSysCharWidth();
				    PLOGFONT pfont = GetWindowFont(hWnd);
				    if(pfont)
				    	fontsize = GetFontCharWidth(pfont);
                    	
                    if ((dwStyle & EES_READONLY) || (pEBEditData->editPos == pEBEditData->dataEnd))
					{
                        return 0;
                    }
                    
                    if (edtIsACCharAtPosition (pEBEditData->buffer, 
                                    pEBEditData->dataEnd, pEBEditData->editPos))
                        deleted = 2;
                    else
                        deleted = 1;
                        
                    for (i = pEBEditData->editPos; i < pEBEditData->dataEnd - deleted; i++)
                        pEBEditData->buffer [i] = pEBEditData->buffer [i + deleted];

                    pEBEditData->dataEnd -= deleted;
                    bChange = TRUE;
                    
                    fontsize = New_GetStrDispWidth(hWnd,&(pEBEditData->buffer[pEBEditData->startPos]),
                    	       	pEBEditData->caretOff);
                    			
                    InvRect.left = pEBEditData->leftMargin + fontsize;
                                    //+ pEBEditData->caretOff * fontsize;
                    InvRect.top = pEBEditData->topMargin;
                    
                    GetClientRect(hWnd,&rect);
                    InvRect.right = rect.right - rect.left;
                    InvRect.bottom = rect.bottom- rect.top;
                    
                    InvalidateRect (hWnd, &InvRect, TRUE);
                }
                break;

                case SCANCODE_BACKSPACE:
  				{
                    RECT rect;
                    int fontsize = GetSysCharWidth();
				    PLOGFONT pfont = GetWindowFont(hWnd);
				    if(pfont)
				    	fontsize = GetFontCharWidth(pfont);
                    	
                    if ((dwStyle & EES_READONLY) || (pEBEditData->editPos == 0)) 
					{
                        return 0;
                    }

                    if (edtIsACCharBeforePosition (pEBEditData->buffer, pEBEditData->editPos))
                        deleted = 2;
                    else
                        deleted = 1;
                        
                    for (i = pEBEditData->editPos; i < pEBEditData->dataEnd; i++)
                        pEBEditData->buffer[i-deleted] = pEBEditData->buffer [i];

                    pEBEditData->dataEnd -= deleted;
                    pEBEditData->editPos -= deleted;
                    bChange = TRUE;
                    
                    GetClientRect(hWnd,&rect);
                    pEBEditData->caretOff -= deleted;
                    if (pEBEditData->caretOff == 0 && pEBEditData->editPos != 0) 
					{
                        if (edtIsACCharBeforePosition (pEBEditData->buffer, 
                                pEBEditData->editPos)) 
                        {
                            pEBEditData->startPos -= 2;
                            pEBEditData->caretOff = 2;
                        }
                        else 
						{
                            pEBEditData->startPos --;
                            pEBEditData->caretOff = 1;
                        }
                        
                        InvRect.left = pEBEditData->leftMargin;
                        InvRect.top = pEBEditData->topMargin;
                        InvRect.right = rect.right - rect.left;
                        InvRect.bottom = rect.bottom - rect.top;

⌨️ 快捷键说明

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