DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3077|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 07:21:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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 运行效果图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-8-1 20:11 , 耗时 0.098241 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表