迷你5207专属论坛

注册

 

发新话题 回复该主题

[魅族M8] M8SDK学习之三控件使用2 [复制链接]

发表者
前一篇学习了如何使用UiList,这个控件应该会使用的比较多,但还有一些常控件需要了解一下,比如文本框、工具栏等。这一篇将学习一下几个SDK中的常用控件。

1、UiSingleLineEdit(单行编辑单元)
这个类主要是用于文本框类型的应用,比如输入姓名、数字。使用过其他一些IDE的朋友应该知道的,文本框的应用还是非常广泛,总之就是为了输入。
其实使用UiSingleLineEdit非常简单,先看代码吧:

先看申明部分:
  1. class CClockSetWnd: public CMzWndEx
  2. {
  3.   MZ_DECLARE_DYNAMIC(CClockSetWnd);
  4. public:
  5.   UiSingleLineEdit edt_Year;  //年

  6. 。。。省略
  7. }
复制代码
在这段代码中我们申明了一个成员:edt_Year,用于输入年份。接下来就是要创建这个控件咯,具体的创建方法在前面的几篇文章已经讲过了,在此不再说明,看实现代码:

  1. edt_Year.SetID(MZ_IDC_EDIT_YEAR);
  2. edt_Year.SetPos(20, 40, 110, 60);
  3. edt_Year.SetMaxChars(4);
  4. edt_Year.SetSipMode(IM_SIP_MODE_DIGIT, 0);
  5. edt_Year.SetTip2(L"年", true);
  6. edt_Year.SetRightInvalid(40);
  7. edt_Year.SetDrawBg(true);
  8. AddUiWin(&edt_Year);
复制代码
代码中的SetID和SetPos在UiList都已经说明过了,从SetMaxChars开始说明:
SetMaxChars(4)的意思就是设置编辑器支持的最大字符个数,简单点就是只能输入这多个字节,在括号中有个4,表示只能输入4个字节。

SetSipMode(IM_SIP_MODE_DIGIT, 0);设置编辑器输入法模式,因为这个控件的目的是输入年份,所以在此在设置输入法为纯数字。IM_SIP_MODE_DIGIT就是表示输入法模式,而后面的0表示与输入法与屏幕底部的距离。

SetTip2(L"年", true);设置提示文字,该文字一直在编辑框左/右边显示,说到这个就像是个标签,我们通常都会在文本框边上放置一个Label来显示文字以告诉用户这个文本框的输入内容,在本文中此文本框是用于输入年份的,所以可以在文本框左边显示一个字“年”,而在这SetTip2方法中还有第二个参数,就是设置文字是显示在文本框的左边还是右边。这个还是比较人性化,如果不传入值而默认为false左边的,而我们希望达到的效果类似:2009 年。所以我们设置参数为true,文字“年”
就显示在右边了

SetRightInvalid(40);设置编辑器右边的无效区域宽度,因为我们在文本编辑器的右边显示了一个文字,所以在这个区域中不允许再获取光标或者其他操作了,于是设置一个范围内为无效区域即可。

SetDrawBg(true);设置默认背景图风格,这句很重要,只有设置为显示默认背景图文本框才会有边框显示,否则就和背景窗口一样,不点上去根本看不出来。参数意思很明确true即为使用默认背景。

最后AddUiWin完成运行一下看效果图:


在图中有两个文本框。

2、UiToolbar_Text(菜单工具栏)
菜单工具栏是应用非常多的控件,一般的程序都会有菜单,而且在魅族M8中的软件大都有一个工具栏在底部,当然这是一种习惯,其实我们放在哪都没有关系,从前面的学习就知道工具栏也可以自己SetPos在屏幕中一个位置的。

