📄 iniinput.cpp
字号:
//初始化输入法环境
#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] ='\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 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -