前一篇学习了如何使用UiList,这个控件应该会使用的比较多,但还有一些常控件需要了解一下,比如文本框、工具栏等。这一篇将学习一下几个SDK中的常用控件。
1、UiSingleLineEdit(单行编辑单元)这个类主要是用于文本框类型的应用,比如输入姓名、数字。使用过其他一些IDE的朋友应该知道的,文本框的应用还是非常广泛,总之就是为了输入。
其实使用UiSingleLineEdit非常简单,先看代码吧:
先看申明部分:
- class CClockSetWnd: public CMzWndEx
- {
- MZ_DECLARE_DYNAMIC(CClockSetWnd);
- public:
- UiSingleLineEdit edt_Year; //年
- 。。。省略
- }
复制代码在这段代码中我们申明了一个成员:edt_Year,用于输入年份。接下来就是要创建这个控件咯,具体的创建方法在前面的几篇文章已经讲过了,在此不再说明,看实现代码:
-
- edt_Year.SetID(MZ_IDC_EDIT_YEAR);
- edt_Year.SetPos(20, 40, 110, 60);
- edt_Year.SetMaxChars(4);
- edt_Year.SetSipMode(IM_SIP_MODE_DIGIT, 0);
- edt_Year.SetTip2(L"年", true);
- edt_Year.SetRightInvalid(40);
- edt_Year.SetDrawBg(true);
- 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在屏幕中一个位置的。
马上见代码,下面是的代码是一个窗口类的申明部分:
- class CClockMainList: public CMzWndEx
- {
- MZ_DECLARE_DYNAMIC(CClockMainList);
- public:
- //控件列表
- UiToolbar_Text tbTools;
复制代码在上面代码中申明了一个UiToolbar_Text,这就是工具栏了。申明之后接下来就是要创建这个控件咯,接着贴代码:
- tbTools.SetID(MZ_IDC_LIST_TOOL);
- tbTools.SetPos(0, this->GetHeight() - MZM_HEIGHT_TEXT_TOOLBAR, GetWidth(), MZM_HEIGHT_TEXT_TOOLBAR);
-
- tbTools.SetButton(0, true, true, L"Exit");
- tbTools.EnableLeftArrow(true);
- tbTools.SetButton(1, true, true, L"Edit");
- tbTools.SetButton(2, true, true, L"Delete");
- AddUiWin(&tbTools);
复制代码前面两句很熟悉了,只是SetPos要注意一下,因为要将工具栏显示在屏幕底部,所以要将y坐标进行简单的计算,用窗口的高度减去MZM_HEIGHT_TEXT_TOOLBAR即可,而MZM_HEIGHT_TEXT_TOOLBAR则是魅族M8sdk中工具栏的通用设置高度。
SetButton(0, true, true, L"Exit");这个方法就是向工具栏中添加按钮菜单了,其中第一个参数很重要,是这个按钮的索引值,第二个参数为是否显示,第二个参数为是否可用,最后的参数就是按钮显示的文本,这个菜单是用来退出应用程序的,所以叫Exit。
而且在使用时发现只能有三个按钮,只不过竖屏时也就只能放3个了。EnableLeftArrow(true)是否显示左箭头,就是在左边显示两个箭头,也没什么大用处。
后面几句就和前面的大体相同了,到这一步,工具栏创建成功,但还没有完成,比如第一个工具栏按钮Exit,它如何才能使用程序退出呢?这就是接下来要做的事情,响应命令操作,贴上代码:
- virtual void OnMzCommand(WPARAM wParam, LPARAM lParam)
- {
- UINT_PTR id = LOWORD(wParam);
- switch(id)
- {
- case MZ_IDC_LIST_TOOL:
- {
- int nIndex = lParam;
- if (nIndex==0)
- {
- // exit the appliaction
- PostQuitMessage(0);
- break;
- }
- if (nIndex==1)
- {
- ......
- break;
- }
- if (nIndex==2)
- {
- //saving settings...
- break;
- }
- }
- }
复制代码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); 退出消息循环即退出应用程序进程。
这样就完成了工具栏按钮的命令处理,以此类推就可以通过实现其他的按钮操作了。