INIINPUT.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:7k
- //初始化输入法环境
- #include "stdafx.h"
- #include "cspublic.h"
- #include "iniinput.h"
- #include "csinput.h"
- CInputInit OInputInit ; //输入菜单初始化对象
- CInputInit::CInputInit( void )
- {
- m_nMethodNum =1 ; //至少有一个菜单项,即区位输入输入法
- m_nCurrentMethod =0 ;
- if( !m_InputMenu.CreatePopupMenu() ) //创建空白菜单
- {
- AfxMessageBox( "CreateMenu error" ) ;
- return ;
- }
- }
- CInputInit::~CInputInit( void )
- {
- m_InputMenu.DestroyMenu() ;
- //改变当前输入法
- SetInputMethod( m_nCurrentMethod ) ;
- }
- //初始化输入法菜单
- void CInputInit::InitInputMenu( void )
- {
- //得到输入法数
- m_nMethodNum =GetPrivateProfileInt( INPUT_METHOD ,
- INPUT_NUM , 0 ,
- INI_FILE_NAME ) ;
- if( !m_nMethodNum ) //没有该文件或该文件有错
- {
- m_nMethodNum =1 ; //至少有一个菜单项,即区位输入输入法
- m_nCurrentMethod =0 ; //当前菜单项
- char sBuff[100] ;
- wsprintf( sBuff , "%d" , m_nMethodNum ) ; //输入法数
- //改变输入法数
- WritePrivateProfileString( INPUT_METHOD ,
- INPUT_NUM , sBuff , INI_FILE_NAME ) ;
- wsprintf( sBuff , "%d" , m_nCurrentMethod ) ; //当前输入法
- //改变当前输入法
- WritePrivateProfileString( INPUT_METHOD ,
- CURRENT_INPUT_METHOD ,
- sBuff , INI_FILE_NAME ) ;
- //向这个输入法信息写入INI文件
- WriteInputMethodInfo( 0 , "内码输入" , "" ) ;
- //加入菜单
- m_InputMenu.AppendMenu( MF_CHECKED|MF_DISABLED ,
- 100 , "内码输入" ) ;
- }
- else
- {
- //读出当前输入法
- m_nCurrentMethod =GetPrivateProfileInt( INPUT_METHOD ,
- CURRENT_INPUT_METHOD ,
- m_nMethodNum , INI_FILE_NAME ) ;
- if( m_nCurrentMethod == m_nMethodNum ) //没读出来
- m_nCurrentMethod =0 ; //设为第一个输入法
-
- char sInputName[100] ; //输入法名
- char sInputFileName[100] ; //输入法文件
- //加入所有输入法
- for( int i=0 ; i<m_nMethodNum ; i++ )
- {
- GetInputMethodMess( i , sInputName , 100 , sInputFileName , 100 ) ;
- //加入菜单
- if( i == m_nCurrentMethod ) //是当前输入法
- {
- m_InputMenu.InsertMenu( 0 , MF_BYPOSITION|
- MF_CHECKED|MF_DISABLED ,
- 100+i , sInputName ) ;
- if( i ) //不是英文输入
- LoadInputLib( sInputFileName ) ; //装入该输入法
- }
- else
- m_InputMenu.InsertMenu( 0 , MF_BYPOSITION ,
- 100+i , sInputName ) ;
- }
- //改变当前输入法
- SetInputMethod( m_nCurrentMethod ) ;
- }
- }
- //得到输入法菜单的句柄
- HMENU CInputInit::GetInputMenu( void )
- {
- return m_InputMenu.m_hMenu ;
- }
- //增加一种输入法
- BOOL CInputInit::AddInputMethod( LPCSTR lpcsName ,
- LPCSTR lpcsFileName )
- {
- //加入菜单
- m_InputMenu.InsertMenu( 0 , MF_BYPOSITION ,
- 100+m_nMethodNum , lpcsName ) ;
- //输入法数增加
- m_nMethodNum++ ;
- //改变当前输入法菜单的状态
- // ChangeMenuStatus( m_nMethodNum-1 ) ;
- //将新增加输入法做为当前输入法
- m_nCurrentMethod =m_nMethodNum-1 ;
-
- //改变INI文件
- char sBuff[100] ;
- wsprintf( sBuff , "%d" , m_nMethodNum ) ; //输入法数
- //改变输入法数
- WritePrivateProfileString( INPUT_METHOD ,
- INPUT_NUM , sBuff , INI_FILE_NAME ) ;
- //改变当前输入法
- SetInputMethod( m_nCurrentMethod ) ;
- WriteInputMethodInfo( m_nMethodNum-1 , lpcsName ,
- lpcsFileName ) ;
-
- return 1 ;
- }
- //删除一种输入法
- BOOL CInputInit::DeleteInputMethod( int n )
- {
- //转换n,n是菜单顺序,n1是INI文件中顺序
- int n1 =m_nMethodNum-1-n ;
- if( n1<=0 || n1>=m_nMethodNum ) //英文输入法不能被删除
- {
- AfxMessageBox( "要删除的输入法位置不对!" ) ;
- return 0 ;
- }
- char sInputName[100] ; //输入法名
- char sInputFileName[100] ; //输入法文件
- for( int i=n1 ; i<m_nMethodNum-1 ; i++ ) //将n1之后的读出重写
- {
- GetInputMethodMess( i+1 , sInputName , 100 , sInputFileName , 100 ) ;
- WriteInputMethodInfo( i , sInputName , sInputFileName ) ;
- }
- //减少输入法数
- m_nMethodNum-- ;
- //改变当前输入法
- if( n1<=m_nCurrentMethod )
- m_nCurrentMethod-- ; //删除了当前输入法以前的输入法
- //改变INI文件
- char sBuff[100] ;
- wsprintf( sBuff , "%d" , m_nMethodNum ) ; //输入法数
- //改变输入法数
- WritePrivateProfileString( INPUT_METHOD ,
- INPUT_NUM , sBuff , INI_FILE_NAME ) ;
- //删除菜单中所有项
- for( i=0 ; i<m_nMethodNum+1 ; i++ )
- m_InputMenu.DeleteMenu( 0 , MF_BYPOSITION ) ;
- //重新读入INI文件
- InitInputMenu() ;
-
- return 1 ;
- }
- //得到输入法的名字与文件名
- BOOL CInputInit::GetInputMethodMess( int n ,
- LPSTR lpsName , int nMaxNameLen ,
- LPSTR lpsFileName , int nMaxFileNameLen )
- {
- if( n<0 || n>=m_nMethodNum )
- {
- AfxMessageBox( "GetInputMethodMess 中的n有问题!" ) ;
- return 0 ;
- }
- char sBuff[100] ;
-
- //组织输入法名
- wsprintf( sBuff , "%s%d" , INPUT_METHOD_NAME , n ) ;
- //得到输入法名
- GetPrivateProfileString( INPUT_METHOD ,
- sBuff , "英文" , lpsName , nMaxNameLen , INI_FILE_NAME ) ;
- //组织输入法文件名
- wsprintf( sBuff , "%s%d" , INPUT_METHOD_FILE_NAME , n ) ;
- //得到输入法文件
- GetPrivateProfileString( INPUT_METHOD , sBuff ,
- "abc@123" , lpsFileName , nMaxFileNameLen ,
- INI_FILE_NAME ) ;
- if( !_fstrcmp( lpsFileName , "abc@123" ) ) //有问题
- lpsFileName[0] =' ' ;
-
- return 1 ;
- }
- //得到当前输入法的名字与文件名
- BOOL CInputInit::GetCurrentInputMethod( LPSTR lpsName ,
- int nMaxNameLen ,
- LPSTR lpsFileName , int nMaxFileNameLen )
- {
- return GetInputMethodMess( m_nCurrentMethod , lpsName ,
- nMaxNameLen ,
- lpsFileName , nMaxFileNameLen ) ;
- }
- //改变输入法状态
- void CInputInit::ChangeMenuStatus( int n )
- {
- if( n<0 || n>=m_nMethodNum )
- {
- AfxMessageBox( "ChangeMenuStatus 中的n有问题!" ) ;
- return ;
- }
-
- if( n==m_nCurrentMethod ) //是当前输入法,不用改变了
- return ;
- //将该菜单项打上标记,并且无效
- m_InputMenu.CheckMenuItem( m_nMethodNum-1-n ,
- MF_BYPOSITION|MF_CHECKED ) ;
- m_InputMenu.EnableMenuItem( m_nMethodNum-1-n ,
- MF_BYPOSITION|MF_DISABLED ) ;
-
- //将以前的当前菜单项消除标记,并且有效
- m_InputMenu.CheckMenuItem( m_nMethodNum-1-m_nCurrentMethod ,
- MF_BYPOSITION|MF_UNCHECKED ) ;
- m_InputMenu.EnableMenuItem( m_nMethodNum-1-m_nCurrentMethod ,
- MF_BYPOSITION|MF_ENABLED ) ;
- //改变当前输入法
- m_nCurrentMethod =n ;
- SetInputMethod( m_nCurrentMethod ) ;
- //关闭以前的输入法
- UnloadInputLib() ;
- if( n ) //不是英文输入法
- {
- //得到当前输入法文件名
- char sName[100] ;
- char sFileName[100] ;
- GetCurrentInputMethod( sName , 100 , sFileName , 100 ) ;
- //装入现在的输入法
- LoadInputLib( sFileName ) ;
- }
- }
- //向INI文件写入一种输入法的信息
- BOOL CInputInit::WriteInputMethodInfo( int n , LPCSTR lpcsName ,
- LPCSTR lpcsFileName )
- {
- char sBuff[100] ;
- wsprintf( sBuff , "%s%d" , INPUT_METHOD_NAME , n ) ;
- //增加输入法名称
- WritePrivateProfileString( INPUT_METHOD ,
- sBuff , lpcsName , INI_FILE_NAME ) ;
- wsprintf( sBuff , "%s%d" , INPUT_METHOD_FILE_NAME , n ) ;
- //增加输入法文件名称
- WritePrivateProfileString( INPUT_METHOD ,
- sBuff , lpcsFileName , INI_FILE_NAME ) ;
- return 1 ;
- }
- int CInputInit::GetCurrentMenu( void )
- {
- return (m_nMethodNum-1-m_nCurrentMethod) ;
- }
- //返回当前输入法位置
- int CInputInit::GetCurrentMethod( void )
- {
- return m_nCurrentMethod ;
- }
- //得到输入法数
- int CInputInit::GetInputMethodNum( void )
- {
- return m_nMethodNum ;
- }