📄 platformime.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 + -