brew 平台下的日期时间控件实现

来源:互联网 发布:cpu稳定测试软件 编辑:程序博客网 时间:2024/05/20 14:23

这几天用要在brew下写个时间控件,每想到写起来这么痛苦,暂时做出来了,简单写一下自己遇到的问题。

 

    其实这种控件用几个text和button控件很好组合出来,但考虑时间和效率问题,还是决定用系统提供的,没想到用系统提供的花费了更长的开发时间,浪费我近三天时间在那里折腾,罪过。

 

    系统提供了AEECLSID_JulianDateWidget and AEECLSID_JulianTimeWidget 两个类分别实现时期和时间控件,代替了老版本中 IDateCtl的接口,这两个类用法几乎一样,如果仅仅是显示一个控件,很简单,下面一代码就加上给它设定位置和大小的代码就可以让它显示在屏幕上。时间为系统时间。

int nErr = ISHELL_CreateInstance(((AEEApplet*)GETAPPINSTANCE())->m_pIShell,AEECLSID_JulianTimeWidget,(void **)(&m_pWidget));

 

因为我写的是被别的类调用的而且是基类的子类,所以,位置宽度这些代码不用自己实现。但遇到几个问题在这里提一下:

 

1.给控件设置一个指定的时间。如下代码:

     JulianType m_DateTime;
     m_DateTime.wYear = 2010;
     m_DateTime.wMonth = 12;
     m_DateTime.wDay = 25;
     m_DateTime.wHour = 10;
     m_DateTime.wMinute = 20;
     IWIDGET_SetJulianDateTime(m_pWidget,&m_DateTime);

日期控件设定也是传入同样的数据类型。如果只用时间控件,可以不用赋值年月日,但是现在的值传进去,时间显示出来,是另外一个时间,开始以为是时区的问题,后来没发现哪里要设置时区,试了好久才给试出来,原来是m_DateTime的秒没有设值,它的默认值是一个很大的值,系统在显示时间时,会把秒转成小时和分钟,所以时间被改变,所以给它设置一个0或指定的值就OK了。

 

2.键盘输入的问题。控件可以设置参数指定两个小箭头,通过点击修改时间。可支持键盘输入,可我怎么都无法通过键盘输入,控件无法捕获到键盘事件,可API文档上明明说它支持键盘事件,下面是它支持的几个键盘事件:

                       AVK_LEFT/RIGHT    Moves between the elements of the date time widget or,
                                          in cursor mode (see PROP_FLAGS below), between the
                                          digits of the elements.
                        AVK_UP/DOWN       If the flag DTWF_USEUPDOWNKEYS has been enabled,
                                          increments or decrements the value of the field or
                                          digit under the cursor.
                        AVK_0-9           Enters the digit as the value of the field or digit under
                                          the cursor.  If in field mode, the next digit is then
                                          implicitly selected.  The value is capped within the
                                          range of the field, so, for example, when a 9 is entered
                                          as the minute value, it will automatically become '09'
                                          because the "ten minutes" column cannot be above 6.
                        AVK_SELECT        Toggles the AM/PM field (if that is the item selected).

后来找同事帮我看,告诉我 AVK_0-9表示小键盘手机的数字键,而我的模拟器用的是全键盘,所以事件它无法接收,我换了个手机皮肤,果然它能接收键盘输入了。也就是说想要支持全键盘,我只能自己想法把事件捕获了再处理。

 

3.时间存储的问题。文档上说时间日期控件需要指定一个valuemodel来存储它的值,如果没有指定的话它会自己指定一个。我测试了一下

IWIDGET_SetJulianDateTime(m_pWidget,&m_DateTime);后直接再IWIDGET_GetJulianDateTime(pWidget ,&m_DateTime),得到的值是正确的,可以在处理鼠标事件的代码中去get日期时间,返回原时间是错误的,好像是1988年多少日之类的,也就是日期时间的初始值,跟踪代码发现,它存的时间按datatime类型存的,但取值的时候,却没检测出来它的格式是日期时间型,是按秒取的,所以出错(文档上好像说所有的日期时间型都要转化成秒来存),不知道内部怎么处理的,如果想解决这个问题,就自己转成秒来存和取,有函数来支持的。最简单的方法是自己给类设定一个成员变量来存(我用的C++开发,貌似大家都是用的C)。

 

4.外观有很多参数可以设置,我只实验了改变上下箭头,文档说要用一个条状的图片,当时想怎么用一个图片要实现两个箭头呢?后来想到之前自己学习的一个游戏程序,就是一张图片,上面很多小图,游戏中用哪个小图,通过程序剪裁哪个来使用,我想这个也应该一样吧,测试了一下,果然是这样的,代码如下:

nBitmap = ISHELL_LoadBitmap(((AEEApplet*)GETAPPINSTANCE())->m_pIShell,"blue.bmp");

图片和效果如下:

   

 

图片是我用画板画的,虽然很丑,但也能凑和着用了,我还改了字体,默认的太难看了。

 

部分代码如下:

 

int nErr = ISHELL_CreateInstance(((AEEApplet*)GETAPPINSTANCE())->m_pIShell,AEECLSID_JulianTimeWidget,(void **)(&m_pWidget));   //创建实例

 IWIDGET_SetDelimiterString(m_pWidget,L":");  //设定分割符
 IWIDGET_SetFormatString(m_pWidget,L"hh:mm tt"); //设定显示格式

 JulianType m_DateTime;

 IWIDGET_SetJulianDateTime(m_pWidget,&m_DateTime); //赋值
 IWIDGET_SetFlags(m_pWidget,DTWF_SHOWUPDOWNARROWS|DTWF_USEUPDOWNKEYS);//显示下下箭头

 IBitmap* nBitmap;


 nBitmap = ISHELL_LoadBitmap(((AEEApplet*)GETAPPINSTANCE())->m_pIShell,"blue.bmp");//设置箭头图片

 int a = IWidget_SetPropImageStrip(m_pWidget,nBitmap);//设置箭头

 IHFont* font = getFont(18, bold); //得到一个字体类型(自己写的实现)
 
  nErr = IWIDGET_SetFont(m_pWidget, CAST(IFont*, font)); // 设置字体

 

 

OK,基本就这样了。刚搬家到CSDN博客,而且刚开始BREW开发,希望能坚持下来。也希望公司不要让我再随便转到其它的组,至少让我精通一个平台。也希望可以和同种开发平台的朋友多交流。

 

原创粉丝点击