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

📄 ime.h

📁 《OpenGL游戏编程》这本书的配套源码。
💻 H
字号:
//======================================================================
/**
*  @file      Ime.h
*
*  项目描述: 构造游戏引擎
*   
*  文件描述:  输入法IME类
*  适用平台: Windows98/2000/NT/XP
*  
*  作者:     WWBOSS
*  电子邮件:  wwboss123@gmail.com
*  创建日期: 2007-07-24	
*  修改日期: 2007-07-24
*/																			
//======================================================================

#ifndef __IME_H__
#define __IME_H__


#include <imm.h>

#pragma comment ( lib, "imm32.lib" )

//! 接受字符串的最大长度
#define STR_MAX_LENGTH 256



/** \brief
 *  封装了ime相关的处理函数的类,输入法相关。
 */
class CIme
{
public:
	CIme();
	~CIme(){Release();}


	/**\brief
	 * 关闭并禁止输入法,如ime已经打开则关闭,
	 * 此后玩家不能用热键呼出ime
	 */
	void Disable();


	/**\brief
	 * 允许输入法,此后玩家可以用热键呼出ime
	 */
	void Enable(){Disable();m_bIme = true;}


	/**\brief
	 * 设置是否接收输入字符
	 */
	void SetReceiveChar(bool _b){m_bReceive=_b;}


	/**\brief
	 * 切换到下一种输入法,必须EnableIme后才有效
	 */
	void NextIme();


	/**\brief
	 * 切换全角/半角
	 */
	void SharpIme( HWND hWnd );


	/**\brief
	 * 切换中/英文标点
	 */
	void SymbolIme( HWND hWnd );


	/**\brief
	 * 状态函数
	 */
	char* GetImeName();

	/**\brief
	 * 是否按了回车键
	 */
	BOOL GetReturnState(){return m_bReturn?TRUE:FALSE;}

	/**\brief
	 * 是否全角
	 */
	bool IfImeSharp();


	/**\brief
	 * 是否中文标点
	 */
	bool IfImeSymbol();


	char*   GetImeInputCompStr();
	char*   GetImeInputCompReadStr();
	int     GetImeInputCursor();
	char*   GetImeInputCandList();
	char*   GetImeInputResultStr();


	//@{
	//! 必须在消息中调用的函数,如果返回是true,
	//  则窗口函数应直接返回0,否则应传递给DefWindowProc

	/** \brief
	 *  切换输入法的时候收到的消息。
	 *
	 *  如果禁止ime则返回false,此时窗口函数应返回0,否则DefWindowProc会打开输入法
	 */
	virtual bool OnWM_INPUTLANGCHANGEREQUEST();
	virtual bool OnWM_INPUTLANGCHANGE( HWND hWnd);
	virtual bool OnWM_IME_SETCONTEXT(){ return true; }
	virtual bool OnWM_IME_STARTCOMPOSITION(){ return true; }
	virtual bool OnWM_IME_ENDCOMPOSITION(){ return true; }
	virtual bool OnWM_IME_NOTIFY( HWND hWnd, WPARAM wParam );
	virtual bool OnWM_IME_COMPOSITION( HWND hWnd, LPARAM lParam );
	//@} 

	void Release();

	void AddCharToResultStr(char* _Char);


	/** \brief
	*获得输入字符 把得到的输入字符放入字符串列表中
	*/
	void ReceiveChar(TCHAR _iCharCode);


	/** \brief
	* 在插入符位置插入一个字符串
	*
	* \param	_Char	插入的字符串
	* \param	_dwSize	字符串的长度
	*/
	void ReceiveChar(char* _Char, DWORD _dwSize);


	/** \brief
	* 取得插入符的位置
	*/
	int GetCaret(void){return m_iImeCaret;}


	/**\brief
	 * 取得插入符在字中的位置
	 */
	int GetWordCaret(void){return m_iWordCaret;}


	/** \brief
	* "回退" 键处理
	*/
	void BackspaceKey(void);


