不想讓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...