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

📄 iniinput.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 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 + -