乙個中文輸入的類

2021-03-31 11:53:26 字數 3616 閱讀 5619

乙個中文輸入的類

不想讓ime顯示預設的視窗,只想用它的轉換和選字功能,看過拿鐵遊戲論壇上的乙個兄弟的一些**,修正了一些我認為的bug,加入了一組控制函式,使得程式中可以顯示一些button,玩家可以不必用熱鍵就能切換輸入法、全形/半形,中/英文標點。

//不知道這個能不能解決縮排的問題

#pragma ***ment ( lib, "imm32.lib" )

#include 

#include 

class cime //通過disableime初始化一些資料

~cime()

}//控制函式

void disableime();          //關閉並禁止輸入法,如ime已經開啟則關閉,此後玩家不能用熱鍵撥出ime

void enableime();           //允許輸入法,此後玩家可以用熱鍵撥出ime

void nextime();             //切換到下一種輸入法,必須enableime後才有效

void sharpime( hwnd hwnd ); //切換全形/半形

void symbolime( hwnd hwnd );//切換中/英文標點

//狀態函式

char* getimename();         //得到輸入法名字,如果當前是英文則返回null

bool ifimesharp();          //是否全形

bool ifimesymbol();         //是否中文標點

void getimeinput( char **psz***pstr, char **psz***preadstr, int *pnimecursor, char **pszcandlist );

//得到輸入法狀態,四個指標任意可為null則此狀態不回返回

//在psz***pstr中返回轉換後的串

//在psz***preadstr中返回鍵盤直接輸入的串

//在pnimecursor中返回sz***pstr的游標位置

//在pszcandlist中返回選字表,每項之間以/t分隔

//必須在訊息中呼叫的函式,如果返回是true,則視窗函式應直接返回0,否則應傳遞給defwindowproc

bool onwm_inputlangchangerequest();

bool onwm_inputlangchange( hwnd hwnd );

bool onwm_ime_setcontext()

bool onwm_ime_start***position()

bool onwm_ime_end***position()

bool onwm_ime_notify( hwnd hwnd, wparam wparam );

bool onwm_ime_***position( hwnd hwnd, lparam lparam );

};void cime::disableime()

void cime::enableime()

void cime::nextime()

void cime::sharpime( hwnd hwnd )

void cime::symbolime( hwnd hwnd )

void cime::convertcandlist( candidatelist *pcandlist, char *pszcandlist ) //轉換candidatelist到乙個串,/t分隔每一項

//待選字序號超出總數,微軟拼音第二次到選字表最後一頁後再按pagedown會出現這種情況,並且會退出選字狀態,開始乙個新的輸入

//但微軟拼音自己的ime視窗可以解決這個問題,估計微軟拼音實現了更多的介面,所以使用了這種不太標準的資料

//我現在無法解決這個問題,而且實際使用中也很少遇到這種事,而且其它標準輸入法不會引起這種bug

//非標準輸入法估計實現的介面比較少,所以應該也不會引起這種bug

for( i = 0; ( i < pcandlist->dwcount - pcandlist->dwselection )&&( i < pcandlist->dwpagesize ); i++ )

*( pszcandlist - 1 )= 0;//串尾,並覆蓋最後乙個'/t'

}bool cime::onwm_inputlangchangerequest()

bool cime::onwm_inputlangchange( hwnd hwnd )

//ime改變

else//英文輸入

g_szimename[ 0 ] = 0;

return false;//總是返回false,因為需要視窗函式呼叫defwindowproc繼續處理

}bool cime::onwm_ime_notify( hwnd hwnd, wparam wparam )

//釋放以前的選字表

if( dwsize = immgetcandidatelist( himc, 0, null, 0 ))

//得到新的選字表

immreleasecontext( hwnd, himc );

if( g_lpcandlist )convertcandlist( g_lpcandlist, g_szcandlist );//選字表整理成串

break;

case imn_closecandidate://關閉選字表

if( g_lpcandlist )

//釋放

g_szcandlist[ 0 ] = 0;

break;

}return true;//總是返回true,防止ime視窗開啟

}bool cime::onwm_ime_***position( hwnd hwnd, lparam lparam ) //輸入改變

//取得sz***pstr

if( lparam & gcs_***preadstr )

//取得sz***preadstr

if( lparam & gcs_cursorpos )

//取得nimecursor

if( lparam & gcs_resultstr )

immreleasecontext( hwnd, himc );

return true;//總是返回true,防止ime視窗開啟

}char* cime::getimename()

bool cime::ifimesharp() //是否全形

bool cime::ifimesymbol() //是否中文標點

void cime::getimeinput( char **psz***pstr, char **psz***preadstr, int *pnimecursor, char **pszcandlist )

//由於微軟拼音實現了很多自己的東西,cime和它的相容性有些問題

//1、在函式convertcandlist中所說的選字表的問題

//2、函式getimeinput返回的sz***preadstr顯然經過了加工而不是最初的鍵盤輸入

//   它的每個可組合的輸入佔以空格補足的8byte,且新的不可組合的輸入存為0xa1

//   我們可以在輸入法名字中有子串"微軟拼音"時,只顯示末尾的一組8byte,如果有0xa1就什麼都不顯示,也可以直接用textout顯示所有的

Qt5 8 0遇到的乙個中文亂碼問題

維護公司 時看到乙個工具出現了如下的亂碼 於是開始檢查 藉此機會理了一遍char qstring gb18030 utf8之間的關係。這裡出現亂碼的原因是 由sdk介面得到乙個包含中文的char字串 char byname name len 這個字串儲存的中文為gb18030格式儲存,對於qt5.8...

給ThinkSNS擴充套件了乙個中文擷取字串的操作

中文擷取,單位元組擷取模式 param string str 需要擷取的字串 param int slen 擷取字串長度 return string restr 返回的字串長度 function cn substr str,slen,startdd 0 restr c str len strlen ...

Oracle乙個中文漢字占用幾個位元組

oracle 乙個中文漢字 占用幾個位元組,要根據oracle中字符集編碼決定 檢視oracle server端字符集 select userenv language from dual 如果顯示如下,乙個漢字占用兩個位元組 simplified chinese china.zhs16gbk 如果顯...