	/** \brief
	* "DEL" 键处理
	*/
	void DeleteKey(void);


	/** \brief
	* "向右"方向键的处理
	*/
	void RightKey(void);


	/** \brief
	* "向左"方向键的处理
	*/
	void LeftKey( void );


	/**\brief
	 * 回车键的处理
	 */
	void ReturnKey(void){m_bReturn=true;}


	/**\brief
	 * 取得当前的IME对象
	 */
	static CIme* GetSysIme(){return m_pIme;}


private:
	//! ime静态指针
	static CIme* m_pIme;

	//! ime允许标志
	bool	m_bIme;

	//! 是否从键盘接收字符<除回退键>
	bool	m_bReceive;

	//! 是否按了回车
	bool	m_bReturn;

	//! 存储转换后的串
	char	m_szCompStr[ MAX_PATH ];

	//! 存储输入的串
	char	m_szCompReadStr[ MAX_PATH ];

	//! 存储整理成字符串选字表
	char	m_szCandList[ MAX_PATH ];

	//! 存储转换后的串中的光标位置
	int		m_nCursor;

	//! 存储标准的选字表
	CANDIDATELIST *m_lpCandList;

	//! 全角标志
	bool	m_bSharp;

	//! 中文标点标志
	bool	m_bSymbol;

	/**\brief
	 *  这里面存储我们使用输入法的时候,输入的字串。
	 *  上层操作只需要得到这个字串就可以了。
	 */
	char	m_chResultStr[STR_MAX_LENGTH];


	//! 存储输入法的名字
	char	m_szName[64];

	//! 当前接受字符的字符串可以接受字符的最大程度
	int		m_iMaxLen;

	//-------------------------------------------
	//! 插入符的位置 插入符在那个字符的后边
	int		m_iImeCaret;

	//! 插入符在字中的位置
	int		m_iWordCaret;
	//--------------------------------------------

	/**\brief
	 * 将选字表整理成串
	 */
	void ConvertCandList( CANDIDATELIST *pCandList,char *pszCandList );

};




///////////////////////////////////////////////
//--------------Inline函数实现-----------------

inline void CIme::NextIme()
{
	if( m_bIme )ActivateKeyboardLayout((HKL)HKL_NEXT,0);
}

inline void CIme::SharpIme( HWND hWnd )
{
	ImmSimulateHotKey( hWnd, IME_CHOTKEY_SHAPE_TOGGLE);
}

inline void CIme::SymbolIme( HWND hWnd )
{
	ImmSimulateHotKey( hWnd, IME_CHOTKEY_SYMBOL_TOGGLE);
}


/**\brief
 * 切换输入法的时候收到的消息。
 *
 * 如果禁止ime则返回false,此时窗口函数应返回0,否则DefWindowProc会打开输入法
 */
inline bool CIme::OnWM_INPUTLANGCHANGEREQUEST()
{
	return !m_bIme;
}


inline char* CIme::GetImeName()
{
	return m_szName[0]?m_szName:NULL;
}

/**\brief
 * 是否全角
 */
inline bool CIme::IfImeSharp()
{
	return m_bSharp;
}

/**\brief
 * 是否中文标点
 */
inline bool CIme::IfImeSymbol()
{
	return m_bSymbol;
}

inline char* CIme::GetImeInputCompStr()
{
	return  m_szCompStr[0] ? m_szCompStr : NULL;
}

inline char *CIme::GetImeInputCompReadStr()
{
	return  m_szCompReadStr[0] ? m_szCompReadStr : NULL;
}

inline int CIme::GetImeInputCursor()
{
	return  m_nCursor;
}

inline char* CIme::GetImeInputCandList()
{
	return  m_szCandList[0] ? m_szCandList : NULL;
}

inline	char* CIme::GetImeInputResultStr()
{
	return  m_chResultStr;
}

inline void CIme::AddCharToResultStr(char* _Char)
{
	strcat(m_chResultStr,_Char);
}


#endif

⌨️ 快捷键说明

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