比这篇新的文章: 在新窗口运行HTML代码显示结果的脚本
比这篇旧的文章: Textarea的自动缩进以及Tab缩进支持

输入法的小键盘(软键盘)类

语言: C++, 标签: 键盘 输入法 2008/10/20发布 1年前更新
作者: 半瓶墨水, 点击1033次, 评论(0), 收藏者(0), , 打分:

背景
主题: 字体:
001 //这是以前写的输入法的小键盘(软键盘)类
002 //就是输入法输入特殊字符时用的那个小键盘
003 //比如搜狗输入法上的小键盘按钮按下之后,就会弹出一个小键盘
004 //
005 //注意:这是多个文件合在一起了,下载打包好的文件参见相关文章链接:
006 //    http://www.cnblogs.com/realfun/archive/2005/03/28/127174.html
007
008 ////////////////////////////////////////////////
009 //
010 //      CIMESoftKbd.h
011
012 /*
013 * author : yuchifang(realfun)
014 * email : realfun at gmail dot com
015 */
016
017 #ifndef _IME_SOFTKBD_H_
018 #define _IME_SOFTKBD_H_
019
020 #include
021 #include
022 #include
023 #include
024 using namespace std;
025
026 const SOFT_KEY_COUNT = 47;
027
028 //表示一个软键盘布局
029 class CIMESkbTab
030 {
031 public:
032     CIMESkbTab(const TCHAR keys[], const TCHAR shiftKeys[], LPCTSTR name);
033     CIMESkbTab(const CIMESkbTab &skb);
034     TCHAR GetChar(int index);
035     TCHAR GetShiftChar(int index);
036     //转换键盘按键到软键盘字符,不存在则返回0
037     TCHAR ConvVKey2SKBChar(UINT vKey, bool bShift);
038     //获取tab名称
039     void GetName(TCHAR name[]) { _tcscpy(name, this->name); }
040 private:
041     TCHAR tab[SOFT_KEY_COUNT];  //软键盘布局
042     TCHAR shiftTab[SOFT_KEY_COUNT];  //Shift后的软键盘布局
043     TCHAR name[10];  //软键盘布局名称
044 };
045
046 //该类封装了软键盘操作
047 class CIMESoftKbd
048 {
049 public:
050     CIMESoftKbd();
051
052     //显示下一个软键盘布局
053     void ShowNext()
054     {
055         m_tabIndex = (m_tabIndex + 1) % m_tabs.size();
056         Show();
057     }
058
059     //显示前一个软键盘布局
060     void ShowPrev()
061     {
062         m_tabIndex = (m_tabIndex + m_tabs.size() - 1) % m_tabs.size();
063         Show();
064     }
065
066     //显示指定位置的软键盘布局
067     void ShowAtPos(int index)
068     {
069         m_tabIndex = abs(index) % m_tabs.size();
070         Show();
071     }
072
073     //显示并更新软键盘
074     void Show();
075
076     //隐藏软键盘
077     void Hide();
078
079     //判断软键盘是否打开
080     bool IsOpen() { return m_bSkbOpened; }
081
082     //转换键盘按键字符到软键盘字符
083     TCHAR GetSkbChar(UINT vk, bool bShift);
084
085     int GetCurrIndex() const { return m_tabIndex; }
086
087 private:
088     bool m_bSkbOpened;  //软键盘是否打开
089     int m_tabIndex;  //当前的软键盘编号
090     vector m_tabs; //存储所有软键盘布局信息
091     HWND m_hWndSkb;  //软键盘窗口句柄
092 };
093
094 #endif//_IME_SOFTKBD_H_
095
096 ////////////////////////////////////////////////
097 //
098 //      CIMESoftKbd.cpp
099
100 /*
101 * author : yuchifang(realfun)
102 * email : realfun at gmail dot com
103 */
104
105 #pragma warning(disable:4786)
106 #include "CIMEDebug.h"
107 #include "CIMESoftKbd.h"
108 #include "CIMEUIStatus.h"
109 #include "CIMEUtils.h"
110
111 //
112 // CIMESoftKbdTab Implementations
113 //
114
115 CIMESkbTab::CIMESkbTab(const TCHAR keys[], const TCHAR shiftKeys[], LPCTSTR name)
116 {
117     for (int i=0; i<SOFT_KEY_COUNT; i++)
118     {
119         tab[i] = keys[i];
120         shiftTab[i] = shiftKeys[i];
121     }
122
123     _tcsncpy(this->name, name, 10);
124     this->name[9] = _T('\0');
125 }
126
127 CIMESkbTab::CIMESkbTab(const CIMESkbTab &skb)
128 {
129     for (int i=0; i<SOFT_KEY_COUNT; i++)
130     {
131         tab[i] = skb.tab[i];
132         shiftTab[i] = skb.shiftTab[i];
133     }
134     _tcscpy(name, skb.name);
135 }
136
137 TCHAR CIMESkbTab::GetChar(int index)
138 {
139     assert(index>=0 && index <SOFT_KEY_COUNT);
140     return tab[index];
141 }
142
143 TCHAR CIMESkbTab::GetShiftChar(int index)
144 {
145     assert(index>=0 && index <SOFT_KEY_COUNT);
146     return shiftTab[index];
147 }
148
149 TCHAR CIMESkbTab::ConvVKey2SKBChar(UINT vKey, bool bShift)
150 {
151     /*
152     vKey的内容分配:
153     键盘上的位置 0-9  a-z  ;   =   ,   -   .   /   `   [   \   ]   '
154     对应的vKey位置 48-57 65-90 186 187 188 189 190 191 192 219 220 221 222
155     */
156
157     int pos = -1;
158     if (vKey >= 48 && vKey <=57)
159         pos = vKey - 48;
160     else if (vKey >= 65 && vKey <=90)
161         pos = vKey - 65 + 10; //10为前面10个数字位置
162     else if (vKey >= 186 && vKey <=192)
163         pos = vKey - 186 + 10 + 26; //26为26字母占的位置
164     else if (vKey >= 219 && vKey <= 222)
165         pos = vKey - 219 + 10 + 26 + 7; //7为前面七个;=,-./`占的位置
166
167     if (pos == -1) return L'\0';
168     TCHAR ch = bShift ? shiftTab[pos] : tab[pos];
169     if (ch == L' ')
170         return L'\0';
171     return ch;
172 }
173
174
175 //
176 // CIMESoftKbd Implementations
177 //
178
179 CIMESoftKbd::CIMESoftKbd()
180 {
181     CIMEDebug::DebugLog(L"CIMESoftKbd::CIMESoftKbd()");
182
183     TCHAR tabNames[][10] =
184     {
185         L"常用符号", L"标点符号", L"特殊符号", L"表格线",
186         L"数字序号", L"数学符号", L"单位符号", L"拼音符号",
187         L"注音符号", L"日文平假名", L"日文片假名", L"希腊字母",
188         L"俄文字母",
189     };
190
191     WORD wSoftKBDDatas[][2][SOFT_KEY_COUNT] =
192     {
193         /*
194         {//正常的键盘
195         {
196         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
197         'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
198         'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
199         'u', 'v', 'w', 'x', 'y', 'z', ';', '=', ',', '-',
200         '.', '/', '`', '[', '\\', ']', '\''
201         },
202         {
203         ')', '!', '@', '#', '$', '%', '^', '&', '*', '(',
204         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
205         'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
206         'U', 'V', 'W', 'X', 'Y', 'Z', ':', '+', '<', '_',
207         '>', '?', '~', '{', '|', '}', '"'
208         }
209         },
210         */
211
212         {//#常用符号
213             {//下档键(没按住shift)
214                 L'⑽', L'⑴', L'⑵', L'⑶', L'⑷', L'⑸', L'⑹', L'⑺', L'⑻', L'⑼',
215                     L'■', L'α', L'∑', L'▲', L'⒊', L'●', L'★', L'【', L'⒏', L'】',
216                     L'『', L'‘', L'γ', L'β', L'⒐', L'⒑', L'⒈', L'⒋', L'◆', L'⒌',
217                     L'⒎', L'§', L'⒉', L'‰', L'⒍', L'$', L';', L'=', L',', L'-',
218                     L'。', L'/', L'`', L'[', L'、', L']', L'’'
219             },
220             {//下档键(按住shift)
221                 L'㈩', L'㈠', L'㈡', L'㈢', L'㈣', L'㈤', L'㈥', L'㈦', L'㈧', L'㈨',
222                     L'□', L'±', L'∏', L'△', L'Ⅲ', L'○', L'☆', L'〖', L'Ⅷ', L'〗',
223                     L'』', L'“', L'÷', L'×', L'Ⅸ', L'Ⅹ', L'Ⅰ', L'Ⅳ', L'◇', L'Ⅴ',
224                     L'Ⅶ', L'※', L'Ⅱ', L'℃', L'Ⅵ', L'¥', L':', L'+', L'《', L'_',
225                     L'》', L'?', L'~', L'{', L'?', L'}', L'”'
226                 }
227         },
228             //下同,略过了
229     };
230
231     int size = sizeof(wSoftKBDDatas) / sizeof(TCHAR) / 2 / SOFT_KEY_COUNT;
232     for (int i=0; i<size; i++)
233         m_tabs.push_back(CIMESkbTab(wSoftKBDDatas[i][0], wSoftKBDDatas[i][1], tabNames[i]));
234     m_bSkbOpened = false;
235     m_tabIndex = 0;
236 }
237
238 void CIMESoftKbd::Show()
239 {
240     CIMEDebug::DebugLog(L"CIMESoftKbd::Show()");
241
242     if (!m_bSkbOpened)
243     {
244         m_bSkbOpened = true;
245         //显示软键盘
246         RECT rc;
247         int w;
248         int h;
249         int cx = GetSystemMetrics(SM_CXSCREEN);
250         int cy = GetSystemMetrics(SM_CYSCREEN);
251         m_hWndSkb = ImmCreateSoftKeyboard(SOFTKEYBOARD_TYPE_C1, FindWindow(CIMEUIStatus::GetUIClassName(), NULL), 0, 0);
252         ImmShowSoftKeyboard(m_hWndSkb, SW_HIDE);
253         GetWindowRect(m_hWndSkb, &rc);
254         w = rc.right - rc.left;
255         h = rc.bottom - rc.top;
256         MoveWindow(m_hWndSkb, cx / 2, cy - 2*h, w, h, TRUE);
257         ShowWindow(m_hWndSkb, SW_SHOWNOACTIVATE);
258     }
259
260     //更新软键盘布局
261     SOFTKBDDATA sbd;
262     int i;
263     for (i=0; i<256; i++)
264     {
265         sbd.wCode[0][i] = _T(' ');
266         sbd.wCode[1][i] = _T(' ');
267     }
268     CIMESkbTab &skbTab = m_tabs[m_tabIndex];
269
270     /*
271     vKey的内容分配:
272     键盘上的位置 0-9  a-z  ;   =   ,   -   .   /   `   [   \   ]   '
273     对应的vKey位置 48-57 65-90 186 187 188 189 190 191 192 219 220 221 222
274     */
275     int index2SoftKBDPos[SOFT_KEY_COUNT] =
276     {
277         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, //'0'-'9'
278         65, 66, 67, 68, 69, 70, 71, 72, 73, 74, //'a'-'j'
279         75, 76, 77, 78, 79, 80, 81, 82, 83, 84, //'k'-'t'
280         85, 86, 87, 88, 89, 90,     //'u'-'z'
281         186, 187, 188, 189, 190,    // ; = , - .
282         191, 192, 219, 220, 221, 222   // / ` [ \ ] '
283     };
284
285     for (i=0; i<SOFT_KEY_COUNT; i++)
286     {
287         sbd.wCode[0][index2SoftKBDPos[i]] = skbTab.GetChar(i);
288         sbd.wCode[1][index2SoftKBDPos[i]] = skbTab.GetShiftChar(i);
289     }
290
291     sbd.uCount = 2;
292     SendMessage(m_hWndSkb, WM_IME_CONTROL, IMC_SETSOFTKBDDATA, (LPARAM)&sbd);
293     CIMEDebug::DebugLog(L"Leaving CIMESoftKbd::Show() safely!");
294 }
295
296 void CIMESoftKbd::Hide()
297 {
298     if (!m_bSkbOpened) return;
299
300     if(m_hWndSkb)
301     {
302         ImmDestroySoftKeyboard(m_hWndSkb);
303     }
304     m_bSkbOpened = false;
305 }
306
307 TCHAR CIMESoftKbd::GetSkbChar(UINT vk, bool bShift)
308 {
309     CIMEDebug::DebugLog(L"CIMESoftKbd::GetSkbChar");
310     CIMEDebug::DebugLog(vk);
311
312     return m_tabs[m_tabIndex].ConvVKey2SKBChar(vk, bShift);
313 }


所有评论,共0条:( 我也来说两句)


发表评论

注册登录后再发表评论