马上见代码,下面是的代码是一个窗口类的申明部分:
  1. class CClockMainList: public CMzWndEx
  2. {
  3.   MZ_DECLARE_DYNAMIC(CClockMainList);        
  4. public:
  5.   //控件列表
  6.   UiToolbar_Text tbTools;
复制代码
在上面代码中申明了一个UiToolbar_Text,这就是工具栏了。申明之后接下来就是要创建这个控件咯,接着贴代码:
  1. tbTools.SetID(MZ_IDC_LIST_TOOL);
  2. tbTools.SetPos(0, this->GetHeight() - MZM_HEIGHT_TEXT_TOOLBAR, GetWidth(), MZM_HEIGHT_TEXT_TOOLBAR);
  3.     
  4. tbTools.SetButton(0, true, true, L"Exit");
  5. tbTools.EnableLeftArrow(true);
  6. tbTools.SetButton(1, true, true, L"Edit");  
  7. tbTools.SetButton(2, true, true, L"Delete");    
  8. AddUiWin(&tbTools);
复制代码
前面两句很熟悉了,只是SetPos要注意一下,因为要将工具栏显示在屏幕底部,所以要将y坐标进行简单的计算,用窗口的高度减去MZM_HEIGHT_TEXT_TOOLBAR即可,而MZM_HEIGHT_TEXT_TOOLBAR则是魅族M8sdk中工具栏的通用设置高度。
SetButton(0, true, true, L"Exit");
这个方法就是向工具栏中添加按钮菜单了,其中第一个参数很重要,是这个按钮的索引值,第二个参数为是否显示,第二个参数为是否可用,最后的参数就是按钮显示的文本,这个菜单是用来退出应用程序的,所以叫Exit。而且在使用时发现只能有三个按钮,只不过竖屏时也就只能放3个了。

EnableLeftArrow(true)
是否显示左箭头,就是在左边显示两个箭头,也没什么大用处。

后面几句就和前面的大体相同了,到这一步,工具栏创建成功,但还没有完成,比如第一个工具栏按钮Exit,它如何才能使用程序退出呢?这就是接下来要做的事情,响应命令操作,贴上代码:
  1. virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
  2. {
  3.     UINT_PTR id = LOWORD(wParam);
  4.     switch(id)
  5.     {
  6.       case MZ_IDC_LIST_TOOL:
  7.       {
  8.         int nIndex = lParam;
  9.         if (nIndex==0)
  10.         {
  11.           // exit the appliaction
  12.           PostQuitMessage(0);
  13.           break;
  14.         }

  15.         if (nIndex==1)
  16.         {
  17.           ......                                
  18.           break;
  19.         }
  20.         if (nIndex==2)
  21.         {
  22.           //saving settings...
  23.           break;
  24.         }
  25.      }
  26. }
复制代码
OnMzCommand这个函数在前面的文章有过说明,这个函数就是用来响应MZ_WM_COMMAND消息的处理函数,一般情况下创建在UiWnd及其派生类中的工具栏都可以通过OnMzCommand来处理MZ_WM_COMMAND消息,也就是点击工具栏按钮的处理。
UINT_PTR id = LOWORD(wParam);
这一句就是获取消息的参数取低字节就是所发消息的控件id索引值。即使用SetID所设置的索引,这样就可以知道是哪一个控件触发的消息了。

于是通过一个switch来进行处理。
case MZ_IDC_LIST_TOOL:
这句就表明了是否为工具栏,如果符合条件则进入处理代码。
int nIndex = lParam;
这句代码就是取得另一个消息参数,如果是工具栏触发的消息这个参数传递的是工具栏按钮的索引值,使用一个整形变量保存下来,然后使用if 语句来判断。如果nIndex=0的话,表示按下的是Exit按钮,接下来就处理退出应用程序的代码咯:
PostQuitMessage(0); 退出消息循环即退出应用程序进程。

这样就完成了工具栏按钮的命令处理,以此类推就可以通过实现其他的按钮操作了。



作者:5207
出处:http://www.mini188.com
本文版权归作者所有,欢迎转载请注明出处,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
本主题由 皇帝 5207 于 2010-12-27 22:53:31 执行 设置高亮 操作
分享 转发
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
沙发

我认为UiSingleLineEdit 控件的SetRightInvalid()方法 只是在设置区域内不再进行重绘 并不影响获取焦点。
TOP
凳子

回复 2# tangqc13 的帖子

只是说这个区域内不能显示光标。
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
地板

呵呵。 楼主写了这么多  学习了!
TOP
5#

回复 4# tangqc13 的帖子

共同交流。。呵呵。我也很久没写东西了。
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
6#

我才开始学习wince平台的编程,向你多学习啊!
看了楼主其他的帖子,好像也是做Delphi和C#开发的?
TOP
7#

回复 6# tangqc13 的帖子

嗯。是的,DELPHI用的多些。
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
8#

呵呵。me too。。  现在用Delphi的人不多了。。。
TOP
9#

回复 8# tangqc13 的帖子

是呀,Delphi实在是不行了。。
相信与不相信都是矛盾的.  5207宣!欢迎您来到点滴论坛
TOP
10#

Borland连IDE都卖掉了么。。  
睡觉了。。  楼上的晚安!
TOP
11#

先就看这个前四篇,慢慢吸收下。。。
TOP
12#

只是说这个区域内不能显示光标。
5207 发表于 2010-1-20 21:32:00



能显示!不信,你试试
TOP
13#

只是说这个区域内不能显示光标。
5207 发表于 2010-1-20 21:32:00



能显示!不信,你试试
TOP
发新话题 回复该主题