查看完整版本: LabWindows/CVI虚拟仪器设计技术基本控件使用之:Ring 箭头设置

admin 发表于 2014-10-12 07:21:51

LabWindows/CVI虚拟仪器设计技术基本控件使用之:Ring 箭头设置

1.3 Ring 箭头设置
        1.3.1 Ring 箭头设计方法
        在进行图形用户界面设计时,设计者通常会对控件外观(如大小、形状、形式)等进行调整,但LabWindows/CVI 中的控件外观很少能进行二次开发与设计,但是,Ring 控件的箭头大小却在可以设置之列。NI 公司的Luis Gomes 在网站上公布了有关Ring 控件箭头设置的非公开资料,但在其官方手册中并没有说明。Ring 控件箭头属性设置主要包括宽度和高度,可使控件箭头与显示的文字字体比例保持协调。对于普通Ring 控件,可用SetCtrlAttribute 函数,控件属性设置为20472,对于Menu Ring 、Recessed Menu Ring 和Popup Menu Ring 控件,可设置控件属性值为20475 来调整宽度值,通过设置控件属性值为20476 来调整高度值。双击Ring 控件,在弹出的Edit Ring 对话框中点击Label/Value Pairs… 按钮,设置标题和数值对,如图1-6 所示。
       
        由于LabWindows/CVI 具有非常灵活的回调机制,在编写控件回调函数时,可以借鉴控件事件响应机制(即event 事件机制)的集中处理方法(如各种鼠标、键盘事件处理),对所有的Ring 控件使用相同的回调函数名称,通过回调函数中的control 参数,利用控件常量名来区分不同控件的事件响应。采用这种方式可使代码量显著减少,提高编程效率。
       
        Ring 控件可提供多组选择项目,每一组选项都存储有标题和数值对,二者一一对应,标题为文本字符,提供显示功能,数值为标题提供后台索引,能通过索引获得标题或通过选择标题而获得索引。在选中Ring 控件后,可以通过空格键来弹出控件中的所有选项,利用键盘的上下键来选择其中的选项,按下回车键确认选项,按下ESC 键则关闭所弹出的选项。
       
        1.3.2 Ring 箭头程序设计
        (1)面板设计
        编写一个Ring 箭头设置测试程序,首先通过Binary Switch 控件设置Ring 控件箭头的宽度或高度,然后设置Menu Ring 、Recessed Menu Ring 和Popup Menu Ring 的宽度或高度值,对于普通Ring 控件,只能设置宽度,高度设置不起作用,设置的数值区间为0~20 。面板设计如图1-7 所示,面板中主要控件属性设置如表1-10 所示。
       
        图1-6 Label/Value Pairs 对话框图
                 
        1-7 Ring 箭头设置面板
       
        表1-10 控件属性设置表
                                                                                                                        常量名
                                                                                                                        控件类型
                                                                                                                        控件的主要属性
                                                                                                                                                        PANEL
                                                                                                                        Panel
                                                                                                                        标题:Ring 箭头设置回调函数:PanelCB
                                                                                                                                                        RING_PLAIN
                                                                                                                        Ring
                                                                                                                        标题:Ring 回调函数:arrow
                                                                                                                                                        RING_MENU
                                                                                                                        Ring
                                                                                                                        标题:Menu Ring 回调函数:arrow
                                                                                                                                                        RING_RECESSEDMENU
                                                                                                                        Ring
                                                                                                                        标题:Recessed Menu Ring 回调函数:arrow
                                                                                                                                                        RING_POPUPMENU
                                                                                                                        Ring
                                                                                                                        标题:Popup Menu Ring 回调函数:arrow
                                                                                                                                                        BINARYSWITCH
                                                                                                                        Binary Switch
                                                                                                                        标题:箭头设置ON Text :高度OFF Text :宽度
                                                       
        (2)程序源代码
        //头文件声明
        #include <cvirte.h>   
        #include <userint.h>   
        #include "Ring 箭头设置.h"      
        static int panelHandle; //主函数
        int main (int argc, char *argv[])
        {
        if (InitCVIRTE (0, argv, 0) == 0)
        return &ndash;1; /* out of memory */ if ((panelHandle = LoadPanel (0, "Ring 箭头设置.uir", PANEL)) < 0)      
        return &ndash;1;   
        DisplayPanel (panelHandle);   
        RunUserInterface ();   
        DiscardPanel (panelHandle);   
        return 0;
        } //面板回调函数
        int CVICALLBACK PanelCB (int panel, int event, void *callbackData,      
        int eventData1, int eventData2)   
        {
        switch (event)      
        {
        case EVENT_CLOSE:
        QuitUserInterface (0);      
        break;
        }
        return 0;
        }
        //Ring 控件
        int CVICALLBACK arrow (int panel, int control, int event,   
        void *callbackData, int eventData1, int eventData2)      
        { //定义箭头的宽度或高度   
        int style; //定义箭头的数值
        int value;
        switch (event)
        {   
        case EVENT_COMMIT:
        // 判断设置箭头的宽度或高度
        GetCtrlVal (panelHandle, PANEL_BINARYSWITCH, &style);
        // 当设置箭头属性为宽度时
        if (style == 0)      
        { // 判断响应哪一控件事件
        switch (control)   
        { // 普通Ring 控件
        case PANEL_RING_PLAIN:
        GetCtrlVal (panelHandle, control, &value);
        SetCtrlAttribute (panel, control, 20472, value);   
        break;
        //Menu Ring 控件   
        case PANEL_RING_MENU:
        GetCtrlVal (panelHandle, control, &value);
        SetCtrlAttribute (panel, control, 20475, value);   
        break;
        //Recessed Menu Ring 控件
        case PANEL_RING_RECESSEDMENU:
        GetCtrlVal (panelHandle, control, &value);
        SetCtrlAttribute (panel, control, 20475, value);   
        break;
        //Popup Menu Ring 控件
        case PANEL_RING_POPUPMENU:
        GetCtrlVal (panelHandle, control, &value);
        SetCtrlAttribute (panel, control, 20475, value);   
        break;
        }
        } // 当设置箭头属性为高度时
        else   
        { // 普通Ring 控件不能设置高度属性
        if (control != PANEL_RING_PLAIN)   
                {      
                    GetCtrlVal (panelHandle, control, &value);
                    SetCtrlAttribute (panel, control, 20476, value);   
                }      
                }      
                break;   
          }            
          return 0;            
        }                     
       
        3:程序注释
        ①SetCtrlAttribute 函数设置控件属性。函数原型为:
        int SetCtrlAttribute (int Panel_Handle, int Control_ID, int Control_Attribute, ...); Control_Attribute :控件属性。...:控件属性值。
       
        ② 程序优化
        对于Ring 控件响应的arrow 回调函数而言,可进一步优化,将case 分支中的PANEL_RING_MENU 、PANEL_RING_RECESSEDMENU 和PANEL_RING_POPUPMENU 合并,以default 替代,则Ring 控件回调函数修改为:
       
        int CVICALLBACK arrow (int panel, int control, int event,   
        void *callbackData, int eventData1, int eventData2)      
        { //定义箭头的宽度或高度   
        int style; //定义箭头的数值
        int value;
        switch (event)
        {   
        case EVENT_COMMIT:
        // 判断设置箭头的宽度或高度
        GetCtrlVal (panelHandle, PANEL_BINARYSWITCH, &style); // 当设置箭头属性为宽度时
        if (style == 0)      
        { // 判断响应哪一控件事件
        switch (control)   
        { // 普通Ring 控件
        case PANEL_RING_PLAIN:
        GetCtrlVal (panelHandle, control, &value);
        SetCtrlAttribute (panel, control, 20472, value);   
        break;
        // 其他Ring 控件   
        default:   
        GetCtrlVal (panelHandle, control, &value);
                SetCtrlAttribute (panel, control, 20475, value);   
                break;
          }      
        }         
                // 当设置箭头属性为高度时
                else   
                {
                // 普通Ring 控件不能设置高度属性   
                if (control != PANEL_RING_PLAIN)   
                {
                GetCtrlVal (panelHandle, control, &value);
                SetCtrlAttribute (panel, control, 20476, value);   
                }
                }
                break;
          }      
          return 0;      
        }            
        若将GetCtrlVal 函数提到前边,又可减少代码量,Ring 控件回调函数修改为:
        int CVICALLBACK arrow (int panel, int control, int event,   
        void *callbackData, int eventData1, int eventData2)      
        {   
        //定义箭头的宽度或高度
        int style;
        //定义箭头的数值   
        int value;
        switch (event)
        {   
        case EVENT_COMMIT:
        // 判断设置箭头的宽度或高度
        GetCtrlVal (panelHandle, PANEL_BINARYSWITCH, &style);   
        GetCtrlVal (panelHandle, control, &value);
        // 当设置箭头属性为宽度时
        if (style == 0)      
        {
        // 判断响应哪一控件事件
        switch (control)   
        {
        // 普通Ring 控件   
        case PANEL_RING_PLAIN:
        SetCtrlAttribute (panel, control, 20472, value);   
        break;
        // 其他Ring 控件   
        default:   
        SetCtrlAttribute (panel, control, 20475, value);   
        break;
                }
                }
                // 当设置箭头属性为高度时
                else   
                {
                // 普通Ring 控件不能设置高度属性   
                if (control != PANEL_RING_PLAIN)   
                {
                SetCtrlAttribute (panel, control, 20476, value);   
                }
                }
                break;
          }      
          return 0;      
        }         
       
       
        (4)运行效果图
        点击工具栏中的Debug Project 按钮,程序开始运行,其效果如图1-8 所示。
       
        图1-8 运行效果图
页: [1]
查看完整版本: LabWindows/CVI虚拟仪器设计技术基本控件使用之:Ring 箭头设置