|
| |
精品推荐 |
 |
|
| |
|
|
|
|
在WinCE程序开发中使用软件输入面板
|
日期:2008年6月3日 作者: 查看:[大字体
中字体 小字体]
|
简介
软件输入面板(Software Input Panel,简称SIP)是每个装备了WinCE系统的移动平台的一个基本功能。它提供给用户在PDA上进行数据输入的一种手段。当谈及SIP的时候,我们一般会想到两点:一是SIP本身,二是如何在程序中使用SIP。
SIP是一个实现了IInputMethod或者IInputMethod2接口的COM对象。它应该被系统调入使用,所以你不能在C#中进行SIP开发。C或者C++是很好的开发语言。因为SIP本身也只是另外一个COM对象,ATL使得开发过程变得极为简单。这里我不想讨论SIP开发,SDK包里包含了一个很好的例程ATLDvoraksip,所以你可以去学习这个例程以获取更多的信息。 这里我想讨论的是如何在你自己的程序里管理SIP。这看起来很琐碎简单,但是如果因为屏幕不太够用,而你又想使得你的程序更加聪明更加方便用户使用,那SIP的管理就变成很重要的一个方面了。另外,如果你开发了很多用于不同场合的SIP(比如多语言,数字或者其他等等),你可能想在某个场合使用某个特定的SIP。这种能力使得你可以完成很多不同的任务:当用户只需要进行数字输入的时候,你可以展示一个大的数字键盘,这样他不用笔而只需要用手指就可以输入了。当然你也可以有自己的想法,这就看程序员该作些什么了。
Win32 API
SIP的API函数很简单,从sipapi.h中只可以看到只有极少几个函数:
DWORD WINAPI SipStatus(); BOOL WINAPI SipSetDefaultRect(RECT *); BOOL WINAPI SipRegisterNotification(HWND); BOOL WINAPI SipShowIM(DWORD); BOOL WINAPI SipGetInfo(SIPINFO *); BOOL WINAPI SipSetInfo(SIPINFO *); int WINAPI SipEnumIM(IMENUMPROC); BOOL WINAPI SipGetCurrentIM(CLSID *); BOOL WINAPI SipSetCurrentIM(CLSID *); 我把这些放在开始,是因为它同时支持Windows Mobile和CE.NET平台。如果你对Windows Mobile设备编程,那么aygshell.h文件提供给你更多的和SIP有关的函数供使用。当然选择哪个来使用就依赖于你自己的需求了,使用Windows Mobile上的SIP会使得工作更加完美一些。如果你使用了相同的OS版本,但是不同的build版本的时候,你可能会获得稍微不同的SIP行为。所以,一种方法并不一定像你所想的那样在所有的PDA上都会适用。
列举可用的SIP
第一步就是了解如何列举所有可用的SIP。可以使用如下的代码:
CTypedPtrMap<CMapStringToPtr,CString,CLSID*> g_SipMap;
int SipEnumIMProc(IMENUMINFO *pIMInfo) { CLSID* pCLSID = new CLSID; memcpy(pCLSID,&pIMInfo->clsid,sizeof(CLSID)); g_SipMap.SetAt(CString(pIMInfo->szName),pCLSID);
TRACE(_T("%sn"),CString(pIMInfo->szName));
return 1; }
void CSIPDemoDlg::OnButtonEnum() { SipEnumIM(SipEnumIMProc);
CString sSipName; CLSID *pCLSID = NULL; for (POSITION pos = g_SipMap.GetStartPosition(); pos; ) { g_SipMap.GetNextAssoc(pos,sSipName,pCLSID); m_SipList.AddString(sSipName); } } 代码所作的就是填充一个全局的map,它包含了"SIP名"/CLSID对。这个例子和其他的都用到了MFC,当然你也可以使用熟悉的Win32 API或者其他的框架。以下是我的Dell Axim x50上的显示效果:
如何选择,显示和隐藏特定的SIP
当你知道某个SIP的CLSID,你可以选择它。同时,当前选择的SIP也可以被获得:
void CSIPDemoDlg::OnButtonEnum() { SipEnumIM(SipEnumIMProc);
CLSID CurrSip; SipGetCurrentIM(&CurrSip);
int nCurrSip = LB_ERR, nSipCount = 0; CString sSipName, sCurrSipName; CLSID *pCLSID = NULL; for (POSITION pos = g_SipMap.GetStartPosition(); pos; )
上一篇:编程语言的昨天、今天和明天
下一篇:小组开发环境搭建(五)
|
| 相关文章: |
|
|
|
| 相关软件: |
|
|
|
|