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

📄 inputer.h

📁 包含拼音和笔画输入的中文输入法,使用VC.NET2003开发.portable Chinese input method includes phonetic input and stroke, the
💻 H
📖 第 1 页 / 共 2 页
字号:
	protected :
		/**
		*	初始化字
		*/
		void	InitWord( Word wd, const WordComment& wc );
	};

public :

	/**
	*	获的部首查询器
	*/
	static	BSQuery*	GetBSQuery();

	/**
	*	获的笔画查询器
	*/
	static	StrokesQuery*	GetStrokesQuery();

	/**
	*	获的拼音查询器
	*/
	static	SpellQuery*	GetSpellQuery();

	/**
	*	获的拼写查询器
	*/
	static	StrokesOrderQuery*	GetStrokesOrderQuery();

protected :

	/**
	*	型别转换
	*/
	template	<class	TQuery>
	struct		TypeTraits
	{
	};


	/**
	*	获得特定的查询器
	*/
	template	<class	TQuery>
	static	TQuery*		GetQuery( TypeTraits<TQuery> )
	{
		static	TQuery		s_Query;
		static	BOOL		bInit	=	FALSE;
		
		// 首次使用初始化
		if	( !bInit )
		{
			if ( !s_Query.Initialize( &s_WordTable ) )
				return	NULL;
			else
				bInit	=	TRUE;
		}
		
		return	&s_Query;
	}

protected :

	/**
	*	所有汉字表
	*/
	static	WordTable	s_WordTable;

	/**
	*	部首表
	*/
	static	BSWord		s_BSWordTable[];

	friend	class	BSWords;
};

/**
*	字典生成器
*/
class	ChineseDictionaryMaker
{
public :

	/**
	*	制作字典
	*/
	static	BOOL	Make( const TCHAR*	szSpell, 
						  const TCHAR*	szBS,
						  const	TCHAR*	szStrokes );
protected :
	typedef		map<Word, ChineseDictionary::WordComment>		WordTable;

	/**
	*	处理拼音
	*/	
	static BOOL	ProcessSpell( const TCHAR* szSpell, WordTable& wtbl );

	/**
	*	处理部首
	*/
	static BOOL	ProcessBS( const TCHAR* szBS, WordTable& wtbl );

	/**
	*	处理笔画
	*/
	static	BOOL	ProcessStrokes( const TCHAR* szStrokes, WordTable& wtbl );
}; // end of DictionaryMaker

/**
*	部首比较器
*/
struct		BSLess
{
	/**
	*	比较wd1和wd2大小
	*	@param	如果wd1>wd2返回true, 否则为false
	*/
	BOOL	operator()( Word wd1, Word wd2 )
	{
		return	wd1<wd2;
	}
};

/**
*	字符串比较器
*/	
struct		StringLess
{
	/**
	*	比较str1和str2大小
	*	@param	如果str1>str2返回true, 否则为false
	*/
	BOOL	operator()( const CString& str1, const CString& str2 ) const
	{
		return	str1<str2;
	}
};

/**
*	笔顺比较器
*/
struct		StrokesOrderLess	:	public StringLess
{
};

/**
*	拼音比较器
*/
struct		SpellLess	:	public StringLess
{
};

/**
*	笔画比较器
*/
struct		StrokesLess
{
	BOOL	operator( )( int n1, int n2 ) const
	{
		return	n1 < n2;
	} 
};

/**
*	字符串包含测试器
*/
struct	StringContainTester
{
	/**
	*	 判断strTest前半部分是否包含strPrefix
	*/
	static	BOOL	Contain(	const TCHAR* strTest, 
								const TCHAR* strPrefix )
	{
		int	index	=	0;
		while	( strTest[index] && strPrefix[index] )
		{
			if ( strTest[index] != strPrefix[index] )
				return	FALSE;
			index++;
		}

		return	strTest[index] ||
				strTest[index] == strPrefix[index] ? TRUE	: FALSE;
				
	}
};

/**
*	拼音包含测试器
*/
struct	SpellContainTester	:	public StringContainTester
{	
};


/**
*	笔顺包含测试器
*/
struct	StrokesOrderContainTester	:	public StringContainTester
{	
};


/**
*	中文输入法
*/
class	ChineseInputer
{
public :

	/**
	*	汉字枚举器
	*/
	typedef		list<Word>		WordEnumerator;

	/**
	*	输入器
	*/
	class	Inputer
	{
	public :
		/**
		*	输入模式
		*/
		enum
		{
			/**
			*	输入拼音
			*/
			Input_Spell	= 0, 

			/** 
			*	输入部首 
			*/
			Input_BS,

			/**
			*	输入笔画
			*/
			Input_Strokes,

			/**
			*	输入笔顺
			*/
			Input_StrokesOrder
		};  // end of input state 

