CIMESoftKbd.cpp
上传用户:st_laser
上传日期:2010-04-11
资源大小:5k
文件大小:19k
源码类别:

输入法编程

开发平台:

C++ Builder

  1. /*
  2. * author : yuchifang
  3. * email : renzhongfang@nju.org.cn
  4. */
  5. #pragma warning(disable:4786)
  6. #include "CIMEDebug.h"
  7. #include "CIMESoftKbd.h"
  8. #include "CIMEUIStatus.h"
  9. #include "CIMEUtils.h"
  10. //////////////////////////////////////////////////////////////////////////
  11. //
  12. // CIMESoftKbdTab Implementations
  13. //
  14. //////////////////////////////////////////////////////////////////////////
  15. CIMESkbTab::CIMESkbTab(const TCHAR keys[], const TCHAR shiftKeys[], LPCTSTR name)
  16. {
  17. for (int i=0; i<SOFT_KEY_COUNT; i++)
  18. {
  19. tab[i] = keys[i];
  20. shiftTab[i] = shiftKeys[i];
  21. }
  22. _tcsncpy(this->name, name, 10);
  23. this->name[9] = _T('');
  24. }
  25. CIMESkbTab::CIMESkbTab(const CIMESkbTab &skb)
  26. {
  27. for (int i=0; i<SOFT_KEY_COUNT; i++)
  28. {
  29. tab[i] = skb.tab[i];
  30. shiftTab[i] = skb.shiftTab[i];
  31. }
  32. _tcscpy(name, skb.name);
  33. }
  34. TCHAR CIMESkbTab::GetChar(int index)
  35. {
  36. assert(index>=0 && index <SOFT_KEY_COUNT);
  37. return tab[index];
  38. }
  39. TCHAR CIMESkbTab::GetShiftChar(int index)
  40. {
  41. assert(index>=0 && index <SOFT_KEY_COUNT);
  42. return shiftTab[index];
  43. }
  44. TCHAR CIMESkbTab::ConvVKey2SKBChar(UINT vKey, bool bShift)
  45. {
  46. /*
  47. vKey的内容分配:
  48. 键盘上的位置 0-9 a-z ;   =   ,   -   .   /   `   [      ]   '
  49. 对应的vKey位置 48-57 65-90 186 187 188 189 190 191 192 219 220 221 222
  50.  */
  51. int pos = -1;
  52. if (vKey >= 48 && vKey <=57)
  53. pos = vKey - 48;
  54. else if (vKey >= 65 && vKey <=90)
  55. pos = vKey - 65 + 10; //10为前面10个数字位置
  56. else if (vKey >= 186 && vKey <=192)
  57. pos = vKey - 186 + 10 + 26; //26为26字母占的位置
  58. else if (vKey >= 219 && vKey <= 222)
  59. pos = vKey - 219 + 10 + 26 + 7; //7为前面七个;=,-./`占的位置
  60. if (pos == -1) return L'';
  61. TCHAR ch = bShift ? shiftTab[pos] : tab[pos];
  62. if (ch == L' ')
  63. return L'';
  64. return ch;
  65. }
  66. //////////////////////////////////////////////////////////////////////////
  67. //
  68. // CIMESoftKbd Implementations
  69. //
  70. //////////////////////////////////////////////////////////////////////////
  71. CIMESoftKbd::CIMESoftKbd()
  72. {
  73. CIMEDebug::DebugLog(L"CIMESoftKbd::CIMESoftKbd()");
  74. TCHAR tabNames[][10] = 
  75. {
  76. L"常用符号",
  77. L"标点符号",
  78. L"特殊符号",
  79. L"表格线",
  80. L"数字序号",
  81. L"数学符号",
  82. L"单位符号",
  83. L"拼音符号",
  84. L"注音符号",
  85. L"日文平假名",
  86. L"日文片假名",
  87. L"希腊字母",
  88. L"俄文字母",
  89. };
  90. WORD wSoftKBDDatas[][2][SOFT_KEY_COUNT] =
  91. {
  92. /*
  93. {//正常的键盘
  94. {
  95. '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  96. 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
  97. 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
  98. 'u', 'v', 'w', 'x', 'y', 'z', ';', '=', ',', '-',
  99. '.', '/', '`', '[', '\', ']', '''
  100. },
  101. {
  102. ')', '!', '@', '#', '$', '%', '^', '&', '*', '(',
  103. 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
  104. 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
  105. 'U', 'V', 'W', 'X', 'Y', 'Z', ':', '+', '<', '_',
  106. '>', '?', '~', '{', '|', '}', '"'
  107. }
  108. },
  109. */
  110. {//#常用符号
  111. {//下档键(没按住shift)
  112. _T('⑽'), _T('⑴'), _T('⑵'), _T('⑶'), _T('⑷'), _T('⑸'), _T('⑹'), _T('⑺'), _T('⑻'), _T('⑼'),
  113. _T('■'), _T('α'), _T('∑'), _T('▲'), _T('⒊'), _T('●'), _T('★'), _T('【'), _T('⒏'), _T('】'),
  114. _T('『'), _T('‘'), _T('γ'), _T('β'), _T('⒐'), _T('⒑'), _T('⒈'), _T('⒋'), _T('◆'), _T('⒌'),
  115. _T('⒎'), _T('§'), _T('⒉'), _T('‰'), _T('⒍'), _T('$'), _T(';'), _T('='), _T(','), _T('-'),
  116. _T('。'), _T('/'), _T('`'), _T('['), _T('、'), _T(']'), _T('’')
  117. },
  118. {//下档键(按住shift)
  119. _T('㈩'), _T('㈠'), _T('㈡'), _T('㈢'), _T('㈣'), _T('㈤'), _T('㈥'), _T('㈦'), _T('㈧'), _T('㈨'),
  120. _T('□'), _T('±'), _T('∏'), _T('△'), _T('Ⅲ'), _T('○'), _T('☆'), _T('〖'), _T('Ⅷ'), _T('〗'),
  121. _T('』'), _T('“'), _T('÷'), _T('×'), _T('Ⅸ'), _T('Ⅹ'), _T('Ⅰ'), _T('Ⅳ'), _T('◇'), _T('Ⅴ'),
  122. _T('Ⅶ'), _T('※'), _T('Ⅱ'), _T('℃'), _T('Ⅵ'), _T('¥'), _T(':'), _T('+'), _T('《'), _T('_'),
  123. _T('》'), _T('?'), _T('~'), _T('{'), _T('?'), _T('}'), _T('”')
  124. }
  125. },
  126. {//#标点符号
  127. {//下档键(没按住shift)
  128. _T('ˉ'), _T(','), _T('、'), _T(';'), _T(':'), _T('?'), _T('!'), _T('…'), _T('—'), _T('·'),
  129. _T('〔'), _T('('), _T('【'), _T('〈'), _T('“'), _T('〉'), _T('《'), _T('》'), _T('∶'), _T('「'),
  130. _T('」'), _T('『'), _T('['), _T(')'), _T('"'), _T('''), _T('‘'), _T('”'), _T('〕'), _T('々'),
  131. _T('‖'), _T('】'), _T('’'), _T('〗'), _T('~'), _T('〖'), _T('』'), _T('¨'), _T(']'), _T('ˇ'),
  132. _T('{'), _T('}'), _T('。'), _T('`'), _T('〃'), _T('|'), _T('.')
  133. },
  134. {//下档键(按住shift)
  135. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  136. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  137. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  138. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  139. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  140. }
  141. },
  142. {//#特殊符号
  143. {//下档键(没按住shift)
  144. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  145. _T('■'), _T('^'), _T('@'), _T('▲'), _T('☆'), _T('※'), _T('→'), _T('←'), _T('◇'), _T('↑'),
  146. _T('↓'), _T('〓'), _T(' ̄'), _T('_'), _T('◆'), _T('□'), _T('§'), _T('★'), _T('△'), _T('○'),
  147. _T('◎'), _T('\'), _T('№'), _T('&'), _T('●'), _T('#'), _T(' '), _T(' '), _T(' '), _T(' '),
  148. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  149. },
  150. {//下档键(按住shift)
  151. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  152. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  153. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  154. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  155. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  156. }
  157. },
  158. {//#表格线
  159. {//下档键(没按住shift)
  160. _T('┄'), _T('┍'), _T('┎'), _T('┏'), _T('┐'), _T('┑'), _T('┒'), _T('┓'), _T(' '), _T('─'),
  161. _T('┬'), _T('╀'), _T('┾'), _T('┮'), _T('┞'), _T('┯'), _T('┰'), _T('┱'), _T('┣'), _T('┲'),
  162. _T('┳'), _T(' '), _T('╂'), _T('╁'), _T(' '), _T('│'), _T('├'), _T('┟'), _T('┭'), _T('┠'),
  163. _T('┢'), _T('┿'), _T('┝'), _T('┽'), _T('┡'), _T('┼'), _T(' '), _T(' '), _T('╃'), _T('┈'),
  164. _T(' '), _T(' '), _T('┌'), _T('┆'), _T(' '), _T('┊'), _T(' ')
  165. },
  166. {//下档键(按住shift)
  167. _T('┅'), _T('┕'), _T('┖'), _T('┗'), _T('┘'), _T('┙'), _T('┚'), _T('┛'), _T(' '), _T('━'),
  168. _T('┴'), _T('╈'), _T('┶'), _T('┶'), _T('┦'), _T('┷'), _T('┸'), _T('┹'), _T('┫'), _T('┺'),
  169. _T('┻'), _T(' '), _T('╊'), _T('╉'), _T(' '), _T('┃'), _T('┤'), _T('┧'), _T('┵'), _T('┨'),
  170. _T('┪'), _T('╇'), _T('┥'), _T('╅'), _T('┩'), _T('╄'), _T(' '), _T(' '), _T('╋'), _T('┉'),
  171. _T(' '), _T(' '), _T('└'), _T('┇'), _T(' '), _T('┋'), _T(' ')
  172. }
  173. },
  174. {//#数字序号
  175. {//下档键(没按住shift)
  176. _T('Ⅺ'), _T('Ⅱ'), _T('Ⅲ'), _T('Ⅳ'), _T('Ⅴ'), _T('Ⅵ'), _T('Ⅶ'), _T('Ⅷ'), _T('Ⅸ'), _T('Ⅹ'),
  177. _T('㈠'), _T('⑸'), _T('⑶'), _T('㈢'), _T('⒊'), _T('㈣'), _T('㈤'), _T('㈥'), _T('⒏'), _T('㈦'),
  178. _T('㈧'), _T('㈨'), _T('⑺'), _T('⑹'), _T('⒐'), _T('⒑'), _T('⒈'), _T('⒋'), _T('㈡'), _T('⒌'),
  179. _T('⒎'), _T('⑷'), _T('⒉'), _T('⑵'), _T('⒍'), _T('⑴'), _T('㈩'), _T(' '), _T('⑻'), _T('Ⅻ'),
  180. _T('⑼'), _T('⑽'), _T('Ⅰ'), _T(' '), _T(' '), _T(' '), _T(' ')
  181. },
  182. {//下档键(按住shift)
  183. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  184. _T('①'), _T('⒂'), _T('⒀'), _T('③'), _T('⒔'), _T('④'), _T('⑤'), _T('⑥'), _T('⒙'), _T('⑦'),
  185. _T('⑧'), _T('⑨'), _T('⒄'), _T('⒃'), _T('⒚'), _T('⒛'), _T('⒒'), _T('⒕'), _T('②'), _T('⒖'),
  186. _T('⒘'), _T('⒁'), _T('⒓'), _T('⑿'), _T('⒗'), _T('⑾'), _T('⑩'), _T(' '),     _T('⒅'), _T(' '),
  187. _T('⒆'), _T('⒇'), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  188. }
  189. },
  190. {//#数学符号
  191. {//下档键(没按住shift)
  192. _T(' '), _T('≡'), _T('≠'), _T('='), _T('≤'), _T('≥'), _T('<'), _T('>'), _T('≮'), _T('≯'),
  193. _T('∧'), _T('⊙'), _T('∠'), _T('∑'), _T('-'), _T('∏'), _T('∪'), _T('∩'), _T('∫'), _T('∈'),
  194. _T(' '), _T('∵'), _T('∽'), _T('≌'), _T('∮'), _T('∝'), _T('±'), _T('×'), _T('∨'), _T('÷'),
  195. _T(' '), _T('⌒'), _T('+'), _T('∥'), _T('/'), _T('⊥'), _T('∴'), _T(' '), _T(' '), _T('∷'),
  196. _T('√'), _T(' '), _T('≈'), _T('∞'), _T(' '), _T(' '), _T(' ')
  197. },
  198. {//下档键(按住shift)
  199. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  200. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  201. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  202. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  203. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  204. }
  205. },
  206. {//#单位符号
  207. {//下档键(没按住shift)
  208. _T('¤'), _T('°'), _T('′'), _T('″'), _T('$'), _T('£'), _T('¥'), _T('‰'), _T('%'), _T('℃'),
  209. _T('百'), _T(' '), _T('毫'), _T('万'), _T('二'), _T('亿'), _T('兆'), _T('吉'), _T('七'), _T('太'),
  210. _T('拍'), _T('艾'), _T(' '), _T(' '), _T('八'), _T('九'), _T('○'), _T('三'), _T('千'), _T('四'),
  211. _T('六'), _T('微'), _T('一'), _T('厘'), _T('五'), _T('分'), _T(' '), _T(' '), _T(' '), _T('¢'),
  212. _T(' '), _T(' '), _T(' '), _T('十'), _T(' '), _T(' '), _T(' ')
  213. },
  214. {//下档键(按住shift)
  215. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  216. _T('佰'), _T(' '), _T(' '), _T(' '), _T('贰'), _T(' '), _T(' '), _T(' '), _T('柒'), _T(' '),
  217. _T(' '), _T(' '), _T(' '), _T(' '), _T('捌'), _T('玖'), _T('零'), _T('叁'), _T('仟'), _T('肆'),
  218. _T('陆'), _T(' '), _T('壹'), _T(' '), _T('伍'), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  219. _T(' '), _T(' '), _T(' '), _T('拾'), _T(' '), _T(' '), _T(' ')
  220. }
  221. },
  222. {//#拼音符号
  223. {//下档键(没按住shift)
  224. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  225. _T('ē') , _T(' '), _T('ǔ') , _T('ě') , _T('ǎ') , _T('è') , _T(' '), _T('ī') , _T('ǒ') , _T('í') ,
  226. _T('ǐ') , _T('ì') , _T('ǘ') , _T('ǖ') , _T('ò') , _T(' '), _T('ā') , _T('à') , _T('é') , _T(' '),
  227. _T('ó') , _T('ù') , _T('á') , _T('ú') , _T('ō') , _T('ū') , _T(' '), _T(' '), _T('ǚ') , _T(' '),
  228. _T('ǜ') , _T('ü') , _T(' '), _T('ê') , _T(' '), _T(' '), _T(' ')
  229. },
  230. {//下档键(按住shift)
  231. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  232. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  233. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  234. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  235. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  236. }
  237. },
  238. {//#注音符号
  239. {//下档键(没按住shift)
  240. _T('ㄦ'), _T('ㄉ'), _T(' '), _T(' '), _T('ㄓ'), _T(' '), _T(' '), _T('ㄚ'), _T('ㄞ'), _T('ㄢ'),
  241. _T('ㄇ'), _T('ㄖ'), _T('ㄏ'), _T('ㄎ'), _T('ㄍ'), _T('ㄑ'), _T('ㄕ'), _T('ㄘ'), _T('ㄛ'), _T('ㄨ'),
  242. _T('ㄜ'), _T('ㄠ'), _T('ㄩ'), _T('ㄙ'), _T('ㄟ'), _T('ㄣ'), _T('ㄆ'), _T('ㄐ'), _T('ㄋ'), _T('ㄔ'),
  243. _T('ㄧ'), _T('ㄒ'), _T('ㄊ'), _T(' '), _T('ㄗ'), _T('ㄈ'), _T('ㄤ'), _T(' '), _T('ㄝ'), _T(' '),
  244. _T('ㄡ'), _T('ㄥ'), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  245. },
  246. {//下档键(按住shift)
  247. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  248. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  249. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  250. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  251. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  252. }
  253. },
  254. {//#日文平假名
  255. {//下档键(没按住shift)
  256. _T(' '), _T('ぃ'), _T('ぅ'), _T('ぇ'), _T('ぉ'), _T('か'), _T('き'), _T('く'), _T('け'), _T('こ'),
  257. _T('な'), _T('も'), _T('む'), _T('ぬ'), _T('す'), _T('ね'), _T('の'), _T('は'), _T('つ'), _T('ひ'),
  258. _T('ふ'), _T('へ'), _T('ゅ'), _T('ゃ'), _T('っ'), _T('て'), _T('さ'), _T('せ'), _T('に'), _T('そ'),
  259. _T('ち'), _T('め'), _T('し'), _T('み'), _T('た'), _T('ま'), _T('ほ'), _T(' '), _T('ょ'), _T('ん'),
  260. _T('ゎ'), _T('を'), _T('ぁ'), _T('と'), _T(' '), _T('ゐ'), _T('ゑ')
  261. },
  262. {//下档键(按住shift)
  263. _T(' '), _T('い'), _T('う'), _T('え'), _T('お'), _T('が'), _T('ぎ'), _T('ぐ'), _T('げ'), _T('ご'),
  264. _T('ぱ'), _T('ろ'), _T('る'), _T('ぷ'), _T('ず'), _T('ぺ'), _T('ぽ'), _T('ば'), _T('づ'), _T('び'),
  265. _T('ぶ'), _T('べ'), _T('ゆ'), _T('や'), _T(' '), _T('で'), _T('ざ'), _T('ぜ'), _T('ぴ'), _T('ぞ'),
  266. _T('ぢ'), _T('れ'), _T('じ'), _T('り'), _T('だ'), _T('ら'), _T('ぼ'), _T(' '), _T('よ'), _T(' '),
  267. _T('わ'), _T(' '), _T('あ'), _T('ど'), _T(' '), _T(' '), _T(' ')
  268. }
  269. },
  270. {//#日文片假名
  271. {//下档键(没按住shift)
  272. _T('ケ'), _T('ィ'), _T('ゥ'), _T('ヴ'), _T('ェ'), _T('ォ'), _T('カ'), _T('ヵ'), _T('キ'), _T('ク'),
  273. _T('ナ'), _T('モ'), _T('ム'), _T('ヌ'), _T('ス'), _T('ネ'), _T('ノ'), _T('ハ'), _T('ツ'), _T('ヒ'),
  274. _T('フ'), _T('ヘ'), _T('ュ'), _T('ャ'), _T('ッ'), _T('テ'), _T('サ'), _T('セ'), _T('ニ'), _T('ソ'),
  275. _T('チ'), _T('メ'), _T('シ'), _T('ミ'), _T('タ'), _T('マ'), _T('ホ'), _T('コ'), _T('ョ'), _T('ヶ'),
  276. _T('ヮ'), _T('ヲ'), _T('ァ'), _T('ト'), _T('ン'), _T('ヰ'), _T('ヱ')
  277. },
  278. {//下档键(按住shift)
  279. _T('ゲ'), _T('イ'), _T('ウ'), _T(' '), _T('エ'), _T('オ'), _T('ガ'), _T(' '), _T('ギ'), _T('グ'),
  280. _T('パ'), _T('ロ'), _T('ル'), _T('プ'), _T('ズ'), _T('ペ'), _T('ポ'), _T('バ'), _T('ヅ'), _T('ビ'),
  281. _T('ブ'), _T('ベ'), _T('ユ'), _T('ヤ'), _T(' '), _T('デ'), _T('ザ'), _T('ゼ'), _T('ピ'), _T('ゾ'),
  282. _T('ヂ'), _T('レ'), _T('ジ'), _T('リ'), _T('ダ'), _T('ラ'), _T('ボ'), _T('ゴ'), _T('ヨ'), _T(' '),
  283. _T('ワ'), _T(' '), _T('ア'), _T('ド'), _T(' '), _T(' '), _T(' ')
  284. }
  285. },
  286. {//#希腊字母
  287. {//下档键(没按住shift)
  288. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  289. _T('κ'), _T('χ'), _T('υ'), _T('μ'), _T('γ'), _T('ν'), _T('ξ'), _T('ο'), _T('θ'), _T('π'),
  290. _T('ρ'), _T(' '), _T('ω'), _T('ψ'), _T('ι'), _T(' '), _T('α'), _T('δ'), _T('λ'), _T('ε'),
  291. _T('η'), _T('φ'), _T('β'), _T('τ'), _T('ζ'), _T('σ'), _T(' '), _T(' '), _T(' '), _T(' '),
  292. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  293. },
  294. {//下档键(按住shift)
  295. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  296. _T('Κ'), _T('Χ'), _T('Υ'), _T('Μ'), _T('Γ'), _T('Ν'), _T('Ξ'), _T('Ο'), _T('Θ'), _T('Π'),
  297. _T('Ρ'), _T(' '), _T('Ω'), _T('Ψ'), _T('Ι'), _T(' '), _T('Α'), _T('Δ'), _T('Λ'), _T('Ε'),
  298. _T('Η'), _T('Φ'), _T('Β'), _T('Τ'), _T('Ζ'), _T('Σ'), _T(' '), _T(' '), _T(' '), _T(' '),
  299. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' ')
  300. }
  301. },
  302. {//#俄文字母
  303. {//下档键(没按住shift)
  304. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  305. _T('л'), _T('ъ'), _T('ш'), _T('н'), _T('в'), _T('о'), _T('п'), _T('р'), _T('ж'), _T('с'),
  306. _T('т'), _T('у'), _T('ь'), _T('ы'), _T('з'), _T('и'), _T('а'), _T('г'), _T('м'), _T('д'),
  307. _T('ё'), _T('щ'), _T('б'), _T('ч'), _T('е'), _T('ц'), _T('ф'), _T(' '), _T('э'), _T(' '),
  308. _T('ю'), _T('я'), _T(' '), _T('й'), _T(' '), _T('к'), _T('х')
  309. },
  310. {//下档键(按住shift)
  311. _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
  312. _T('Л'), _T('Ъ'), _T('Ш'), _T('Н'), _T('В'), _T('О'), _T('П'), _T('Р'), _T('Ж'), _T('С'),
  313. _T('Т'), _T('У'), _T('Ь'), _T('Ы'), _T('З'), _T('И'), _T('А'), _T('Г'), _T('М'), _T('Д'),
  314. _T('Ё'), _T('Щ'), _T('Б'), _T('Ч'), _T('Е'), _T('Ц'), _T('Ф'), _T(' '), _T('Э'), _T(' '),
  315. _T('Ю'), _T('Я'), _T(' '), _T('Й'), _T(' '), _T('К'), _T('Х')
  316. }
  317. }
  318. };
  319. int size = sizeof(wSoftKBDDatas) / sizeof(TCHAR) / 2 / SOFT_KEY_COUNT;
  320. for (int i=0; i<size; i++)
  321. m_tabs.push_back(CIMESkbTab(wSoftKBDDatas[i][0], wSoftKBDDatas[i][1], tabNames[i]));
  322. m_bSkbOpened = false;
  323. m_tabIndex = 0;
  324. }
  325. void CIMESoftKbd::Show()
  326. {
  327. CIMEDebug::DebugLog(L"CIMESoftKbd::Show()");
  328. if (!m_bSkbOpened)
  329. {
  330. m_bSkbOpened = true;
  331. //显示软键盘
  332. RECT rc;
  333. int w;
  334. int h;
  335. int cx = GetSystemMetrics(SM_CXSCREEN);
  336. int cy = GetSystemMetrics(SM_CYSCREEN);
  337. m_hWndSkb = ImmCreateSoftKeyboard(SOFTKEYBOARD_TYPE_C1, FindWindow(CIMEUIStatus::GetUIClassName(), NULL), 0, 0);
  338. ImmShowSoftKeyboard(m_hWndSkb, SW_HIDE);
  339. GetWindowRect(m_hWndSkb, &rc);
  340. w = rc.right - rc.left;
  341. h = rc.bottom - rc.top;
  342. MoveWindow(m_hWndSkb, cx / 2, cy - 2*h, w, h, TRUE);
  343. ShowWindow(m_hWndSkb, SW_SHOWNOACTIVATE);
  344. }
  345. //更新软键盘布局
  346. SOFTKBDDATA sbd;
  347. int i;
  348. for (i=0; i<256; i++)
  349. {
  350. sbd.wCode[0][i] = _T(' ');
  351. sbd.wCode[1][i] = _T(' ');
  352. }
  353. CIMESkbTab &skbTab = m_tabs[m_tabIndex];
  354. /*
  355. vKey的内容分配:
  356. 键盘上的位置 0-9 a-z ;   =   ,   -   .   /   `   [      ]   '
  357. 对应的vKey位置 48-57 65-90 186 187 188 189 190 191 192 219 220 221 222
  358.  */
  359. int index2SoftKBDPos[SOFT_KEY_COUNT] = 
  360. {
  361. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, //'0'-'9'
  362. 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, //'a'-'j'
  363. 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, //'k'-'t'
  364. 85, 86, 87, 88, 89, 90, //'u'-'z'
  365. 186, 187, 188, 189, 190, // ; = , - .
  366. 191, 192, 219, 220, 221, 222 // / ` [  ] '
  367. };
  368. for (i=0; i<SOFT_KEY_COUNT; i++)
  369. {
  370. sbd.wCode[0][index2SoftKBDPos[i]] = skbTab.GetChar(i);
  371. sbd.wCode[1][index2SoftKBDPos[i]] = skbTab.GetShiftChar(i);
  372. }
  373. sbd.uCount = 2;
  374. SendMessage(m_hWndSkb, WM_IME_CONTROL, IMC_SETSOFTKBDDATA, (LPARAM)&sbd);
  375. CIMEDebug::DebugLog(L"Leaving CIMESoftKbd::Show() safely!");
  376. }
  377. void CIMESoftKbd::Hide()
  378. {
  379. if (!m_bSkbOpened) return;
  380. if(m_hWndSkb)
  381. {
  382. ImmDestroySoftKeyboard(m_hWndSkb);
  383. }
  384. m_bSkbOpened = false;
  385. }
  386. TCHAR CIMESoftKbd::GetSkbChar(UINT vk, bool bShift)
  387. {
  388. CIMEDebug::DebugLog(L"CIMESoftKbd::GetSkbChar");
  389. CIMEDebug::DebugLog(vk);
  390. return m_tabs[m_tabIndex].ConvVKey2SKBChar(vk, bShift);
  391. }