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

📄 platformime.h

📁 五行MMORPG引擎系统V1.0
💻 H
字号:
////////////////////////////////////////////////////////////////////////////////////
//platformIME.h 平台输入法,李亦编写.2005.11.18

#ifndef _PLATFORMIME_H_
#define _PLATFORMIME_H_


#ifndef _PLATFORM_H_
#include "platform/platform.h"
#endif

#ifndef _RPG__RPGTEXTPARSE_H_
#include "rpg/RPGTextParse.h"
#endif


class GuiIMECtrl;

typedef  U32  UWND;
///	输入法管理
///	1、在函数 PlatformIME::ConvertCandList 中所说的选字表的问题
///	2、函数 PlatformIME::GetIMEInput 返回的 szCompReadStr 显然经过了加工而不是最初的键盘输入
///   它的每个可组合的输入占以空格补足的8byte,且新的不可组合的输入存为0xa1
///   我们可以在输入法名字中有子串"微软拼音"时,只显示末尾的一组8byte,如果有0xa1就什么都不显示,也可以直接用TextOut显示所有的
///
///@section CIME_display 输入法内容输出代码
///@code
////	p3.Text( g_pIME->GetIMEName(), NULL, RGB( 255, 0, 0 ), 0, 32 );
////	p3.Text( g_pIME->IsSharpIME()? "全角" : "半角", NULL, RGB( 255, 0, 0 ), 0, 64 );
////	p3.Text( g_pIME->IsSymbolIME()? "中文标点" : "英文标点", NULL, RGB( 255, 0, 0 ), 64, 64 );

////	char *szCompStr, *szCompReadStr, *szCandList;
////	g_pIME->GetIMEInput( &szCompStr, &szCompReadStr, NULL, &szCandList );
////	p3.Text( szCompStr, NULL, RGB( 255, 0, 0 ), 0, 96 );
////	p3.Text( szCompReadStr, NULL, RGB( 255, 0, 0 ), 0, 128 );
////	p3.Text( szCandList, NULL, RGB( 255, 0, 0 ), 0, 160 );
//// @endcode
////
///	@section CIME_control 输入法控制
///	@code
////case WM_KEYDOWN:
////	switch( wParam ){
////	case VK_F1:
////		if( g_pIME )g_pIME->NextIME();
////		break;
////	case VK_F2:
////		if( g_pIME )g_pIME->SharpIME( GetHWnd());
////		break;
////	case VK_F3:
////		if( g_pIME )g_pIME->SymbolIME( GetHWnd());
////		break;
////	case VK_F5:
////		if( g_pIME )g_pIME->EnableIME();
////		break;
////	case VK_F6:
////		if( g_pIME )g_pIME->DisableIME();
////		break;
////	}
//// @endcode
////
///	@section CIME_events 输入法事件处理
///	@code
////	/// IME
////case WM_IME_SETCONTEXT:
////	if(g_pIME && g_pIME->->OnWM_IME_SETCONTEXT()) return 0;
////	break;
////case WM_INPUTLANGCHANGEREQUEST:
////	if(g_pIME && g_pIME->->OnWM_INPUTLANGCHANGEREQUEST() return 0;
////	break;
////
////case WM_INPUTLANGCHANGE:
////	if(g_pIME && g_pIME->->OnWM_INPUTLANGCHANGE( hWnd ) return 0;
////	break;
////
////case WM_IME_STARTCOMPOSITION:
////	if(g_pIME && g_pIME->->OnWM_IME_STARTCOMPOSITION() return 0;
////	break;
////case WM_IME_ENDCOMPOSITION:
////	if(g_pIME && g_pIME->->OnWM_IME_ENDCOMPOSITION() return 0;
////	break;
////
////case WM_IME_NOTIFY:
////	if(g_pIME && g_pIME->->OnWM_IME_NOTIFY( hWnd, wParam ) return 0;
////	break;
////case WM_IME_COMPOSITION:
////	if(g_pIME && g_pIME->->OnWM_IME_COMPOSITION( hWnd, lParam ) return 0;
////	break;
//// @endcode
///
class PlatformIME
{
	friend class GuiIMECtrl;
	enum Constants
	{
		MAX_BUF		= 260,
		MAX_NAME	= 64
	};
	bool	m_bIME;						///> ime允许标志
	char	m_szCompStr[ MAX_BUF ];		///> 存储转换后的串
	char	m_szCompReadStr[ MAX_BUF ];	///> 存储输入的串
	char	m_szCandList[ MAX_BUF ];	///> 存储整理成字符串选字表
	int		m_nIMECursor;				///> 存储转换后的串中的光标位置
	char	m_szIMEName[ MAX_NAME ];	///> 存储输入法的名字
	bool	m_bIMESharp;				///> 全角标志
	bool	m_bIMESymbol;				///> 中文标点标志