		/**
		*	构造函数
		*/
		Inputer();

		/**
		*	设置输入模式
		*/
		void	SetMode( int nMode );

		/**
		*	获得输入模式
		*/
		int		GetMode() const;

		/**
		*	获得所有输入
		*/	
		CString	GetInputs() const;

		/**
		*	输入字符
		*/
		void	Put( TCHAR c );

		/**
		*	输入字符串
		*/
		void	Put( const TCHAR* szChars );

     	/**
		*	输入法重置
		*/
		void	Reset();

		/**
		*	获得输入的拼音
		*/
		CString	GetSpell() const;

		/**
		*	获得输入的部首
		*/
		CString	GetBS() const;

		/**
		*	获得输入的笔顺
		*/
		CString	GetStrokesOrder() const;

		/**
		*	获得输入的笔画
		*/
		CString	GetStrokes() const;

	protected :
		/**
		*	获得原始串
		*/
		CString	GetUnparse() const;

	protected :
		/**
		*	输入解析器
		*/
		class	InputParser
		{
		public :
			/**
			*	构造函数
			*/
			InputParser( const CString& str );

			/**
			*	获得输入的拼音
			*/
			const CString&	GetSpell() const
			{
				return	m_strSpell;
			};
			
			/**
			*	获得输入的部首
			*/
			const CString&	GetBS() const
			{
				return	m_strBS;
			};
			
			/**
			*	获得输入的笔顺
			*/
			const CString&	GetStrokesOrder() const
			{
				return	m_strStrokesOrder;
			};
			
			/**
			*	获得输入的笔画
			*/
			const CString&	GetStrokes() const
			{
				return	m_strStrokes;
			};

		protected :
			/**
			*	解析函数
			*/
			BOOL	Parse( const CString& str );
	
		protected :
			/**
			*	需要解析得字符串
			*/
			CString		m_strForParse;

			/**
			*	拼音	
			*/
			CString		m_strSpell;

			/**
			*	笔顺
			*/
			CString		m_strStrokesOrder;

			/**
			*	笔画
			*/
			CString		m_strStrokes;

			/**
			*	部首
			*/
			CString		m_strBS;
		};

	public :
		/**
		*	拼音输入码分隔符
		*/
		static	const TCHAR	s_cSpellLeft, s_cSpellRight;

		/**
		*	部首输入码分隔符
		*/
		static	const TCHAR	s_cBSLeft, s_cBSRight;

		/**
		*	笔画输入码分隔符
		*/
		static	const TCHAR	s_cStrokesLeft, s_cStrokesRight;

		/**
		*	笔顺输入码分隔符
		*/
		static	const TCHAR	s_cStrokesOrderLeft, s_cStrokesOrderRight;

		/**
		*	分割字符
		*/
		static	TCHAR	s_cDividTable[4][2];
	
		/**
		*	分别指左右分隔符
		*/
		enum
		{
			begin	=	0,
			end		=	1
		};

	protected :
		/**
		*	当前输入模式
		*/
		int		m_uMode;

		/**
		*	已经输入的所有码
		*/
		CString	m_strInputs;
	};

	/**
	*	构造函数
	*/
	ChineseInputer();

	/**
	*	排序器
	*/
	class	Sorter	
	{
	protected :
		/**
		*	排序模式	
		*/
		Sorter( int nMode ) : m_nMode(nMode)	{ }

	public	:
		/**
		*	输出汉字排序模式
		*/
		enum
		{
		/**
		*	不排序
			*/
			OrderByNone,
				
			/**
			*	按部首排序
			*/
			OrderByBS,
			
			/**
			*	按拼音排序
			*/
			OrderBySpell,
			
			/**
			*	按笔画排序
			*/
			OrderByStrokes,
			
			/**
			*	按笔顺排序
			*/
			OrderByStrokesOrder
		};

		/**
		*	排序
		*/
		virtual		void	Sort( WordEnumerator& enumer )	=	0;

		/**
		*	判断排序器是否相等
		*/
		BOOL	operator==( const Sorter& sb ) const
		{
			return	m_nMode == sb.m_nMode;
		}

		/**
		*	判断是否不等
		*/
		BOOL	operator!=( const Sorter& sb ) const
		{
			return	m_nMode != sb.m_nMode;
		}

		/**
		*	获得排序模式
		*/	
		int		GetMode() const
		{
			return	m_nMode;
		}
		
	protected :
		/**
		*	排序模式
		*/
		int		m_nMode;
	};


	/**
	*	根据输入码, 查询汉字
	*/
	BOOL	QueryWords(  WordEnumerator& enumer, Sorter*	pSorter=NULL );


	typedef		ChineseDictionary::BSQuery		BSQuery;

