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

📄 winime.c

📁 MinGUI 可视化程序代码
💻 C
字号:
 /******************************************************************************** Copyright  2006 National ASIC Center, All right Reserved** FILE NAME:      winime.c* PROGRAMMER:     ming.c* Date of Creation:   2006/08/8** DESCRIPTION:*      Input method editor (IME)* NOTE:** FUNCTIONS LIST:* -----------------------------------------------------------------------------** -----------------------------------------------------------------------------* * MODIFICATION HISTORY*     LastModify  2006/12/15******************************************************************************/#include "mingui.h"//---------------------------------------------------------------------------HWND IME_Window=NULL;//---------------------------------------------------------------------------#define PY_TEXT_SIZE   8typedef struct{ HWND hEdit;  int EditPos; /*指向拼音输入框中最后一个正在编辑的字符*/  int CountPerPage; /*每页显示的汉字数目*/  int PageIndex;   /*当前页码*/  int PageOffset;    /*光标选中的汉字在当前页的索引序号*/  BOOL InputOrSelect;  /*输入状态还是选择状态*/  int RangeOffset;  int RangeCount;  char *RangeAddress;  char PY_Text[PY_TEXT_SIZE];}TImeData;//---------------------------------------------------------------------------void ImeWindowRepaint(HWND hWnd){ TImeData *pydata=(TImeData *)WndClsBuf(hWnd);  HDC dc=BeginPaint(hWnd);   if(pydata->PY_Text[0])  { SetColor(dc,CL_BTNTEXT);	SetFontStyle(dc,FS_OPAQUE,true);	SetColSpace(dc,1);	TextOut(dc,0,0,pydata->PY_Text);	if(pydata->RangeCount && pydata->RangeAddress)	{ char dummbottom;      int pagestart,count;      pydata->PageIndex=pydata->RangeOffset/pydata->CountPerPage;      pydata->PageOffset=pydata->RangeOffset%pydata->CountPerPage;      pagestart= (pydata->PageIndex * pydata->CountPerPage);      count= pydata->RangeCount-pagestart;      if(count>pydata->CountPerPage)count=pydata->CountPerPage;      count<<=1;      pagestart<<=1;	  	  dummbottom=pydata->RangeAddress[pagestart+count];      pydata->RangeAddress[pagestart+count]='\0';      TextOut(dc,0,SYS_FONT_HEIGHT+1,pydata->RangeAddress+pagestart);	  pydata->RangeAddress[pagestart+count]=dummbottom; 	}    SetPenLogic(dc,PL_XOR);    SetColor(dc,CL_SOLID);    if(pydata->InputOrSelect)      FillRect(dc,pydata->EditPos*(SYS_FONT_WIDTH+1),0,SYS_FONT_WIDTH,SYS_FONT_HEIGHT);    else      FillRect(dc,pydata->PageOffset*(SYS_FONT_WIDTH+SYS_FONT_WIDTH+1),SYS_FONT_HEIGHT+1,SYS_FONT_WIDTH+SYS_FONT_WIDTH,SYS_FONT_HEIGHT);  }   EndPaint(hWnd);}//---------------------------------------------------------------------------void IME_OutPutChars(HWND hWnd,int pageOffset){  HWND ObjWnd=GetFocus();   if(ObjWnd==hWnd)   { ObjWnd=((TImeData *)WndClsBuf(hWnd))->hEdit;   }   if(IsWnd(ObjWnd) )   { TImeData *pydata=(TImeData *)WndClsBuf(hWnd);     int WordIndex=pydata->CountPerPage*pydata->PageIndex+pageOffset;	 if(WordIndex<pydata->RangeCount && WordIndex>=0)	 { BYTE *phz=(BYTE *)pydata->RangeAddress + (WordIndex<<1);       SendMessage(ObjWnd,WM_COMMAND,*phz+(*(phz+1)<<8),WM_CHAR);       pydata->InputOrSelect=true;       pydata->EditPos=0;       pydata->PY_Text[0]='\0';       pydata->RangeOffset=0;	   pydata->RangeCount=0;       Invalidate(hWnd);	 }   }}//---------------------------------------------------------------------------static HRESULT IME_OnKeyDown(HWND hWnd,WPARAM wParam){  extern int py_ime(char *, char **);   TImeData *pydata=(TImeData *)WndClsBuf(hWnd);   if(pydata->InputOrSelect)   {  if(wParam==VK_LEFT || wParam==VK_DELETE || wParam==VK_BACK)      { if(pydata->PY_Text[pydata->EditPos])        { pydata->PY_Text[pydata->EditPos]=0;          pydata->RangeCount=py_ime(pydata->PY_Text, &pydata->RangeAddress);          if(pydata->RangeOffset)pydata->RangeOffset=0;          Invalidate(hWnd);		  return 1;        }        else		{ if(pydata->EditPos>0)           { pydata->EditPos--;            if(pydata->PY_Text[pydata->EditPos])            { pydata->PY_Text[pydata->EditPos]=0;              pydata->RangeCount=py_ime(pydata->PY_Text, &pydata->RangeAddress);              if(pydata->RangeOffset)pydata->RangeOffset=0;              Invalidate(hWnd);			  return 1;            }          }		}      }      else if(wParam==VK_RIGHT)	  { if(pydata->PY_Text[pydata->EditPos])        { pydata->EditPos++;          Invalidate(hWnd);		  return 1;	    }	  }      else if(wParam==VK_DOWN || wParam==VK_RETURN)	  { if(pydata->RangeCount)        { pydata->InputOrSelect=false;          Invalidate(hWnd);		  return 1;        }	  }	  else if(wParam==VK_UP)	  { return 1;	  }   }   else   {  if(wParam==VK_RIGHT)      {  pydata->RangeOffset++;         if(pydata->RangeOffset>=pydata->RangeCount) pydata->RangeOffset=0;         Invalidate(hWnd);		 return 1;      }      else if(wParam==VK_LEFT)      {  pydata->RangeOffset--;         if(pydata->RangeOffset<0)pydata->RangeOffset=pydata->RangeCount-1;         Invalidate(hWnd);		 return 1;      }      else if(wParam==VK_UP)      { pydata->InputOrSelect=true;        Invalidate(hWnd);		return 1;      }      else if(wParam==VK_RETURN)      { IME_OutPutChars(hWnd,pydata->PageOffset);	    return 1;      }	  else if(wParam==VK_DOWN)	  { return 1;	  }   }   return 0;}//---------------------------------------------------------------------------static HRESULT CALLBACK IMEWinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){ switch(message)  {      case WM_CHAR:		  { TImeData *pydata=(TImeData *)WndClsBuf(hWnd);		    if(pydata->InputOrSelect && ( (wParam>='A' && wParam<='Z')||(wParam>='a' && wParam<='z') ) )            { if(lParam>1)			  { pydata->PY_Text[pydata->EditPos]=(char)wParam; 			  }			  else			  { if(pydata->PY_Text[pydata->EditPos])			    { if(pydata->EditPos<PY_TEXT_SIZE-2) pydata->EditPos++;			    }				pydata->PY_Text[pydata->EditPos]=(char)wParam;                pydata->PY_Text[pydata->EditPos+1]='\0';              } 			  pydata->RangeCount=py_ime(pydata->PY_Text, &pydata->RangeAddress);		      Invalidate(hWnd);			  return 0;            }          }	     return -1;    case WM_KEYDOWN:		     if(wParam!=VK_TAB) return IME_OnKeyDown(hWnd,wParam);     	 break;    case WM_PENDOWN:		 { TImeData *pydata=(TImeData *)WndClsBuf(hWnd);		   if(pydata->RangeCount)		   { int verdiff=HIWORD(lParam)-(WNDPTR(hWnd)->ClientRect.top+SYS_FONT_HEIGHT+1);             if(verdiff>=0 && verdiff<SYS_FONT_HEIGHT)			 {  int PageOffset=(LOWORD(lParam)-WNDPTR(hWnd)->ClientRect.left)/(SYS_FONT_WIDTH+SYS_FONT_WIDTH+1);			    IME_OutPutChars(hWnd,PageOffset);			 }		   }		 }         break;    case WM_PAINT:           ImeWindowRepaint(hWnd);         return 0;        	case WM_NCPAINT:		 { HDC dc = GetDC (hWnd);		   Draw3dOutset(dc, 0, 0,absWidth(hWnd),absHeight(hWnd));           ReleaseDC (dc);		 }         return 0;    case WM_NCCALCSIZE:		 if(WndGetAttr(hWnd,WS_BORDER) && lParam)		 { InflateRect((TRECT *)lParam, -2, -2);		 }		 return 0;   case WM_DESTROY:		 { WNDPTR(hWnd)->UserData=0;		 }		 return 0;    case WM_CREATE:		 { TImeData *pydata=(TImeData *)WndClsBuf(hWnd);	       memset(pydata,0,sizeof(TImeData));	       pydata->hEdit=(HWND)WNDPTR(hWnd)->ExtraLong[0];           pydata->InputOrSelect=true;           pydata->CountPerPage=( WNDPTR(hWnd)->ClientRect.right-WNDPTR(hWnd)->ClientRect.left ) / (SYS_FONT_WIDTH+SYS_FONT_WIDTH+1);           WNDPTR(hWnd)->UserData=1;		 }	     return 0;  }  return DefWindowProc(hWnd,message,wParam,lParam);}//---------------------------------------------------------------------------BOOL CM_RegisterIME(void){  TWNDCLASS wc;   memset(&wc,0,sizeof(wc));   wc.cbWndExtra=sizeof(TImeData);   wc.lpfnWndProc=IMEWinProc;   wc.lpszClassName="IME";   wc.clForeground=CL_BTNTEXT;   wc.clBackground=CL_BTNFACE;     return RegisterClass(&wc);}//---------------------------------------------------------------------------/* Parent:  parentWindow   hEdtor:  default input editor window*/void IME_Open(HWND hEdtor,HWND parent,int left,int top,int width,int height){ if(IME_Window)DestroyWindow(IME_Window);  IME_Window=CreateWindow("IME","IME",WS_BORDER|WS_ALWAYSONTOP,left,top,width,height,parent,0,hEdtor);
  if(hEdtor)SetFocus(hEdtor);}//---------------------------------------------------------------------------void IME_Close(void){ if(IME_Window)  { DestroyWindow(IME_Window);    IME_Window=NULL;  }}//---------------------------------------------------------------------------BOOL IME_isEmpty(void){ if(IME_Window)  { TImeData *pydata=(TImeData *)WndClsBuf(IME_Window);    if(pydata->PY_Text[0]) return false;  }  return true;}
//---------------------------------------------------------------------------
#define IME_KEEP_CHAR_LIFE    1000   /*ms*/ 
char  IME_SavedChar=0;
DWORD IME_KeepDueTime=0;
extern TWndDateTime  g_SysTime;
//---------------------------------------------------------------------------
void IME_PushChar(char ch)
{  IME_SavedChar=(BYTE)ch;
   IME_KeepDueTime=(DWORD)g_SysTime;
}
//---------------------------------------------------------------------------
char IME_PopChar(void)
{  if((DWORD)g_SysTime<=IME_KeepDueTime)
   {  if(IME_SavedChar!=0)
      { char ret= IME_SavedChar;
        IME_SavedChar=0;
		return ret;
	  }
   }
   else
   { IME_SavedChar=0;
   }
   return 0;
}/*---------------------------------------------------------------------------END --- Thank you!                                                  ming.c---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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