<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>VX Box &#187; 输入法</title>
	<atom:link href="http://www.evan129.com/tag/%e8%be%93%e5%85%a5%e6%b3%95/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.evan129.com</link>
	<description>Explorative Vision Abbreviated Nature</description>
	<lastBuildDate>Wed, 08 Sep 2010 06:55:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://www.evan129.com/wp-includes/js/jquery/jquery.js?ver=1.4.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>近期开发小结</title>
		<link>http://www.evan129.com/2010/05/27/summary-of-recently-development/</link>
		<comments>http://www.evan129.com/2010/05/27/summary-of-recently-development/#comments</comments>
		<pubDate>Thu, 27 May 2010 03:31:29 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Mobile platforms]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[Sync]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=773</guid>
		<description><![CDATA[maemo平台: 持续改进mscim。4月底5月初时n900在香港台湾上市，中文输入使用的是基于mscim的蒙恬输入法。 所以nokia台湾和蒙恬的人都有和我联系，关于一些bug的。 mscim为蒙恬修改恢复了若干快捷键，以使蒙恬的面板可以调用显示输入法选择菜单。同时明确延续scim的lgpl版权声明，以使蒙恬不需要开源其输入法模块。 同时因为有俄语用户反映俄语状态不能切输入法（因为俄语输入是不显示输入法面板的吧，所以点不了选择输入法的按钮），就加了shift+ctrl组合键进行输入法切换。 新引入mscim-chewing新酷音模块。当然这个还很不完善，另外，因为我也不会这输入法。。估计改进是有困难了 从ubuntu source上取了ttf-wqy-microhei的包，推进maemo extras-devel源了，用来替换里面的ttf-droid。droid字体不全，文泉驿的微米黑就是在droid字体上完善的。 另外看起来，仿照蒙恬的软键盘形式，在mscim上用helper做软键盘也是可行的，只是开发工作量颇大，并且因为早期就禁用掉了inline输入模式，用大键盘的话，会遮挡掉文字输入框，看起来应该也不爽。用小键盘，可能意义就小很多了。 android: 主要在研究android sync framework。往深处做，android还是有不少问题的。加入自己的sync account时，有supportsuploading选项。一般对于social network client就设成false，比如facebook什么的，这样其实相当于只读，就是把服务器上的好友加载到本地而已。但如果系统中只要有任意一个启用的支持supportsuploading的account的话，新增联系人时就完全不可能新增到你这个account名下，这对于想做同步的程序是不可行的。但如果把supportsuploading设为true呢，那其实问题就更大了，新增联系人时，如果选择建在这个account下，出来的editcontact的界面是只有选择头像和输入人名的框的，其它所有的比如填电话邮件这些的控件全部不会显示。 所以funambol出的android syncml client用了很直接了当的做法，自己做了个自己的editcontact的界面，只是每次新建联系人时，系统都会问你用哪个activity，这个观感不好。 而google accounts和exchange server account为什么能用呢？因为那是把两个package name写进了contacts应用程序的。实际上从代码上来看，google有在考虑为externalsource进行这些编辑控件的加载，但至少到2.1版本还是不可用的。 所以，如果不改contacts程序的code的话，你是做不了一个完善的类似google联系人同步这样的程序的。]]></description>
			<content:encoded><![CDATA[<p><strong>maemo平台:</strong><br />
持续改进mscim。4月底5月初时n900在香港台湾上市，中文输入使用的是基于mscim的蒙恬输入法。<br />
所以nokia台湾和蒙恬的人都有和我联系，关于一些bug的。<br />
mscim为蒙恬修改恢复了若干快捷键，以使蒙恬的面板可以调用显示输入法选择菜单。同时明确延续scim的lgpl版权声明，以使蒙恬不需要开源其输入法模块。</p>
<p>同时因为有俄语用户反映俄语状态不能切输入法（因为俄语输入是不显示输入法面板的吧，所以点不了选择输入法的按钮），就加了shift+ctrl组合键进行输入法切换。</p>
<p>新引入mscim-chewing新酷音模块。当然这个还很不完善，另外，因为我也不会这输入法。。估计改进是有困难了</p>
<p>从ubuntu source上取了ttf-wqy-microhei的包，推进maemo extras-devel源了，用来替换里面的ttf-droid。droid字体不全，文泉驿的微米黑就是在droid字体上完善的。</p>
<p>另外看起来，仿照蒙恬的软键盘形式，在mscim上用helper做软键盘也是可行的，只是开发工作量颇大，并且因为早期就禁用掉了inline输入模式，用大键盘的话，会遮挡掉文字输入框，看起来应该也不爽。用小键盘，可能意义就小很多了。</p>
<p><strong>android:</strong><br />
主要在研究android sync framework。往深处做，android还是有不少问题的。加入自己的sync account时，有supportsuploading选项。一般对于social network client就设成false，比如facebook什么的，这样其实相当于只读，就是把服务器上的好友加载到本地而已。但如果系统中只要有任意一个启用的支持supportsuploading的account的话，新增联系人时就完全不可能新增到你这个account名下，这对于想做同步的程序是不可行的。但如果把supportsuploading设为true呢，那其实问题就更大了，新增联系人时，如果选择建在这个account下，出来的editcontact的界面是只有选择头像和输入人名的框的，其它所有的比如填电话邮件这些的控件全部不会显示。<br />
所以funambol出的android syncml client用了很直接了当的做法，自己做了个自己的editcontact的界面，只是每次新建联系人时，系统都会问你用哪个activity，这个观感不好。<br />
而google accounts和exchange server account为什么能用呢？因为那是把两个package name写进了contacts应用程序的。实际上从代码上来看，google有在考虑为externalsource进行这些编辑控件的加载，但至少到2.1版本还是不可用的。<br />
所以，如果不改contacts程序的code的话，你是做不了一个完善的类似google联系人同步这样的程序的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2010/05/27/summary-of-recently-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>周记</title>
		<link>http://www.evan129.com/2010/03/19/%e5%91%a8%e8%ae%b0/</link>
		<comments>http://www.evan129.com/2010/03/19/%e5%91%a8%e8%ae%b0/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 14:07:13 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Diary]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[手机]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=766</guid>
		<description><![CDATA[工作上面比以前忙了些，由新来的以色列大妈管着了，反正事情就是多些了。 看联通号一直闲置浪费，也开始用了，换到了主力手机上。发现n900不支持动感地带的号码（或者只是不支持134这些新号段的），只好又用起了680。 装了下qt 4.7 的技术预览版，还有新的qt creator。我以前基本上没有接触过qt，也算试试看啦。qt安装需要自己编译，真是漫长。。 qt的几个demo都不错，尤其mobile-demo，我觉得效果很好，在mac上看起来效果也不错。 昨天才发现，n900上的qt程序里不支持用mscim输入。看了下changelog，mscim上次更新都是一个多月前了。这两天有点点小改动，主要是原来版本卸载后系统输入法好像还是不能用，修正了一下。还有几个码表名字改得好看了一点儿。我有想是不是把scim-qtimm的qt支持模块也移植上来，可是看起来可能也不是很容易的活。倒是him-scim这个项目人家做得好像也还可以，不知道是不是也把mscim换用him的前端呢。可是明明him前端也是gtk immodule而已，为什么它就支持在qt中的输入？我是有担心接下来换meego上，这些工作都白费啦。 最近半年多在跟的小说只有《凡人修仙传》了，之前跟的两本都完结了。 好像也没什么了？。。。 我决定每周至少更新一篇blog，不然每周都是自动twitter合集的文了。。。]]></description>
			<content:encoded><![CDATA[<p>工作上面比以前忙了些，由新来的以色列大妈管着了，反正事情就是多些了。</p>
<p>看联通号一直闲置浪费，也开始用了，换到了主力手机上。发现n900不支持动感地带的号码（或者只是不支持134这些新号段的），只好又用起了680。<br />
装了下qt 4.7 的技术预览版，还有新的qt creator。我以前基本上没有接触过qt，也算试试看啦。qt安装需要自己编译，真是漫长。。<br />
qt的几个demo都不错，尤其mobile-demo，我觉得效果很好，在mac上看起来效果也不错。</p>
<p>昨天才发现，n900上的qt程序里不支持用mscim输入。看了下changelog，mscim上次更新都是一个多月前了。这两天有点点小改动，主要是原来版本卸载后系统输入法好像还是不能用，修正了一下。还有几个码表名字改得好看了一点儿。我有想是不是把scim-qtimm的qt支持模块也移植上来，可是看起来可能也不是很容易的活。倒是him-scim这个项目人家做得好像也还可以，不知道是不是也把mscim换用him的前端呢。可是明明him前端也是gtk immodule而已，为什么它就支持在qt中的输入？我是有担心接下来换meego上，这些工作都白费啦。</p>
<p>最近半年多在跟的小说只有《凡人修仙传》了，之前跟的两本都完结了。</p>
<p>好像也没什么了？。。。 我决定每周至少更新一篇blog，不然每周都是自动twitter合集的文了。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2010/03/19/%e5%91%a8%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Build SCIM on Maemo5</title>
		<link>http://www.evan129.com/2009/12/04/build-scim-on-maemo5/</link>
		<comments>http://www.evan129.com/2009/12/04/build-scim-on-maemo5/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 09:01:36 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Maemo]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=690</guid>
		<description><![CDATA[maemocjk project has not been updated for a long time. there&#8217;s a scim for maemo sub-project in it, which i think is the most important part of maemocjk. i&#8217;ve tried to build it on maemo5 sdk beta1 and beta2, before. it would be compiled and built successfully on all of these sdk versions. but scim [...]]]></description>
			<content:encoded><![CDATA[<p><img  onclick="zoom(this,'http://www.evan129.com/wp-content/uploads/2009/12/scim_maemo5.png')" class="alignnone size-full wp-image-689" title="scim_maemo5" src="http://www.evan129.com/wp-content/uploads/2009/12/scim_maemo5.png" alt="scim_maemo5" width="640" /><br />
<a href="http://maemocjk.garage.maemo.org">maemocjk project</a> has not been updated for a long time. there&#8217;s a scim for maemo sub-project in it, which i think is the most important part of maemocjk. i&#8217;ve tried to build it on maemo5 sdk beta1 and beta2, before. it would be compiled and built successfully on all of these sdk versions. but scim could not be actived when i click into an editable text area. i&#8217;m not sure if it&#8217;s just the sdk bug.</p>
<p>anyway, when i try to build scim on maemo official sdk today, it works now, without any modification of the code. like before sdks, chinese character cannot be shown because the build-in font in the sdk doesn&#8217;t support cjk. i install <a href="http://www.tigert.com/2009/12/02/maemo-extras-packages-droid-fonts/">droid font</a> from maemo extra devel repository. as you can see, it works. though it&#8217;s not very good to use yet. it&#8217;s a good beginning, isn&#8217;t it?</p>
<p>there&#8217;re still lots of things need to do:</p>
<ol>
<li>the scim-setup application is not listed in the application panel</li>
<li>scim cannot be actived in the input field of web pages. in other words, it doesn&#8217;t work in the browser.</li>
<li>the front-end ui of scim is not working well. as you can see in the screen-shot, the character cannot displayed well in the scim drop down list. it&#8217;s just one of the easiest bug to fix. i guess just need to use correct font. other bugs like, the float window cannot be shown. i disabled it in scim-setup. if the float window is set to be shown, the whole scim cannot work. when i click into an input field, then scim  actives, and try to show its float window. the task switcher of maemo system will treat the float window as a new task window, and switch to that one. </li>
</ol>
<p>i will try to keep working on that..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/12/04/build-scim-on-maemo5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hildon input framework and plugins</title>
		<link>http://www.evan129.com/2009/12/04/hildon-input-framework-and-plugins/</link>
		<comments>http://www.evan129.com/2009/12/04/hildon-input-framework-and-plugins/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 18:35:34 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Maemo]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=685</guid>
		<description><![CDATA[啧啧，真是复杂的玩意儿。 半夜没事就看看这个东西，想想怎么让n900上有中文输入。他们提到的一个日本人在做的基于him plugin机制，加上ibus输入法引擎做后端的东西，我也google到了。 http://domaemon.blogspot.com/ 访问需要翻墙。看起来人家好像进展不错？我其实是很希望人家赶紧做好，那ibus支持的输入法应该就都支持了，比如中文。。 其实我对n900的sdk也不是很熟。n810时，我都编译了直接在真机上跑，n900还没有真机。虽然him plugin example已经更新，但我编译安装了，完全不知道怎么启用能看看效果，这点也比较orz. 我现在两个思路，简单的就是看看能不能修正scim for mameo，让它跑起来。据说只是获取焦点的问题。我通过比较him framework的svn历史版本，大概也能找出些需要的相关代码。不过nokia其实不太厚道。这些东西都是内部开发的，开发完一次性merge到开源分支上，中间的逐次修改的记录就没有了。上面的那个日本人的blog里提及为什么不用scim，一个是说用him插件机制容易切换系统原有输入法和cjk输入法，这点其实我没看出来，虽然我确实认为这个蛮重要的，并且如果用scim的确基本就不可能了。他还说，因为浏览器不支持preedit就不能用scim，这点我表示怀疑。这个preedit我没理解错，就是inline input，那种输入英文字母，还没转成中文前的时候就先在输入框里显示，一般还带个下划线那种。但是scim是支持over-the-fly模式的，就是自己弹出个小框来做预输入区，中文字完全后再送入客户端文本框，所以我觉得这应该不是个问题。当然，能不能捕获到浏览器内部的输入框就是另外一个问题了，这好像在很多平台上都是比较麻烦的事情。 另外一个思路，就是我打算用最简单的方法改改him或framework。我目前都不能确定him和him framework两个项目间具体什么关系。但看到点的一些代码中的事件处理，我相信应该可以做如下处理：就是关着键盘时，什么都不改，该怎么用软键盘就怎么用，也就不能支持cjk输入；打开键盘时，原来继续要传给him plugin的全部拦截掉，自己送给一个输入法后端变成中文，直接上屏。我是觉得这样子代码入口会比较好定位，折腾plugin的话，除了本来就要做的和输入法引擎的联调外，还要做些ui，以及一大堆需要补全的接口。 当然，我还是只是想想而已。我在him及him framework的代码中都加了几行debug输出，编译安装，竟然都没有这些debug信息出来，让我很失望。。不知道是什么原因没能替换成功。再说了。。]]></description>
			<content:encoded><![CDATA[<p>啧啧，真是复杂的玩意儿。<br />
半夜没事就看看这个东西，想想怎么让n900上有中文输入。他们提到的一个日本人在做的基于him plugin机制，加上ibus输入法引擎做后端的东西，我也google到了。 <a href="http://domaemon.blogspot.com/">http://domaemon.blogspot.com/</a> 访问需要翻墙。看起来人家好像进展不错？我其实是很希望人家赶紧做好，那ibus支持的输入法应该就都支持了，比如中文。。</p>
<p>其实我对n900的sdk也不是很熟。n810时，我都编译了直接在真机上跑，n900还没有真机。虽然him plugin example已经更新，但我编译安装了，完全不知道怎么启用能看看效果，这点也比较orz.<br />
我现在两个思路，简单的就是看看能不能修正scim for mameo，让它跑起来。据说只是获取焦点的问题。我通过比较him framework的svn历史版本，大概也能找出些需要的相关代码。不过nokia其实不太厚道。这些东西都是内部开发的，开发完一次性merge到开源分支上，中间的逐次修改的记录就没有了。上面的那个日本人的blog里提及为什么不用scim，一个是说用him插件机制容易切换系统原有输入法和cjk输入法，这点其实我没看出来，虽然我确实认为这个蛮重要的，并且如果用scim的确基本就不可能了。他还说，因为浏览器不支持preedit就不能用scim，这点我表示怀疑。这个preedit我没理解错，就是inline input，那种输入英文字母，还没转成中文前的时候就先在输入框里显示，一般还带个下划线那种。但是scim是支持over-the-fly模式的，就是自己弹出个小框来做预输入区，中文字完全后再送入客户端文本框，所以我觉得这应该不是个问题。当然，能不能捕获到浏览器内部的输入框就是另外一个问题了，这好像在很多平台上都是比较麻烦的事情。</p>
<p>另外一个思路，就是我打算用最简单的方法改改him或framework。我目前都不能确定him和him framework两个项目间具体什么关系。但看到点的一些代码中的事件处理，我相信应该可以做如下处理：就是关着键盘时，什么都不改，该怎么用软键盘就怎么用，也就不能支持cjk输入；打开键盘时，原来继续要传给him plugin的全部拦截掉，自己送给一个输入法后端变成中文，直接上屏。我是觉得这样子代码入口会比较好定位，折腾plugin的话，除了本来就要做的和输入法引擎的联调外，还要做些ui，以及一大堆需要补全的接口。</p>
<p>当然，我还是只是想想而已。我在him及him framework的代码中都加了几行debug输出，编译安装，竟然都没有这些debug信息出来，让我很失望。。不知道是什么原因没能替换成功。再说了。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/12/04/hildon-input-framework-and-plugins/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>webOS输入法实现设想</title>
		<link>http://www.evan129.com/2009/06/26/webos-input-method-design/</link>
		<comments>http://www.evan129.com/2009/06/26/webos-input-method-design/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 09:24:18 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[webOS]]></category>
		<category><![CDATA[palm pre]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.evan129.com/?p=301</guid>
		<description><![CDATA[至今还没见过pre真机呢，唉。前些天和streatsmart聊起，讲到pre上的中文输入法实现。我想当然地说，和android, iphone早期一样，没有输入法框架，也没sdk，估计是不怎么可能作系统级输入法的啦，哪有都像palm os这么多方式好hack的。他说，palmer@ifan提到，用js应该可以实现。虽然没有什么详细内容，我只是觉得或许也可以看下，载了webos的rom看了下源码。发现几个textfield控件的实现都是有源代码的。 可以看下如普通文本输入框的源码，在 /usr/palm/frameworks/mojo/submissions/175.7/javascripts/widget_textfield.js 。系统控件本身也有事件处理，比如当然要注册按键事件处理 this.handlekeydownevent = this.handlekeydownevent.bind(this); this.controller.listen(this.controller.element, "keydown", this.handlekeydownevent); this.handlekeyupevent = this.handlekeyupevent.bind(this); this.controller.listen(this.controller.element, "keyup", this. handlekeyupevent); 那么就可以在handlekeydownevent里加入自己的代码。加一个浮动 区域飘浮在当前的输入框上方用来显示候选词。可以取到当前textfield的绝对位置，这个框也可以定位得很精准。如果做inline式输入法，要自己绘制下划线，可能处理起来麻烦一点。要是和巨硬这类一样在外部窗口先确定字再入框的话，那只要第一个按键下去，显示输入框，剩下的就用输入框本身来处理后面的控件事件就可以。 这样做的好处很明显，纯js实现，不需要考虑没有sdk，编译linux native code有困难，没有接口文档，不能做通讯这些问题。缺点当然是效率会有问题。不过可以先做个单字输入法凑和着用。码表直接用一个json格式存储就好了。还有个缺点就是代码不保密，不过看起来webos上大多程序都有这问题。 不过看了下，textfield有好几种类型，而且甚至不是相互继承的，那么就需要把输入法相关的js单独提出来作一个文件，再在各种textfield里都调用下。相信对于标准输入框应该可以解决了。额外的，可以再做个独立的程序（或者直接用memo程序也行），输入字后可以复制粘贴，用于一些特殊的不能生效的情况。 有了root权限，替换和写入这些js文件应该没有什么问题。 嗯，最后是版权声明。如果您使用了这种方式来实现webos上的输入法的话，希望能声明想法来源，及标明本页链接。]]></description>
			<content:encoded><![CDATA[<p>至今还没见过pre真机呢，唉。前些天和streatsmart聊起，讲到pre上的中文输入法实现。我想当然地说，和android, iphone早期一样，没有输入法框架，也没sdk，估计是不怎么可能作系统级输入法的啦，哪有都像palm os这么多方式好hack的。他说，<span style="color: #0000ff;">palmer@ifan提到，用js应该可以实现</span>。虽然没有什么详细内容，我只是觉得或许也可以看下，载了webos的rom看了下源码。发现几个textfield控件的实现都是有源代码的。<span id="more-301"></span><br />
可以看下如普通文本输入框的源码，在 /usr/palm/frameworks/mojo/submissions/175.7/javascripts/widget_textfield.js 。系统控件本身也有事件处理，比如当然要注册按键事件处理<br />
<code lang="javascript"><br />
this.handlekeydownevent = this.handlekeydownevent.bind(this);<br />
this.controller.listen(this.controller.element, "keydown", this.handlekeydownevent);<br />
this.handlekeyupevent = this.handlekeyupevent.bind(this);<br />
this.controller.listen(this.controller.element, "keyup", this. handlekeyupevent);<br />
</code><br />
那么就可以在handlekeydownevent里加入自己的代码。加一个浮动</p>
<div>区域飘浮在当前的输入框上方用来显示候选词。可以取到当前textfield的绝对位置，这个框也可以定位得很精准。如果做inline式输入法，要自己绘制下划线，可能处理起来麻烦一点。要是和巨硬这类一样在外部窗口先确定字再入框的话，那只要第一个按键下去，显示输入框，剩下的就用输入框本身来处理后面的控件事件就可以。<br />
这样做的好处很明显，纯js实现，不需要考虑没有sdk，编译linux native code有困难，没有接口文档，不能做通讯这些问题。缺点当然是效率会有问题。不过可以先做个单字输入法凑和着用。码表直接用一个json格式存储就好了。还有个缺点就是代码不保密，不过看起来webos上大多程序都有这问题。<br />
不过看了下，textfield有好几种类型，而且甚至不是相互继承的，那么就需要把输入法相关的js单独提出来作一个文件，再在各种textfield里都调用下。相信对于标准输入框应该可以解决了。额外的，可以再做个独立的程序（或者直接用memo程序也行），输入字后可以复制粘贴，用于一些特殊的不能生效的情况。<br />
有了root权限，替换和写入这些js文件应该没有什么问题。</p>
<p>嗯，最后是版权声明。<span style="color: #ff0000;">如果您使用了这种方式来实现webos上的输入法的话，希望能声明想法来源，及标明本页链接。</span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2009/06/26/webos-input-method-design/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>中文标点 for OpenVanilla</title>
		<link>http://www.evan129.com/2006/11/30/%e4%b8%ad%e6%96%87%e6%a0%87%e7%82%b9-for-openvanilla/</link>
		<comments>http://www.evan129.com/2006/11/30/%e4%b8%ad%e6%96%87%e6%a0%87%e7%82%b9-for-openvanilla/#comments</comments>
		<pubDate>Wed, 29 Nov 2006 16:17:44 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.yifan.name/?p=46</guid>
		<description><![CDATA[哈哈，晚上开始研究香草输入法，框架果然非常好啊，最爽的是载下来的代码没有错误，一编译就通过了。laf&#8230; 原来这个输入法没有中文标点输出方式，自带倒是有个全角英数符，但是并不能完全替代中文标点用，比如……“”。而站点上一般的建议是设置keyname转换，直接映射某些键，不过仍解决不了“”成对出现的问题。 于是自己拿着全角英数符的源码对着改了一份中文标点输入法出来 使用说明: 将ovofchinesepunctuation.dylib复制到/library/openvanilla/0.7.2/modules目录下（需要先更改目录属性，不然没有权限复制），这时候打开ov的设置，模块载入菜单里把中文标点打勾，快捷键设成ctrl+.，这个和windows上是一样的。 还有一点缺陷是，有时在切换输入法后，这个模块不会自动启动，我还没有找到规律:( 后补: 原来编译好的文件在迁移站点时丢了:( 需要的话自己编译吧 源码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [...]]]></description>
			<content:encoded><![CDATA[<p>哈哈，晚上开始研究香草输入法，框架果然非常好啊，最爽的是载下来的代码没有错误，一编译就通过了。laf&#8230;<br />
原来这个输入法没有中文标点输出方式，自带倒是有个全角英数符，但是并不能完全替代中文标点用，比如……“”。而站点上一般的建议是设置keyname转换，直接映射某些键，不过仍解决不了“”成对出现的问题。<br />
于是自己拿着全角英数符的源码对着改了一份中文标点输入法出来<br />
使用说明: 将ovofchinesepunctuation.dylib复制到/library/openvanilla/0.7.2/modules目录下（需要先更改目录属性，不然没有权限复制），这时候打开ov的设置，模块载入菜单里把中文标点打勾，快捷键设成ctrl+.，这个和windows上是一样的。<br />
还有一点缺陷是，有时在切换输入法后，这个模块不会自动启动，我还没有找到规律:(</p>
<blockquote><p>后补: 原来编译好的文件在迁移站点时丢了:( 需要的话自己编译吧</p></blockquote>
<p>源码如下<br />
<span id="more-46"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// OVOFChinesePunctuation.cpp: Chinese Punctuation character output filter</span>
<span style="color: #666666;">// Author: Evan JIANG</span>
<span style="color: #666666;">// Mail:    firstfan at gmail dot com</span>
<span style="color: #666666;">// Date:   2006-11-29</span>
<span style="color: #666666;">// Copyright (c) 2004-2006 The OpenVanilla Project (http://openvanilla.org)</span>
<span style="color: #666666;">// All rights reserved.</span>
<span style="color: #666666;">// </span>
<span style="color: #666666;">// Redistribution and use in source and binary forms, with or without</span>
<span style="color: #666666;">// modification, are permitted provided that the following conditions</span>
<span style="color: #666666;">// are met:</span>
<span style="color: #666666;">// </span>
<span style="color: #666666;">// 1. Redistributions of source code must retain the above copyright</span>
<span style="color: #666666;">//    notice, this list of conditions and the following disclaimer.</span>
<span style="color: #666666;">// 2. Redistributions in binary form must reproduce the above copyright</span>
<span style="color: #666666;">//    notice, this list of conditions and the following disclaimer in the</span>
<span style="color: #666666;">//    documentation and/or other materials provided with the distribution.</span>
<span style="color: #666666;">// 3. Neither the name of OpenVanilla nor the names of its contributors</span>
<span style="color: #666666;">//    may be used to endorse or promote products derived from this software</span>
<span style="color: #666666;">//    without specific prior written permission.</span>
<span style="color: #666666;">// </span>
<span style="color: #666666;">// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;</span>
<span style="color: #666666;">// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
<span style="color: #666666;">// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
<span style="color: #666666;">// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE</span>
<span style="color: #666666;">// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR</span>
<span style="color: #666666;">// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF</span>
<span style="color: #666666;">// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS</span>
<span style="color: #666666;">// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN</span>
<span style="color: #666666;">// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)</span>
<span style="color: #666666;">// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE</span>
<span style="color: #666666;">// POSSIBILITY OF SUCH DAMAGE.</span>
&nbsp;
<span style="color: #339900;">#ifndef WIN32</span>
    <span style="color: #339900;">#include &lt;OpenVanilla/OpenVanilla.h&gt;  </span>
    <span style="color: #339900;">#include &lt;OpenVanilla/OVLibrary.h&gt;</span>
<span style="color: #339900;">#else</span>
    <span style="color: #339900;">#include &quot;OpenVanilla.h&quot;</span>
    <span style="color: #339900;">#include &quot;OVLibrary.h&quot;</span>
    <span style="color: #339900;">#define strcasecmp stricmp</span>
<span style="color: #339900;">#endif</span>
&nbsp;
<span style="color: #339900;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339900;">#include &lt;string.h&gt;</span>
<span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #339900;">#include &lt;ctype.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">34</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #208080;">0xff0c</span>,<span style="color: #208080;">0x3002</span>,<span style="color: #208080;">0x300a</span>,<span style="color: #208080;">0x300b</span>,<span style="color: #208080;">0xff1f</span>,<span style="color: #208080;">0xff0f</span>,<span style="color: #208080;">0xff1b</span>,<span style="color: #208080;">0xff1a</span>,<span style="color: #208080;">0xff5e</span>,<span style="color: #208080;">0xff40</span>,
	<span style="color: #208080;">0xff01</span>,<span style="color: #208080;">0x00b7</span>,<span style="color: #208080;">0xff03</span>,<span style="color: #208080;">0xffe5</span>,<span style="color: #208080;">0xff05</span>,<span style="color: #208080;">0xff06</span>,<span style="color: #208080;">0x00d7</span>,<span style="color: #208080;">0xff08</span>,<span style="color: #208080;">0xff09</span>,<span style="color: #208080;">0xff0d</span>,
	<span style="color: #208080;">0xff1d</span>,<span style="color: #208080;">0xff0b</span>,<span style="color: #208080;">0x3001</span>,<span style="color: #208080;">0xff5c</span>,<span style="color: #208080;">0xff3b</span>,<span style="color: #208080;">0xff3d</span>,<span style="color: #208080;">0xff5b</span>,<span style="color: #208080;">0xff5d</span>,<span style="color: #208080;">0x2026</span>,<span style="color: #208080;">0x2014</span>,
	<span style="color: #208080;">0x2018</span>,<span style="color: #208080;">0x2019</span>,<span style="color: #208080;">0x201c</span>,<span style="color: #208080;">0x201d</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>EnglishPunctuationChars<span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;,.&lt;&gt;?/;:~`!@#$%&amp;*()-=+\\|[]{}^-'<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> OVOFChinesePunctuation <span style="color: #008080;">:</span> <span style="color: #0000ff;">public</span> OVOutputFilter
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    OVOFChinesePunctuation<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> u16buf<span style="color: #000080;">=</span><span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">int</span> initialize<span style="color: #008000;">&#40;</span>OVDictionary <span style="color: #000040;">*</span>cfg, OVService <span style="color: #000040;">*</span>srv, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>modpath<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        rightSingleQuota<span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        rightQuota<span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>identifier<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;OVOFChinesePunctuation&quot;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>localizedName<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>locale<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>process <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>src, OVService <span style="color: #000040;">*</span>srv<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">protected</span><span style="color: #008080;">:</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> <span style="color: #000040;">*</span>u16buf<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> rightSingleQuota,rightQuota<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>OVOFChinesePunctuation<span style="color: #008080;">::</span><span style="color: #007788;">localizedName</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>locale<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>strcasecmp<span style="color: #008000;">&#40;</span>locale, <span style="color: #FF0000;">&quot;zh_TW&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;中文標點&quot;</span><span style="color: #008080;">;</span><span style="color: #666666;">//</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>strcasecmp<span style="color: #008000;">&#40;</span>locale, <span style="color: #FF0000;">&quot;zh_CN&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;中文标点&quot;</span><span style="color: #008080;">;</span><span style="color: #666666;">//</span>
    <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;Chinese Punctuation&quot;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>OVOFChinesePunctuation<span style="color: #008080;">::</span><span style="color: #007788;">process</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>src, OVService <span style="color: #000040;">*</span>srv<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>u16buf<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span>u16buf<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        u16buf<span style="color: #000080;">=</span><span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span> <span style="color: #000040;">*</span>u16p<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> l<span style="color: #000080;">=</span>srv<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>UTF8ToUTF16<span style="color: #008000;">&#40;</span>src, <span style="color: #000040;">&amp;</span>u16p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> len<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>l<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> src<span style="color: #008080;">;</span>
    u16buf<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">calloc</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,l<span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">short</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #666666;">//memcpy(u16buf, u16p, l*sizeof(unsigned short));</span>
&nbsp;
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i<span style="color: #000080;">&lt;</span>l<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>u16p<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> <span style="color: #208080;">0x7f</span><span style="color: #008000;">&#41;</span> 
        <span style="color: #008000;">&#123;</span>
        	u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>u16p<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        	<span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span> 
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>p<span style="color: #000080;">=</span><span style="color: #0000dd;">strchr</span><span style="color: #008000;">&#40;</span>EnglishPunctuationChars, <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span>u16p<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span> 
        <span style="color: #008000;">&#123;</span>
        	<span style="color: #0000ff;">int</span> t<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>p<span style="color: #000040;">-</span>EnglishPunctuationChars<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">28</span><span style="color: #008000;">&#41;</span>
        		u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        	<span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        		<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span>
        		<span style="color: #008000;">&#123;</span>
        			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">28</span><span style="color: #008080;">:</span>
        				u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">28</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">28</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">29</span><span style="color: #008080;">:</span>
        				u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">29</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">29</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>        			
        			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">30</span><span style="color: #008080;">:</span>
        				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rightSingleQuota<span style="color: #008000;">&#41;</span>
        					u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">31</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				<span style="color: #0000ff;">else</span>
        					u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">30</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				rightSingleQuota<span style="color: #000080;">=</span><span style="color: #000040;">!</span>rightSingleQuota<span style="color: #008080;">;</span>
        				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        			<span style="color: #0000ff;">case</span> <span style="color: #0000dd;">31</span><span style="color: #008080;">:</span>
        				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>rightQuota<span style="color: #008000;">&#41;</span>
        					u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">33</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				<span style="color: #0000ff;">else</span>
        					u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>ChinesePunctuationChars<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">32</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        				rightQuota<span style="color: #000080;">=</span><span style="color: #000040;">!</span>rightQuota<span style="color: #008080;">;</span>        			
        			<span style="color: #0000ff;">default</span><span style="color: #008080;">:</span>
        				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
        		<span style="color: #008000;">&#125;</span>
        	<span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
        	u16buf<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">++</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>u16p<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> srv<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>UTF16ToUTF8<span style="color: #008000;">&#40;</span>u16buf, len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  
<span style="color: #008000;">&#125;</span>
&nbsp;
OV_SINGLE_MODULE_WRAPPER<span style="color: #008000;">&#40;</span>OVOFChinesePunctuation<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2006/11/30/%e4%b8%ad%e6%96%87%e6%a0%87%e7%82%b9-for-openvanilla/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Palm输入法开发  UI设计</title>
		<link>http://www.evan129.com/2006/09/19/palm%e8%be%93%e5%85%a5%e6%b3%95%e5%bc%80%e5%8f%91-ui%e8%ae%be%e8%ae%a1/</link>
		<comments>http://www.evan129.com/2006/09/19/palm%e8%be%93%e5%85%a5%e6%b3%95%e5%bc%80%e5%8f%91-ui%e8%ae%be%e8%ae%a1/#comments</comments>
		<pubDate>Tue, 19 Sep 2006 14:19:56 +0000</pubDate>
		<dc:creator>Evan</dc:creator>
				<category><![CDATA[Palm]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[输入法]]></category>

		<guid isPermaLink="false">http://www.yifan.name/?p=6</guid>
		<description><![CDATA[旧blog彻底不能用了，载下所有存档，把这最有技术含量的一篇帖子内容抢救出来了。都已经忘了是几时写的了，但是可以确定是去年写的，呵呵。 ================================================= 其实不知道怎么会答应做五笔的，反正说了还是做吧，拖了好久了，原来就曾说过要做的样子。 可惜还有很多关于软件的没做，比如smss要出新的英文共享版，msgbackup要更新等。不是不想，实在忙，又临近期末，没有办法喽。偶尔还得陪mm，女人总是得哄着的。 这两天注册五笔的人不少，手忙脚乱的，今天下午抽空把原来自己的另两个软件也加到了这个站点里。 平时的生活似乎没什么好写的了，这一周都被整天写软件填满了。随便写些写五笔软件时的心得吧 整体来说，还算容易，三天出了早期beta，但设计不好，从头写过了，倒是更快，两天就好了。 目前的难度是在完整版本上下翻页上，原来重写也是因为这个，原来的设计对上翻页几乎是没办法确定正确的。 输入法嘛，无非就是拦下按键事件，看看是不是在field里，然后到码表去查，然后用fldinsert插入到当前field 大概的结构就是这样了，呵。说起来简单，小细节还是很多 比如说拦截按键，在文本框中按键会接连产生两个keydownevent。如果长按，还会不停地产生keydown事件。 现在就是怎么知道是不是长按呢？mcphiling是开源的，它里面有hold代码，那个方法或许可以通吃各版本吧，先一下按键事件记到feature里，然后再有keydown事件，看是不是前一个键，是前一个键的话，是不是现在时间减去前面记录的时间大于hold时间。650上不用这么麻烦，不过具体怎么做，我就不告诉你啦。 然后判断当前是不是field聚焦。首先千万别万frmgetactivefield()，因为这玩意能返回根本不存在的东东-_-b 那么先frmgetfocus()，然后判断是不是field，当然，漏了一个，在“任务“程序中就发现不是field，这是为什么呢？因为table也有可编辑状态，如果是table，再取它当前的field就好了 接着是输入法框的大概定位，我原来是自己用很复杂的方法算出来的，主要是你得考虑比如当前光标在第一行，然后拉到滚动条到后一页，但没有点屏幕，即光标还在第一行，你的输入法框可千万别画到屏幕外去。 给出一段自己废了的代码，这是原来的实现，后来发现系统有个函数可以直接完成-_-b 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 [...]]]></description>
			<content:encoded><![CDATA[<p>旧blog彻底不能用了，载下所有存档，把这最有技术含量的一篇帖子内容抢救出来了。都已经忘了是几时写的了，但是可以确定是去年写的，呵呵。</p>
<p><span id="more-6"></span></p>
<p>=================================================</p>
<p>其实不知道怎么会答应做五笔的，反正说了还是做吧，拖了好久了，原来就曾说过要做的样子。<br />
可惜还有很多关于软件的没做，比如smss要出新的英文共享版，msgbackup要更新等。不是不想，实在忙，又临近期末，没有办法喽。偶尔还得陪mm，女人总是得哄着的。</p>
<p>这两天注册五笔的人不少，手忙脚乱的，今天下午抽空把原来自己的另两个软件也加到了这个站点里。</p>
<p>平时的生活似乎没什么好写的了，这一周都被整天写软件填满了。随便写些写五笔软件时的心得吧</p>
<p>整体来说，还算容易，三天出了早期beta，但设计不好，从头写过了，倒是更快，两天就好了。<br />
目前的难度是在完整版本上下翻页上，原来重写也是因为这个，原来的设计对上翻页几乎是没办法确定正确的。</p>
<p>输入法嘛，无非就是拦下按键事件，看看是不是在field里，然后到码表去查，然后用fldinsert插入到当前field<br />
大概的结构就是这样了，呵。说起来简单，小细节还是很多</p>
<p>比如说拦截按键，在文本框中按键会接连产生两个keydownevent。如果长按，还会不停地产生keydown事件。<br />
现在就是怎么知道是不是长按呢？mcphiling是开源的，它里面有hold代码，那个方法或许可以通吃各版本吧，先一下按键事件记到feature里，然后再有keydown事件，看是不是前一个键，是前一个键的话，是不是现在时间减去前面记录的时间大于hold时间。650上不用这么麻烦，不过具体怎么做，我就不告诉你啦。</p>
<p>然后判断当前是不是field聚焦。首先千万别万frmgetactivefield()，因为这玩意能返回根本不存在的东东-_-b<br />
那么先frmgetfocus()，然后判断是不是field，当然，漏了一个，在“任务“程序中就发现不是field，这是为什么呢？因为table也有可编辑状态，如果是table，再取它当前的field就好了</p>
<p>接着是输入法框的大概定位，我原来是自己用很复杂的方法算出来的，主要是你得考虑比如当前光标在第一行，然后拉到滚动条到后一页，但没有点屏幕，即光标还在第一行，你的输入法框可千万别画到屏幕外去。<br />
给出一段自己废了的代码，这是原来的实现，后来发现系统有个函数可以直接完成-_-b</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//原自己计算Field位置的代码</span>
&nbsp;
&nbsp;
RectangleType rect<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> tmpStr<span style="color: #008080;">;</span>
UInt16 InsPt,SclPt,heigh,visLines,lineHeigh<span style="color: #008080;">;</span>
FieldAttrType fieldAttr<span style="color: #008080;">;</span>
&nbsp;
FldSetInsPtPosition<span style="color: #008000;">&#40;</span>field,FldGetInsPtPosition<span style="color: #008000;">&#40;</span>field<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    <span style="color: #666666;">//尽量尝试让这个输入框可见</span>
FldGetAttributes<span style="color: #008000;">&#40;</span>field,<span style="color: #000040;">&amp;</span>fieldAttr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
WinGetBounds<span style="color: #008000;">&#40;</span>WinGetDrawWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>,<span style="color: #000040;">&amp;</span>rect<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
y<span style="color: #000080;">=</span>rect.<span style="color: #007788;">topLeft</span>.<span style="color: #007788;">y</span><span style="color: #008080;">;</span>
FldGetBounds<span style="color: #008000;">&#40;</span>field,<span style="color: #000040;">&amp;</span>rect<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
y<span style="color: #000040;">+</span><span style="color: #000080;">=</span>rect.<span style="color: #007788;">topLeft</span>.<span style="color: #007788;">y</span><span style="color: #008080;">;</span>
FntSetFont<span style="color: #008000;">&#40;</span>FldGetFont<span style="color: #008000;">&#40;</span>field<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
lineHeigh<span style="color: #000080;">=</span>FntLineHeight<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fieldAttr.<span style="color: #007788;">singleLine</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
y<span style="color: #000040;">+</span><span style="color: #000080;">=</span>lineHeigh<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>y<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">160</span><span style="color: #000040;">-</span>frmH<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
y<span style="color: #000040;">-</span><span style="color: #000080;">=</span>lineHeigh<span style="color: #000040;">+</span>frmH<span style="color: #008080;">;</span>
<span style="color: #0000ff;">goto</span> _finish<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
InsPt<span style="color: #000080;">=</span>FldGetInsPtPosition<span style="color: #008000;">&#40;</span>field<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//插入点位移</span>
SclPt<span style="color: #000080;">=</span>FldGetScrollPosition<span style="color: #008000;">&#40;</span>field<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">//可见的第一行与开始处位移</span>
visLines<span style="color: #000080;">=</span>FldGetVisibleLines<span style="color: #008000;">&#40;</span>field<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//showDebug(&quot;InsPtPosition&quot;,InsPt);</span>
<span style="color: #666666;">//showDebug(&quot;ScollPosition&quot;,SclPt);</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>InsPt<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
y<span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #0000dd;">11</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>y<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">160</span><span style="color: #000040;">-</span>frmH<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
y<span style="color: #000040;">-</span><span style="color: #000080;">=</span>lineHeigh<span style="color: #000040;">+</span>frmH<span style="color: #008080;">;</span>
<span style="color: #0000ff;">goto</span> _finish<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
tmpStr<span style="color: #000080;">=</span>MemPtrNew<span style="color: #008000;">&#40;</span>InsPt<span style="color: #000040;">-</span>SclPt<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
MemMove<span style="color: #008000;">&#40;</span>tmpStr,<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>FldGetTextPtr<span style="color: #008000;">&#40;</span>field<span style="color: #008000;">&#41;</span><span style="color: #000040;">+</span>SclPt<span style="color: #008000;">&#41;</span>,InsPt<span style="color: #000040;">-</span>SclPt<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
tmpStr<span style="color: #008000;">&#91;</span>InsPt<span style="color: #000040;">-</span>SclPt<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
heigh<span style="color: #000080;">=</span>FldCalcFieldHeight<span style="color: #008000;">&#40;</span>tmpStr,rect.<span style="color: #007788;">extent</span>.<span style="color: #007788;">x</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>heigh<span style="color: #000080;">&gt;</span>visLines<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
y<span style="color: #000040;">+</span><span style="color: #000080;">=</span>visLines<span style="color: #000040;">*</span>lineHeigh<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>y<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">160</span><span style="color: #000040;">-</span>frmH<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
y<span style="color: #000040;">-</span><span style="color: #000080;">=</span>lineHeigh<span style="color: #000040;">+</span>frmH<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">else</span>
<span style="color: #008000;">&#123;</span>
y<span style="color: #000040;">+</span><span style="color: #000080;">=</span>heigh<span style="color: #000040;">*</span>lineHeigh<span style="color: #008080;">;</span>
<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>y<span style="color: #000080;">&gt;</span><span style="color: #0000dd;">160</span><span style="color: #000040;">-</span>frmH<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
y<span style="color: #000040;">-</span><span style="color: #000080;">=</span>lineHeigh<span style="color: #000040;">+</span>frmH<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
MemPtrFree<span style="color: #008000;">&#40;</span>tmpStr<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>我顺便得强烈提醒注意下，这里有点处理比较繁琐。因为你取field的位置时，是相对它所在的form的坐标，你得要绝对屏幕坐标，为什么？你想想看petitlauncher的弹出框那点地方就知道了，不会想画在那里面吧？<br />
然后取form的topleft坐标？错了哇，要是这个form的windows的topleft，这又是个奇怪的东东，form的坐标是从实际的左上角减去它的边框粗来算的。<br />
取完了位置，然后画框，像巨硬这种（即完整模式的框）非常容易，宽度定了，y也知道就简单了。但是精简版要光标跟随，要随时小心画屏幕外，就有点烦人喽。不过纯粹体力活，慢慢调就好。</p>
<p>其实第一个按键捕获了，下面就是自己的form了，事件全部自己来管。我没必要和您详细说明什么。<br />
简单的告诉你一个要小心的东西，别把keydown全截了自己处理就以为完事了。<br />
那你会发现来短信时弹不出短信提示框了。这又是为什么呢？我也不知道，似乎是handspring sdk里把这些事件放在keydown里一起了？所以，处理自己需要的keydown事件，处理了剩下不需要的，重新扔给syshandleevent()去处理。这样就好了。</p>
<p>完事了，就插入到field喽，最多是个《》这类的标点需要自己把光标再左移一下。</p>
<p>再好就只剩对dtg、qword的兼容了，哈，这个不知道梅花怎么实现的。个人实现时比较讲技巧的，原创啊原创。怎么做的呢？先把字复制到剪粘板，然后送个menuevent给dtg，让它把字贴进去。嘻，所以会导致剪粘板失效呢。其实也可以处理的，先自己把剪粘板的内容暂存嘛，可惜太麻烦了，不想做了。</p>
<p>还剩下点什么？哦，特殊设置里那么多的排除，为什么建议不要用呢。因为全是单独处理的，不要以为这是程序写得好不好的问题，巨硬为什么不用它自己就能兼容我也不知道，但我觉得这个不一定是好事，只是它处理事件优先吧。比如排除hi-launcher（因为竟然有600用户喜欢用home做启动键，导致和选字冲突），在第一个按键下去时，检查完是不是中文状态后，如果要出输入条前，把feature里的rhil的1值（这里是保存了启动键的keycode）先保存下，然后改成一个不存在的键，输入条完毕后重设回来。</p>
<p>说到feature，这个玩意得谢谢uglee，是他告诉我这是什么东西的，虽然是我自己后来研究着怎么用的，不过他不说，我久远不知道这是什么东西吧。但是发现老外有些人写软件很傻的说，比如bulter，feature是32bit的大整数，如果只是保存boolean值的话，可以存个32个了，我到现在所有的设置只在一个feature里完成了（当然还有几个留做其它用，比如暂存下text plus的状态）。不过bulter的作者似乎对二进制不感冒，非得用十进制，浪费了很多啊。。</p>
<p>越说越多，一并讲讲怎么设计出这种一个form然后so多选项的界面的，我原来汉化profilecare时，一样很奇怪那作者怎么可能画出这么乱的界面的（我并没说不好，只是设计时自己怎么知道是什么的）。原来是猜着，建几个form分别设计好，贴到一起来。这里我不得不强烈推荐您还是用rcp格式的设计好，至少可以自己写代码完成，真的很方便，虽然对图片什么的处理上有点小小麻烦。不过这次我自己做时比这还简单些，你用bird打开我的tfrm 1008即主界面，看不出来那些东东呢，因为全重叠了，不会乱，我喜欢整洁的说。</p>
<p>然后怎么点一个tab，隐藏其它的呢？一个个写要死人的外，技巧来了。这就是rcp的好处，自己可以方便的改前后位置，例如基本设置界面：<br />
label &#8220;中英文切换键&#8221; id tmpid0  at (7 43)<br />
popuptrigger &#8220;电话&#8221; id appswitchsel  at (90 43 auto auto)<br />
list &#8220;电话&#8221; &#8220;日历&#8221; &#8220;短信&#8221; &#8220;开关&#8221; &#8220;左shift&#8221; &#8220;右shift&#8221; id appswitchlist650         at (prevleft 56 prevwidth 46) visibleitems 4 nonusable<br />
list &#8220;电话&#8221; &#8220;日历&#8221; &#8220;短信&#8221; &#8220;开关&#8221; id appswitchlist600         at (prevleft 56 prevwidth 46) visibleitems 4 nonusable<br />
label &#8220;&#8221; id beginofbasic at (0 0)<br />
checkbox &#8220;使用超精简模式&#8221; id superinput   at (5 55 auto auto)<br />
checkbox &#8220;切换程序时重设中英文状态&#8221; id initimeck  at (5 67 152 auto)<br />
checkbox &#8220;默认为中文输入法&#8221; id defaultimeck  at (20 79 152 auto)<br />
checkbox &#8220;默认输入中文标点&#8221; id chsymck  at (5 91 152 auto)<br />
checkbox &#8220;长按键输入中文标点&#8221; id holdsymck  at (5 103 152 auto)<br />
checkbox &#8220;z键进入英文输入&#8221; id z_ck  at (5 115 152 auto)<br />
checkbox &#8220;启用逐码提示&#8221; id tip_ck  at (5 127 152 auto)<br />
label &#8220;&#8221; id endofbasic at (0 0)</p>
<p>除了最上面两个因为和600,650版本有关，我单独写外，看到没，有<br />
label &#8220;&#8221; id beginofbasic at (0 0)<br />
label &#8220;&#8221; id endofbasic at (0 0)<br />
这两个看不见的东东？什么用呢？<br />
就这样子<br />
for (i=beginofbasic;i<=endofbasic;i++)<br />
frmshowobject(frmp,frmgetobjectindex(frmp,i));<br />
for (i=beginofad;i<=endofad;i++)<br />
frmhideobject(frmp,frmgetobjectindex(frmp,i));<br />
for (i=beginofcom;i<=endofcom;i++)<br />
frmhideobject(frmp,frmgetobjectindex(frmp,i));<br />
以后增删界面内容也不用怕喽。。。</p>
<p>晚了，先写到这儿吧，虽然我知道国内开发者不多，有兴趣学的或是同行就看看吧。</p>
<p>[2005-12-06]补充，发现巨硬长按优先于bulter很容易，注册notify时提高级别就行了。</p>
<p>[2006-09-21]补充，事实上对dtg和java这些，不是标准field控件的，要做输入也非常简单，是我以前没想到。后来同rei(掌易作者)谈起时，想起来了。在eventmanager里，有个方法发送按键事件的，并且是wchar类型的，而梅花就是完全这么做的。但估计它为了防止自身退出前，送出的事件被自己接收处理产生死循环，所以加了延时，导致用梅花明显的上屏有延迟。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evan129.com/2006/09/19/palm%e8%be%93%e5%85%a5%e6%b3%95%e5%bc%80%e5%8f%91-ui%e8%ae%be%e8%ae%a1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