	/**
	*	获得部首查询器
	*/
	BSQuery*	GetBSQuery()
	{
		return	ChineseDictionary::GetBSQuery( );
	}

	typedef		ChineseDictionary::SpellQuery	SpellQuery;

	/**
	*	获得查询查询器
	*/
	SpellQuery*	 GetSpellQuery( )
	{
		return	ChineseDictionary::GetSpellQuery();
	}

	typedef		ChineseDictionary::StrokesQuery	StrokesQuery;

	/**
	*	获得笔画查询器
	*/
	StrokesQuery*	 GetStroksQuery()
	{
		return	ChineseDictionary::GetStrokesQuery();
	}


	typedef		ChineseDictionary::StrokesOrderQuery	StrokesOrderQuery;

	/**
	*	获得笔顺查询器
	*/
	StrokesOrderQuery*	GetStrokesOrderQuery()
	{
		return	ChineseDictionary::GetStrokesOrderQuery();
	}

	/**
	*	获得输入器
	*/
	Inputer*	GetInputer();


protected :
	/**
	*	输入器
	*/
	Inputer		m_Inputer;

protected :
	/**
	*	查询过滤器
	*/
	class	QueryFilter
	{
	public :
		QueryFilter( const TCHAR* szFilter ) : m_strFilter(szFilter)
		{
		}

		/**
		*	析构函数
		*/	
		~QueryFilter()	{ }

		/**
		*	查询
		*/
		virtual		BOOL	QueryWords( WordEnumerator& enumer )	=	0;

		/**
		*	过滤字
		*/
		virtual		BOOL	Pass( Word wd )	=	0;	

		/**
		*	获得过滤器名称
		*/
		const CString&	GetFilter() const
		{
			return	m_strFilter;
		}

	protected :
		const	ChineseDictionary::WordComment&	GetComment(Word wd) 
		{
			ChineseDictionary::WordItemRef ref		=	ChineseDictionary::Get(wd);
			ASSERT ( ref != ChineseDictionary::NullWordItemRef );

			return ref.GetComment( );
		}


	protected :
		/**
		*	过滤器
		*/
		CString		m_strFilter;
	};

	/**
	*	拼音过滤器
	*/
	class	SpellFilter	:	public QueryFilter
	{
	public :
		/**
		*	构造函数
		*/
		SpellFilter( const TCHAR* szSpell );
		~SpellFilter() { }

		/**
		*	查询
		*/
		BOOL	QueryWords( WordEnumerator& enumer );

		/**
		*	过滤字
		*/
		BOOL	Pass( Word wd );	
	};


	/**
	*	部首过滤器
	*/
	class	BSFilter	:	public QueryFilter
	{
	public :
		/**
		*	构造函数
		*/
		BSFilter( const TCHAR* szBS );

		/**
		*	查询
		*/
		BOOL	QueryWords( WordEnumerator& enumer );

		/**
		*	过滤字
		*/
		BOOL	Pass( Word wd );	
	};

	/**
	*	笔画过滤器
	*/
	class	StrokesFilter	:	public QueryFilter
	{
	public :
		/**
		*	构造函数
		*/
		StrokesFilter( const TCHAR* szBS );

		/**
		*	查询
		*/
		BOOL	QueryWords( WordEnumerator& enumer );

		/**
		*	过滤字
		*/
		BOOL	Pass( Word wd );	

		/**
		*	笔画数
		*/
		int		GetStrokes() const
		{
			return	m_nStrokes;
		};

	protected :
		/**
		*	笔画数
		*/
		int		m_nStrokes;
	
	};

	/**
	*	笔顺过滤器
	*/
	class	StrokesOrderFilter	:	public QueryFilter
	{
	public :
		/**
		*	构造函数
		*/
		StrokesOrderFilter( const StrokesOrder&	sodr );

		/**
		*	查询
		*/
		BOOL	QueryWords( WordEnumerator& enumer );

		/**
		*	过滤字
		*/
		BOOL	Pass( Word wd );	
	};

	/**
	*	查询代理器
	*/
	class	QueryBroker
	{
	public :

		/**
		*	析构函数
		*/
		~QueryBroker();

		/**
		*	加入过滤器
		*/
		void	AddFilter(	QueryFilter* pFilter, BOOL	bAutoDel=FALSE );

		/**
		*	查询
		*/
		BOOL	QueryWords( WordEnumerator& enumer );

	protected :
		/**
		*	过滤器集合
		*/
		vector<QueryFilter*>		m_vFilters;

		/**
		*	自动删除标记
		*/
		vector<BOOL>				m_vDeletes;
	};

	/**
	*	拼音排序
	*/
	class	SpellSort	:	public Sorter
	{
	public :
		/**
		*	排序器构造函数
		*/
		SpellSort() : Sorter(OrderBySpell) {};

