中文輸入的類的實現

2022-04-12 10:07:30 字數 4014 閱讀 2050

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

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

#pragma comment

( lib,

"imm32.lib"

)#include h>

#include h>

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

**pszcompstr,

char

**pszcompreadstr, int *pnimecursor,

char

**pszcandlist );/

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

//在pszcompstr中返回轉換後的串

//在pszcompreadstr中返回鍵盤直接輸入的串

//在pnimecursor中返回szcompstr的游標位置

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

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

bool onwm_inputlangchangerequest();

bool onwm_inputlangchange( hwnd hwnd )

;bool onwm_ime_setcontext(

)bool onwm_ime_startcomposition(

)bool onwm_ime_endcomposition(

)bool onwm_ime_notify( hwnd hwnd, wparam wparam )

;bool onwm_ime_composition( 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_composition( hwnd hwnd, lparam lparam )

//輸入改變

//取得szcompstr

if( lparam & gcs_compreadstr )

//取得szcompreadstr

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

**pszcompstr,

char

**pszcompreadstr, int *pnimecursor,

char

**pszcandlist )

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

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

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

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

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

js實現輸入長度的限制,相容中文輸入的辦法

我們在專案中,可能會經常遇到輸入框輸入漢字 字母 符號等混合內容,並要對內容進行長度限制的需求.很多朋友喜歡直接對拿到的輸入的value進行長度限制,但是實際做過的朋友可能都會遇到問題,當輸入中文 日文這種需要多個字母拼成乙個文字的語言時,往往文字沒有輸入完成,拼寫的文字就已經超出長度的限制了.從而...

乙個中文輸入的類

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

如何實現在cmd輸入中文

最近幾天在用cmd學習mysql,遇到了在cmd下不能輸入中文的問題,嘗試過複製貼上的方式,但是在後來使用建立的表的時候,原來複製貼上上的中文就會顯示為 亂碼,所以最好還是通過直接輸入中文的方式。想要在cmd中可以輸入中文,可以通過ctrl space 空格鍵 ctrl shift alt shif...