INIINPUT.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:7k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. //初始化输入法环境
  2. #include "stdafx.h"
  3. #include "cspublic.h"
  4. #include "iniinput.h"
  5. #include "csinput.h"
  6. CInputInit OInputInit ; //输入菜单初始化对象
  7. CInputInit::CInputInit( void )
  8. {
  9. m_nMethodNum =1 ; //至少有一个菜单项,即区位输入输入法
  10. m_nCurrentMethod =0 ;
  11. if( !m_InputMenu.CreatePopupMenu() ) //创建空白菜单
  12. {
  13. AfxMessageBox( "CreateMenu error" ) ;
  14. return ;
  15. }
  16. }
  17. CInputInit::~CInputInit( void )
  18. {
  19. m_InputMenu.DestroyMenu() ;
  20. //改变当前输入法
  21. SetInputMethod( m_nCurrentMethod ) ;
  22. }
  23. //初始化输入法菜单
  24. void CInputInit::InitInputMenu( void )
  25. {
  26. //得到输入法数
  27. m_nMethodNum =GetPrivateProfileInt( INPUT_METHOD ,
  28. INPUT_NUM , 0 , 
  29. INI_FILE_NAME ) ;
  30. if( !m_nMethodNum ) //没有该文件或该文件有错
  31. {
  32. m_nMethodNum =1 ; //至少有一个菜单项,即区位输入输入法
  33. m_nCurrentMethod =0 ; //当前菜单项
  34. char sBuff[100] ;
  35. wsprintf( sBuff , "%d" , m_nMethodNum ) ; //输入法数
  36. //改变输入法数
  37. WritePrivateProfileString( INPUT_METHOD ,
  38. INPUT_NUM , sBuff , INI_FILE_NAME ) ;
  39. wsprintf( sBuff , "%d" , m_nCurrentMethod ) ; //当前输入法
  40. //改变当前输入法
  41. WritePrivateProfileString( INPUT_METHOD , 
  42. CURRENT_INPUT_METHOD , 
  43. sBuff , INI_FILE_NAME ) ;
  44. //向这个输入法信息写入INI文件
  45. WriteInputMethodInfo( 0 , "内码输入" , "" ) ;
  46. //加入菜单
  47. m_InputMenu.AppendMenu( MF_CHECKED|MF_DISABLED ,
  48. 100 , "内码输入" ) ;
  49. }
  50. else
  51. {
  52. //读出当前输入法
  53. m_nCurrentMethod =GetPrivateProfileInt( INPUT_METHOD ,
  54. CURRENT_INPUT_METHOD ,
  55. m_nMethodNum , INI_FILE_NAME ) ;
  56. if( m_nCurrentMethod == m_nMethodNum ) //没读出来
  57. m_nCurrentMethod =0 ; //设为第一个输入法
  58. char sInputName[100] ; //输入法名
  59. char sInputFileName[100] ; //输入法文件
  60.         //加入所有输入法
  61. for( int i=0 ; i<m_nMethodNum ; i++ )
  62. {
  63. GetInputMethodMess( i , sInputName , 100 , sInputFileName , 100 ) ;
  64. //加入菜单
  65. if( i == m_nCurrentMethod ) //是当前输入法
  66. {
  67. m_InputMenu.InsertMenu( 0 , MF_BYPOSITION|
  68. MF_CHECKED|MF_DISABLED ,
  69. 100+i , sInputName ) ;
  70. if( i ) //不是英文输入
  71. LoadInputLib( sInputFileName ) ; //装入该输入法
  72. }
  73. else
  74. m_InputMenu.InsertMenu( 0 , MF_BYPOSITION ,
  75. 100+i , sInputName ) ;
  76. }
  77. //改变当前输入法
  78. SetInputMethod( m_nCurrentMethod ) ;
  79. }
  80. }
  81. //得到输入法菜单的句柄
  82. HMENU CInputInit::GetInputMenu( void )
  83. {
  84. return m_InputMenu.m_hMenu ;
  85. }
  86. //增加一种输入法
  87. BOOL CInputInit::AddInputMethod( LPCSTR lpcsName , 
  88.  LPCSTR lpcsFileName )
  89. {
  90. //加入菜单
  91. m_InputMenu.InsertMenu( 0 , MF_BYPOSITION ,
  92. 100+m_nMethodNum , lpcsName ) ;
  93. //输入法数增加
  94. m_nMethodNum++ ;
  95. //改变当前输入法菜单的状态
  96. // ChangeMenuStatus( m_nMethodNum-1 ) ;
  97. //将新增加输入法做为当前输入法
  98. m_nCurrentMethod =m_nMethodNum-1 ;
  99. //改变INI文件
  100. char sBuff[100] ;
  101. wsprintf( sBuff , "%d" , m_nMethodNum ) ; //输入法数
  102. //改变输入法数
  103. WritePrivateProfileString( INPUT_METHOD ,
  104. INPUT_NUM , sBuff , INI_FILE_NAME ) ;
  105. //改变当前输入法
  106. SetInputMethod( m_nCurrentMethod ) ;
  107. WriteInputMethodInfo( m_nMethodNum-1 , lpcsName , 
  108. lpcsFileName ) ;
  109. return 1 ;
  110. }
  111. //删除一种输入法
  112. BOOL CInputInit::DeleteInputMethod( int n )
  113. {
  114. //转换n,n是菜单顺序,n1是INI文件中顺序
  115. int n1 =m_nMethodNum-1-n ;
  116. if( n1<=0 || n1>=m_nMethodNum ) //英文输入法不能被删除
  117. {
  118. AfxMessageBox( "要删除的输入法位置不对!" ) ;
  119. return 0 ;
  120. }
  121. char sInputName[100] ; //输入法名
  122. char sInputFileName[100] ; //输入法文件
  123. for( int i=n1 ; i<m_nMethodNum-1 ; i++ ) //将n1之后的读出重写
  124. {
  125. GetInputMethodMess( i+1 , sInputName , 100 , sInputFileName , 100 ) ;
  126. WriteInputMethodInfo( i , sInputName , sInputFileName ) ;
  127. }
  128. //减少输入法数
  129. m_nMethodNum-- ;
  130. //改变当前输入法
  131. if( n1<=m_nCurrentMethod )
  132. m_nCurrentMethod-- ; //删除了当前输入法以前的输入法
  133. //改变INI文件
  134. char sBuff[100] ;
  135. wsprintf( sBuff , "%d" , m_nMethodNum ) ; //输入法数
  136. //改变输入法数
  137. WritePrivateProfileString( INPUT_METHOD ,
  138. INPUT_NUM , sBuff , INI_FILE_NAME ) ;
  139. //删除菜单中所有项
  140. for( i=0 ; i<m_nMethodNum+1 ; i++ )
  141. m_InputMenu.DeleteMenu( 0 , MF_BYPOSITION ) ;
  142. //重新读入INI文件
  143. InitInputMenu() ;
  144. return 1 ;
  145. }
  146. //得到输入法的名字与文件名
  147. BOOL CInputInit::GetInputMethodMess( int n , 
  148. LPSTR lpsName , int nMaxNameLen ,
  149. LPSTR lpsFileName , int nMaxFileNameLen )
  150. {
  151. if( n<0 || n>=m_nMethodNum )
  152. {
  153. AfxMessageBox( "GetInputMethodMess 中的n有问题!" ) ;
  154. return 0 ;
  155. }
  156. char sBuff[100] ;
  157. //组织输入法名
  158. wsprintf( sBuff , "%s%d" , INPUT_METHOD_NAME , n ) ;
  159. //得到输入法名
  160. GetPrivateProfileString( INPUT_METHOD ,
  161. sBuff , "英文" , lpsName , nMaxNameLen , INI_FILE_NAME ) ;
  162. //组织输入法文件名
  163. wsprintf( sBuff , "%s%d" , INPUT_METHOD_FILE_NAME , n ) ;
  164. //得到输入法文件
  165. GetPrivateProfileString( INPUT_METHOD , sBuff , 
  166. "abc@123" , lpsFileName , nMaxFileNameLen , 
  167. INI_FILE_NAME ) ;
  168. if( !_fstrcmp( lpsFileName , "abc@123" ) )  //有问题
  169. lpsFileName[0] ='' ;
  170. return 1 ;
  171. }
  172. //得到当前输入法的名字与文件名
  173. BOOL CInputInit::GetCurrentInputMethod( LPSTR lpsName , 
  174. int nMaxNameLen ,
  175. LPSTR lpsFileName , int nMaxFileNameLen )
  176. {
  177. return GetInputMethodMess( m_nCurrentMethod , lpsName ,
  178. nMaxNameLen ,
  179. lpsFileName , nMaxFileNameLen ) ;
  180. }
  181. //改变输入法状态
  182. void CInputInit::ChangeMenuStatus( int n )
  183. {
  184. if( n<0 || n>=m_nMethodNum )
  185. {
  186. AfxMessageBox( "ChangeMenuStatus 中的n有问题!" ) ;
  187. return ;
  188. }
  189. if( n==m_nCurrentMethod ) //是当前输入法,不用改变了
  190. return ;
  191. //将该菜单项打上标记,并且无效
  192. m_InputMenu.CheckMenuItem( m_nMethodNum-1-n , 
  193. MF_BYPOSITION|MF_CHECKED ) ;
  194. m_InputMenu.EnableMenuItem( m_nMethodNum-1-n ,
  195. MF_BYPOSITION|MF_DISABLED ) ;  
  196. //将以前的当前菜单项消除标记,并且有效
  197. m_InputMenu.CheckMenuItem( m_nMethodNum-1-m_nCurrentMethod , 
  198. MF_BYPOSITION|MF_UNCHECKED ) ;
  199. m_InputMenu.EnableMenuItem( m_nMethodNum-1-m_nCurrentMethod ,
  200. MF_BYPOSITION|MF_ENABLED ) ;  
  201. //改变当前输入法
  202. m_nCurrentMethod =n ;
  203. SetInputMethod( m_nCurrentMethod ) ;
  204. //关闭以前的输入法
  205. UnloadInputLib() ;
  206. if( n ) //不是英文输入法
  207. {
  208. //得到当前输入法文件名
  209. char sName[100] ;
  210. char sFileName[100] ;
  211. GetCurrentInputMethod( sName , 100 , sFileName , 100 ) ;
  212. //装入现在的输入法
  213. LoadInputLib( sFileName ) ;
  214. }
  215. }
  216. //向INI文件写入一种输入法的信息
  217. BOOL CInputInit::WriteInputMethodInfo( int n , LPCSTR lpcsName , 
  218. LPCSTR lpcsFileName )
  219. {
  220. char sBuff[100] ;
  221. wsprintf( sBuff , "%s%d" , INPUT_METHOD_NAME , n ) ;
  222. //增加输入法名称
  223. WritePrivateProfileString( INPUT_METHOD , 
  224. sBuff , lpcsName , INI_FILE_NAME ) ;
  225. wsprintf( sBuff , "%s%d" , INPUT_METHOD_FILE_NAME , n ) ;
  226. //增加输入法文件名称
  227. WritePrivateProfileString( INPUT_METHOD , 
  228. sBuff , lpcsFileName , INI_FILE_NAME ) ;
  229. return 1 ;
  230. }
  231. int CInputInit::GetCurrentMenu( void )
  232. {
  233. return (m_nMethodNum-1-m_nCurrentMethod) ;
  234. }
  235. //返回当前输入法位置
  236. int CInputInit::GetCurrentMethod( void )
  237. {
  238. return m_nCurrentMethod ;
  239. }
  240. //得到输入法数
  241. int CInputInit::GetInputMethodNum( void )
  242. {
  243. return m_nMethodNum ;
  244. }