		/**
		*	排序
		*/
		void	Sort( WordEnumerator& enumer );

		/**
		*	获得前缀
		*/
		const	CString&	GetPrefix() const
		{
			return	m_strSpellPrefix;
		}

		/**
		*	设置前缀
		*/
		void	SetPrefix( const TCHAR* szPrefix )
		{
			m_strSpellPrefix	=	szPrefix;
		}

	protected :
		/**
		*	排序得主拼音
		*/
		CString		m_strSpellPrefix;
	};

	/**
	*	部首排序
	*/
	class	BSSort	:	public Sorter
	{
	public :
		/**
		*	排序器构造函数
		*/
		BSSort() : Sorter(OrderByBS) {};

		/**
		*	排序
		*/
		void	Sort( WordEnumerator& enumer );
	};

	/**
	*	笔画排序
	*/
	class	StrokesSort	:	public Sorter
	{
	public :
		/**
		*	排序器构造函数
		*/
		StrokesSort() : Sorter(OrderByStrokes) {};

		/**
		*	排序
		*/
		void	Sort( WordEnumerator& enumer );
	};

	/**
	*	笔顺排序
	*/
	class	StrokesOrderSort	:	public Sorter
	{
	public :
		/**
		*	排序器构造函数
		*/
		StrokesOrderSort() : Sorter(OrderByStrokesOrder) {};

		/**
		*	排序
		*/
		void	Sort( WordEnumerator& enumer );
	};

	/**
	*	空排序器
	*/
	class	NullSort			:	public Sorter
	{
	public :
		/**
		*	排序器构造函数
		*/
		NullSort() : Sorter(OrderByNone) {};

		/**
		*	排序
		*/
		void	Sort( WordEnumerator& enumer )	{};
	};

public :
	/**
	*	组合排序器
	*/
	class	CompositeSort	:	public SpellSort
	{
	public :
		/**
		*	构造函数
		*/
		CompositeSort()  { m_nMode	=	-1;}
		
		/**
		*	加入排序模式
		*/
		void	AddMode( int uMode );
		
		/**
		*	排序
		*/
		void	Sort( WordEnumerator& enumer );
		
		/**
		*	清除所有模式	
		*/
		void	ClearModes();
		
	protected :
		/**
		*	排序模式
		*/
		vector<int>		m_vModes;
	};


	/**
	*	空排序器
	*/
	static	NullSort*		GetNullSort();

	/**
	*	拼音排序器
	*/
	static	SpellSort*		GetSpellSort();

	/**
	*	笔画排序器
	*/
	static	StrokesSort*	GetStrokesSort();

	/**
	*	部首排序器
	*/
	static	BSSort*			GetBSSort();

	/**
	*	笔顺排序器
	*/
	static	StrokesOrderSort*	GetStrokesOrderSort();

	/**
	*	组合排序起
	*/
	static	CompositeSort*	GetCompositeSort();
};
/**
*	名称转换类
*		将中文名转换成拼音名
*/
class	NameTransform
{
public :
	/**
	*	将中文名转换成拼音文件名
	*/
	static	BOOL	Chinese2PY( const TCHAR* szName, TCHAR* szNewName )
	{
		const char*	pCurSrc	=	szName;
		char*		pCurDst	=	szNewName;
		while ( *pCurSrc )
		{
			if ( *pCurSrc > 0 ) // digit and char
			{
				*pCurDst++	=	*pCurSrc++;
			}
			else // chinese
			{
				char	 strWord[3];
				strWord[0]	=	*pCurSrc;
				strWord[1]	=	*(pCurSrc+1);
				strWord[2]	=	'\0';
				
				ChineseDictionary::WordItemRef wordRef	=	ChineseDictionary::Get( Word(strWord) );
				
				if ( wordRef == ChineseDictionary::NullWordItemRef )
					return	FALSE;
				
				// 获得第一拼音
				const SpellGroup& spells	=	wordRef.GetComment().GetSpellGroup();
				
				SpellGroup::const_iterator it = spells.begin();
				CString	strEnglishName	=	*it;
				
				int		nLen	=	strEnglishName.GetLength();
				strncpy( pCurDst, strEnglishName, nLen );
				
				pCurSrc +=	2;
				pCurDst	+=	nLen;
			}
		}
		
		*pCurDst	=	'\0';
		return	TRUE;
	}
};


//=========================================================================================
//	拼音组
//=========================================================================================
inline
SpellGroup::SpellGroup()
{
	m_vSpell.reserve(3);
}

inline
SpellGroup::SpellGroup( const TCHAR* szSpellGroup )
{
	AddGroup( szSpellGroup );
}

inline
int		SpellGroup::GetCount() const
{
	return	m_vSpell.size();
}

};

#endif

⌨️ 快捷键说明

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