	UWND m_hWnd;
	//CANDIDATELIST *m_lpCandList;		///> 存储标准的选字表

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

	GuiIMECtrl*		m_pIMECtrl;
public:
	RPG::RPGTextParse	m_textParse;

public:
	PlatformIME() ;
	~PlatformIME();

	static void Init();
	static void Destroy();

	///@section 控制函数
	///@{
	void AttachIMECtrl(GuiIMECtrl* pCtrl);
	void DetachIMECtrl(GuiIMECtrl* pCtrl);
	void DisableIME();///> 关闭并禁止输入法,如ime已经打开则关闭,此后玩家不能用热键呼出ime
	void EnableIME();///> 允许输入法,此后玩家可以用热键呼出ime
	void ToggleIME();///> 切换输入法
	void HideIME();///> 切换输入法
	void NextIME();///> 切换到下一种输入法,必须EnableIME后才有效
	void SharpIME();///> 切换全角/半角
	void SymbolIME();///> 切换中/英文标点
	/// @}

	///@section 状态函数
	///@{
	char* GetIMEName();	//得到输入法名字,如果当前是英文则返回NULL
	bool IsSharpIME();//是否全角
	bool IsSymbolIME();//是否中文标点
	bool IsEnable(){return m_bIME && m_szIMEName[0];}

	///	得到输入法状态,四个指针任意可为NULL则此状态不回返回
	///	@param pszCompStr		返回转换后的串
	///	@param pszCompReadStr	返回键盘直接输入的串
	///	@param pnIMECursor		返回szCompStr的光标位置
	///	@param pszCandList		中返回选字表,每项之间以\t分隔
	void GetIMEInput( char **pszCompStr, char **pszCompReadStr, int *pnIMECursor, char **pszCandList );

	inline int GetCursorPos(){return m_nIMECursor;}
	/// @}


   /// @name Input Processing
   /// @{
      
   /// Processes an input event
   /// @see InputEvent
   /// @param   event   Input event to process
   //bool processInputEvent(const InputEvent *event);
   
   /// Processes a mouse movement event
   /// @see MouseMoveEvent
   /// @param   event   Mouse move event to process
   //void processMouseMoveEvent(const MouseMoveEvent *event);
   /// @}

	///@section 消息处理
	///	必须在消息中调用的函数,如果返回是true,则窗口函数应直接返回0,否则应传递给DefWindowProc
	///@{
	bool OnWM_INPUTLANGCHANGEREQUEST();
	bool OnWM_INPUTLANGCHANGE( UWND hWnd );
	bool OnWM_IME_SETCONTEXT()		{ return true; }
	bool OnWM_IME_STARTCOMPOSITION(){ return true; }
	bool OnWM_IME_ENDCOMPOSITION()	{ return true; }
	bool OnWM_IME_NOTIFY( UWND hWnd, U32 wParam );
	bool OnWM_IME_COMPOSITION( UWND hWnd, U32 lParam );
	/// @}
};

extern PlatformIME* g_pIME;


//-------------------------------------------------------------

inline char* PlatformIME::GetIMEName()
{
	return m_szIMEName[ 0 ]? m_szIMEName : NULL;
}

inline bool PlatformIME::IsSharpIME()
{//是否全角
	return m_bIMESharp;
}

inline bool PlatformIME::IsSymbolIME()
{//是否中文标点
	return m_bIMESymbol;
}

inline bool PlatformIME::OnWM_INPUTLANGCHANGEREQUEST()
{
	return !m_bIME;//如果禁止ime则返回false,此时窗口函数应返回0,否则DefWindowProc会打开输入法
}



inline void PlatformIME::EnableIME()
{
	m_bIME = true;
}



#endif//_PLATFORMIME_H_

⌨️ 快捷键说明

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