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

📄 edit.c

📁 MinGUI 可视化程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        HDC dc=GetClientDC(hWnd);
	    GroupOn(dc);
        dummybottom=pSLEditData->buffer[pSLEditData->editPos+chars];
        pSLEditData->buffer[pSLEditData->editPos+chars]='\0';
	    EraseBackground(dc,pSLEditData->caretx,pSLEditData->carety,tw,th);
	    TextOut (dc, pSLEditData->caretx,pSLEditData->carety, &pSLEditData->buffer[pSLEditData->editPos]);
	    pSLEditData->buffer[pSLEditData->editPos+chars]=dummybottom;
        GroupOff(dc,pSLEditData->caretx,pSLEditData->carety,tw,th);
        ReleaseDC(dc);
	  }
   }

 
   pSLEditData->editPos+=chars; 
   pSLEditData->caretx  =  newcaretx; 

   SetCaretPos (hWnd,pSLEditData->caretx-1,pSLEditData->carety-CARET_HEIGHT_OVERLAP);
   CMD_NotifyParent(hWnd,EN_CHANGED);
}

void SLEdit_GetKeyDown(HWND hWnd,UINT Key)
{   PSLEDITDATA pSLEditData =(SLEDITDATA *)WndClsBuf(hWnd);
    switch (Key)
    {  case VK_HOME:
              if (pSLEditData->editPos != 0) 
			  { pSLEditData->editPos  = 0;
			    pSLEditData->caretx=pSLEditData->textArea.left;
                SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
                if (pSLEditData->startPos != 0)
                { InvalidateClient(hWnd,&pSLEditData->textArea);
				}
                pSLEditData->startPos = 0;
			  }
            return;
           
       case VK_END:
              if (pSLEditData->editPos != pSLEditData->dataEnd)
              { int textwidth,newStartPos = EdtGetStartDispPosAtEnd (hWnd, pSLEditData,&textwidth);
                pSLEditData->editPos = pSLEditData->dataEnd;
			    pSLEditData->caretx=pSLEditData->textArea.left+textwidth;
                SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
                if (pSLEditData->startPos != newStartPos)
                { InvalidateClient(hWnd,&pSLEditData->textArea);
                  pSLEditData->startPos = newStartPos;
				}
			  }
            return;

       case VK_LEFT:
              if (pSLEditData->editPos > 0) 
			  { int chars = (EdtIsACCharBeforePosition (pSLEditData->buffer, pSLEditData->editPos))?2:1;
			    pSLEditData->editPos -= chars;
				pSLEditData->caretx -= (chars*GetSysCharWidth(hWnd)+pSLEditData->colspace);

				if(pSLEditData->caretx<pSLEditData->textArea.left || (pSLEditData->caretx==pSLEditData->textArea.left && pSLEditData->editPos > 0))
				{ if(pSLEditData->editPos>0)
				  { int pre_chars =(EdtIsACCharBeforePosition (pSLEditData->buffer, pSLEditData->editPos))?2:1; 
				    pSLEditData->startPos -= (pSLEditData->caretx==pSLEditData->textArea.left)?pre_chars:chars+pre_chars;
				    pSLEditData->caretx = pSLEditData->textArea.left + (pre_chars*GetSysCharWidth(hWnd)+pSLEditData->colspace);
				  }
				  else
				  { pSLEditData->startPos = 0;
				    pSLEditData->caretx=pSLEditData->textArea.left;
				  }
				  InvalidateClient(hWnd,&pSLEditData->textArea); /*need scroll*/
                    
				}
                SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
			  }
            return;
                
       case VK_RIGHT:
		      if (pSLEditData->editPos < pSLEditData->dataEnd)
			  { int chars = (EdtIsACCharAtPosition (pSLEditData->buffer, pSLEditData->editPos))?2:1;
                int newcaretx=pSLEditData->caretx + chars*GetSysCharWidth(hWnd)+pSLEditData->colspace;
                if (newcaretx  >= pSLEditData->textArea.right)
				{  int scrollStep=0;
				   if (EdtIsACCharAtPosition(pSLEditData->buffer, pSLEditData->startPos))
				   {  scrollStep = 2;
		              newcaretx -=  (2*GetSysCharWidth(hWnd)+pSLEditData->colspace);
				   }
                   else
				   {  if (chars==2) 
				      { if (EdtIsACCharAtPosition(pSLEditData->buffer, pSLEditData->startPos + 1))
					    {  scrollStep = 3;
		                   newcaretx -=  (3*GetSysCharWidth(hWnd)+2*pSLEditData->colspace);
					    }
                        else
						{  scrollStep = 2;
			               newcaretx -=  ((GetSysCharWidth(hWnd)+pSLEditData->colspace)<<1);
						}
					  }
                      else
					  { scrollStep = 1;
			            newcaretx -=  (GetSysCharWidth(hWnd)+pSLEditData->colspace);
					  }
				   }
                   pSLEditData->startPos += scrollStep;
		           InvalidateClient(hWnd, &pSLEditData->textArea);
				}
                pSLEditData->editPos+=chars;
                pSLEditData->caretx=newcaretx;
                SetCaretPos(hWnd,pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
			}
            return;
                
       case VK_INSERT:
               WNDPTR(hWnd)->Style ^= ES_REPLACE;
            return;
 
       case VK_DELETE:
               if (!WndGetAttr(hWnd,ES_READONLY) && (pSLEditData->editPos != pSLEditData->dataEnd))
			   {  TRECT    InvRect=pSLEditData->textArea;
				  int i,deleted;
				  deleted = (EdtIsACCharAtPosition(pSLEditData->buffer, pSLEditData->editPos))?2:1;
                  for (i = pSLEditData->editPos; i < pSLEditData->dataEnd - deleted; i++)
				  {    pSLEditData->buffer [i] = pSLEditData->buffer [i + deleted];
				  }
                  pSLEditData->buffer[i]='\0';
                  pSLEditData->dataEnd -= deleted;
                  InvalidateClient(hWnd,&InvRect);
			      CMD_NotifyParent(hWnd,EN_CHANGED);
			   }
               return;
 
       case VK_BACK:
              if ( !WndGetAttr(hWnd,ES_READONLY) && (pSLEditData->editPos != 0)) 
			  { SLEdit_GetKeyDown(hWnd,VK_LEFT);
                SLEdit_GetKeyDown(hWnd,VK_DELETE);
			  }
       return;
	

   }
       
}


static HRESULT CALLBACK SLEditCtrlProc(HWND hWnd,UINT Message,WPARAM WParam,LPARAM LParam)
{   switch (Message)
    {   case WM_CHAR:
             if (!WndGetAttr(hWnd,ES_READONLY))
             {  BYTE wordlo=LOBYTE(WParam),wordhi=HIBYTE(WParam);
                if(wordlo>0xA0 &&  wordhi==0)
                { BYTE savedchar=(BYTE)IME_PopChar();
				  if(savedchar>0xA0)
				  { SLEdit_GetChar(hWnd,savedchar,wordlo,LParam); 
				  }
				  else
				  { IME_PushChar(wordlo);
				  }
				  return 0;
				}

				if(IME_Window && WNDPTR(IME_Window)->UserData==1)/*中文输入法*/
                {  if(SendMessage((HWND)IME_Window,WM_CHAR,WParam,LParam)==0)return 0;
                }

				SLEdit_GetChar(hWnd,wordlo,wordhi,LParam); 
             }
             return 0;
        case WM_COMMAND:
              if(LParam==WM_CHAR && !WndGetAttr(hWnd,ES_READONLY))
              { SLEdit_GetChar(hWnd,LOBYTE(WParam),HIBYTE(WParam),0);
              }
             return 0;
        case WM_KEYDOWN:
			   if(WParam!=VK_TAB)
			   { if(IME_Window && WNDPTR(IME_Window)->UserData==1)/*中文输入法*/
                 { if(!IME_isEmpty()) 
				   { if(SendMessage((HWND)IME_Window,WM_KEYDOWN,WParam,LParam))return 0;
			       }
                 }
			     if(WParam!=VK_UP && WParam!=VK_DOWN)
				 { SLEdit_GetKeyDown(hWnd,WParam);
				   return 0;
				 }
			   }
			 break;
        case WM_GETTEXTLENGTH:
             { PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
               return pSLEditData->dataEnd;
             }
        case WM_GETTEXT:
        {   char*   buffer = (char*)LParam;
            int     len;

            PSLEDITDATA pSLEditData =(SLEDITDATA *)WndClsBuf(hWnd);
            len = min ((int)WParam, pSLEditData->dataEnd);

            memcpy (buffer, pSLEditData->buffer, len);
            buffer [len] = '\0';

            return len;
        }

        case WM_SETTEXT:
			 { int len;
               PSLEDITDATA pSLEditData= (SLEDITDATA *)WndClsBuf(hWnd);
               len = strlen ((char*)LParam);
               len = min (len, pSLEditData->bufferLen);
               if (pSLEditData->hardLimit >= 0)
                  len = min (len, pSLEditData->hardLimit);
           
               pSLEditData->dataEnd = len;
               memcpy (pSLEditData->buffer, (char*)LParam, len);
               pSLEditData->buffer[len]='\0';
               pSLEditData->editPos        = 0;
               pSLEditData->caretx         = pSLEditData->textArea.left;
               pSLEditData->startPos       = 0;
               SetCaretPos(hWnd, pSLEditData->caretx-1,pSLEditData->carety-CARET_HEIGHT_OVERLAP);  
               InvalidateClient(hWnd,&pSLEditData->textArea); 
			 }
             return 0;

        case WM_LBUTTONDOWN:
        {   int cx=LOWORD(LParam)-WNDPTR(hWnd)->ClientRect.left;
			int pos=Edit_LocateCarret(hWnd,&cx);
            PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
            if(pos!=pSLEditData->editPos)
			{ pSLEditData->editPos=pos;
              pSLEditData->caretx=cx;
			  SetCaretPos(hWnd, pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
			}
        }
        break;
     
        case EM_SETREADONLY:
			   if (WParam)
			   { WndAddAttr(hWnd,ES_READONLY);
			   }
			   else
			   { WndSubAttr(hWnd,ES_READONLY);
			   }
             return 0;
        case EM_SETPASSWORDCHAR:
             { PSLEDITDATA  pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
               if (pSLEditData->passwdChar != (int)WParam)
			   { if (WndGetAttr(hWnd,ES_PASSWORD))
			     { pSLEditData->passwdChar = (int)WParam;
                   InvalidateClient(hWnd,&pSLEditData->textArea);
                 }
			   }
			 }
             return 0;
    
        case EM_GETPASSWORDCHAR:
			 { int *passwdchar;
               PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
               passwdchar = (int*)LParam;
              *passwdchar = pSLEditData->passwdChar;
			 }
             return 0;
   
        case EM_LIMITTEXT:
			 { int newLimit = (int)WParam;
               if (newLimit >= 0)
			   { PSLEDITDATA pSLEditData = (SLEDITDATA *)WndClsBuf(hWnd);
                 if (newLimit <= pSLEditData->bufferLen)
				 { pSLEditData->hardLimit = newLimit;
				 }
                 else
				 { char *oldtext=(char *)GetMem(pSLEditData->dataEnd);
				   memcpy(oldtext,pSLEditData->buffer,pSLEditData->dataEnd);
				   CM_AllocateWindowText(hWnd,oldtext,newLimit);
				   pSLEditData->bufferLen=newLimit;
				   pSLEditData->hardLimit = -1;
				   FreeMem(oldtext);
                 }
                    
			   }
			 }
             return 0;

		case WM_CREATE:
		       SLEdit_OnCreate(hWnd);
			 return 0;
        case WM_SETFOCUS:
			 { PSLEDITDATA  pSLEditData=(SLEDITDATA *)WndClsBuf(hWnd);
               CreateCaret (hWnd,  1 , pSLEditData->caretheight);
               SetCaretPos (hWnd,pSLEditData->caretx-1, pSLEditData->carety-CARET_HEIGHT_OVERLAP);
               CMD_NotifyParent(hWnd,CM_SETFOCUS); 
   			 }
             return 0;
         case WM_KILLFOCUS:
                DestroyCaret(hWnd);
                CMD_NotifyParent(hWnd,CM_KILLFOCUS);
              return 0;
        case WM_ENABLE:
                InvalidateClient(hWnd,&((SLEDITDATA *)WndClsBuf(hWnd))->textArea);
             return 0; 
        case WM_PAINT:
			    SLEdit_Repaint(hWnd);
             return 0;
 
    } 

    return DefWindowProc (hWnd, Message, WParam, LParam);
}


//---------------------------------------------------------------------------
void CM_RegisterSingleLineEdit(void)
{  TWNDCLASS wc;
   memset(&wc,0,sizeof(wc));
   wc.dwStyle=WS_BORDER_LOWERED;
   wc.clForeground=CL_WINDOWTEXT;
   wc.clBackground=CL_WHITE;
   wc.cbTextHeap=LEN_SLEDIT_BUFFER;
   wc.cbWndExtra=sizeof(SLEDITDATA);
   wc.lpfnWndProc=SLEditCtrlProc;
   wc.lpszClassName="Edit";
   RegisterClass(&wc);
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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