⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample9.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <cvirte.h>		/* Needed if linking in external compiler; harmless otherwise */
#include <userint.h>
#include <toolbar.h>
#include <movectrl.h>
#include <easytab.h>
#include "sample9.h"

//在C文件头部添加以下定义,在该工程下创建buttons文件夹,
//并加入以下bmp文件,作为工具栏按扭显示图形
#define IMAGE_OPEN    "buttons/open.bmp"
#define IMAGE_SAVE    "buttons/save.bmp"
#define IMAGE_PAGE1   "buttons/page1.bmp"
#define IMAGE_PAGE2   "buttons/page2.bmp"
#define IMAGE_HELP    "buttons/help.bmp"

char Target[][20]={"Linux","Win 95","Win NT","Win 3.11","DOS","Mac OS"};

static int panelHandle,menuRingControl,page1,page2,tabCtrl;

ToolbarType toolBarHandle;

static ToolbarType InstallToolBar(int panel);

int CVICALLBACK PageSelectCallback (int panel, int control, int event,
    void *callbackData, int eventData1, int eventData2);
int CVICALLBACK menuRingCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2);
		
int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)	
		return -1;
		
	if ((panelHandle = LoadPanel (0, "sample9.uir", PANEL)) < 0)
		return -1;
		
    //安装工具栏
    toolBarHandle = InstallToolBar(panelHandle);
    
	//设置NUMERICTANK为可移动控件
	MakeMovableCtrl (panelHandle, PANEL_NUMERICTANK, "", 0, 1, 1, 1);
	
    //将CANVAS控件转换成选项卡控件
    tabCtrl = EasyTab_ConvertFromCanvas(panelHandle, PANEL_CANVAS);
    
	//向选项卡控件添加子面板 
	EasyTab_LoadPanels (panelHandle, tabCtrl, 1, "sample9.uir",
						__CVIUserHInst,
						MOVEATTR, &page1, CTRLSET, &page2, 0);
						
    //本章习题和练习题的答案添加的代码
    //设置工具栏中的ToggelButton控件的值
    Toolbar_SetItemVal (toolBarHandle, 3, 1);

    //显示面板并进入消息循环  
    DisplayPanel (panelHandle);
	RunUserInterface ();
	
    //消息循环结束后,释放工具栏句柄
    Toolbar_Discard(toolBarHandle);
	return 0;
}

static ToolbarType InstallToolBar(int panel)
{
    //定义工具栏句柄变量
    ToolbarType toolbar;
    int i;    
    
    //创建一新工具栏,如不成功,返回
    if (Toolbar_New (panel, GetPanelMenuBar(panel), "", 0, 0, 1, 1, &toolbar) < 0)
        return 0;

	//向工具栏中添加两个按扭,按扭的回调类型为菜单回调,
    //分别对应着MENU_FILE_OPEN和MENU_FILE_SAVE两个菜单项
	Toolbar_InsertItem (toolbar, END_OF_LIST, kCommandButton, 1, "Open",
						kMenuCallback, MENU_FILE_OPEN, NULL, NULL,
						IMAGE_OPEN);

	Toolbar_InsertItem (toolbar, END_OF_LIST, kCommandButton, 1, "Save",
						kMenuCallback, MENU_FILE_SAVE, NULL, NULL,
						IMAGE_SAVE);

    //向工具栏中添加两个切换按扭,按扭的回调类型为控件回调,
    //回调函数PageSelectCallback将在后面介绍,区别两控件的是回调数据,
    //分别设为(void*)1和(void*)2
    Toolbar_InsertItem (toolbar, END_OF_LIST, kExclusiveToggleButton, 1, "Page 1",
                        kControlCallback, NULL, PageSelectCallback, (void*)1, IMAGE_PAGE1);
                        
    Toolbar_InsertItem (toolbar, END_OF_LIST, kExclusiveToggleButton, 1, "Page 2",
                        kControlCallback, NULL, PageSelectCallback, (void*)2, IMAGE_PAGE2);
                        
    //向工具栏中添加一分割条
    Toolbar_InsertItem (toolbar, END_OF_LIST, kSeparator, 1, NULL,
                        kNoCallback, 0, NULL, NULL, NULL);

	//向工具栏中添加一Ring控件,
    //回调函数menuRingCallback将在后面介绍
	Toolbar_InsertItem (toolbar, END_OF_LIST, kRing, 1, "Operate System",
						kControlCallback, NULL, menuRingCallback, NULL,
						NULL);
                        
    //根据工具栏中Ring控件的标签获取控件的ID号 
    Toolbar_GetCtrlFromDescription (toolbar, "Operate System", &panel,
									&menuRingControl);
									
    //设置Ring控件的宽度
    Toolbar_SetItemAttribute (toolbar, menuRingControl,
							  TOOLBAR_ATTR_WIDTH, 100);
							  
    //向Ring控件中添加项目,Target在文件前已定义
    for (i=0; i<6; i++)
          InsertListItem (panel, menuRingControl, -1, Target[i], i);

    //向工具栏中添加一按扭,对应MENU_HELP_CONTENT菜单项
    Toolbar_InsertItem (toolbar, END_OF_LIST, kCommandButton, 1, "Help",
						kMenuCallback, MENU_HELP_CONTENT, NULL, NULL,
						IMAGE_HELP);
 
    //显示菜单栏
    Toolbar_Display (toolbar);

    //返回工具栏句柄
    return toolbar;
}

int CVICALLBACK PageSelectCallback (int panel, int control, int event,
    void *callbackData, int eventData1, int eventData2)
{
   //判断发生事件的控件
   if((int)callbackData==1) 
   {
       //设置选项卡中page1页面处于激活状态
      EasyTab_SetAttribute (panelHandle, tabCtrl,
						 ATTR_EASY_TAB_ACTIVE_PANEL, page1);
						 
      SetCtrlVal (panelHandle, PANEL_STRING, "Page 1");
   }
   
  if((int)callbackData==2) 
   {
      //设置选项卡中page2页面处于激活状态
      EasyTab_SetAttribute (panelHandle, tabCtrl,
						 ATTR_EASY_TAB_ACTIVE_PANEL, page2);
						 
      SetCtrlVal (panelHandle, PANEL_STRING, "Page 2");
   }
   return 1;
}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_CLOSE:
		
			QuitUserInterface (0);
			
			break;
		}
	return 0;
}

int CVICALLBACK QuitCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
		
			QuitUserInterface (0);
			
			break;
		}
	return 0;
}

int CVICALLBACK menuRingCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int i;
	switch (event)
		{
		case EVENT_COMMIT:
		
            //获取Ring控件当前值
            GetCtrlVal (panel, control, &i);
            
            //显示Ring控件当前值
            SetCtrlVal (panelHandle, PANEL_STRING, Target[i]);
			break;
		}
	return 0;
}

void CVICALLBACK OpenFile (int menuBar, int menuItem, void *callbackData,
		int panel)
{
   SetCtrlVal (panel, PANEL_STRING, "Open File");
}

void CVICALLBACK SaveFile (int menuBar, int menuItem, void *callbackData,
		int panel)
{
   SetCtrlVal (panel, PANEL_STRING, "Save File");
}

void CVICALLBACK Exit (int menuBar, int menuItem, void *callbackData,
		int panel)
{
	QuitUserInterface (0);
}

void CVICALLBACK Content (int menuBar, int menuItem, void *callbackData,
		int panel)
{
   SetCtrlVal (panel, PANEL_STRING, "Help Content");
}


int CVICALLBACK SetSizable (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    int sizable;
    switch (event)
    {
        case EVENT_COMMIT:
        
            //获取SIZABLE控件值
            GetCtrlVal (panel, control, &sizable);
            
            //设置NUMERICTANK控件可缩放属性
            SetMovableCtrlAttribute (panelHandle, PANEL_NUMERICTANK,
									 MOVECTRL_ATTR_CTRL_SIZABLE, sizable);
            break;
    }
    return 0;
}


int CVICALLBACK SetLabelMovable (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    int labelMovable;
    switch (event)
    {
        case EVENT_COMMIT:
        
            //获取LABELMOVABLE控件值
            GetCtrlVal (panel, control, &labelMovable);
            
            //设置NUMERICTANK控件标签可移动属性
            SetMovableCtrlAttribute (panelHandle, PANEL_NUMERICTANK,
                                     MOVECTRL_ATTR_LABEL_MOVABLE, labelMovable);
            break;
    }
    return 0;
}

int CVICALLBACK SetMovable (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    int movable;
    switch (event)
    {
        case EVENT_COMMIT:
        
            //获取MOVABLE控件值
            GetCtrlVal (panel, control, &movable);
            
            //设置NUMERICTANK控件可移动属性
            SetMovableCtrlAttribute (panelHandle, PANEL_NUMERICTANK,
                                     MOVECTRL_ATTR_CTRL_MOVABLE, movable);
            break;
    }
    return 0;
}

int CVICALLBACK SelectHistoryItem (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    char configName[256];
    
    switch (event)
    {
        case EVENT_COMMIT:
        
			//获取NAMEHISTORY控件的值
			GetCtrlVal (panel, CTRLSET_NAMEHISTORY, configName);
			
			//将选中的配置名显示于CONFIGNAME控件
			SetCtrlVal (panel, CTRLSET_CONFIGNAME, configName);
            break;
    }
    return 0;
}

int CVICALLBACK SaveSetting (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    char configName[256];
    int numItems, prevIndex;
    
    switch (event)
    {
        case EVENT_COMMIT:
        
			//获取CONFIGNAME控件的值
			GetCtrlVal (panel, CTRLSET_CONFIGNAME, configName);
			
            //应用SaveMovableCtrlSettings函数保存可移动控件的属性
            SaveMovableCtrlSettings (panelHandle, PANEL_NUMERICTANK, configName);

            //NAMEHISTORY控件中是否已有值为configName的项目
            GetIndexFromValue (panel, CTRLSET_NAMEHISTORY, &prevIndex, configName);
			
            //如果没有,向NAMEHISTORY控件添加标签和值都为configName的项目
            if (prevIndex == -1)
            {
				InsertListItem (panel, CTRLSET_NAMEHISTORY, -1, configName,
								configName);
								
				GetNumListItems (panel, CTRLSET_NAMEHISTORY, &numItems);
				
                SetCtrlIndex (panel, CTRLSET_NAMEHISTORY, numItems - 1);
            }
            break;
    }
    return 0;
}


int CVICALLBACK LoadSetting (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    char configName[256];
    int movable, sizable, labelMovable;
    
    switch (event)
    {
        case EVENT_COMMIT:
			//获取控件CONFIGNAME的值
			GetCtrlVal (panel, CTRLSET_CONFIGNAME, configName);
			
            //加载可移动控件的属性
            LoadMovableCtrlSettings (panelHandle, PANEL_NUMERICTANK, configName);
            
	        //获取可移动控件的属性,
	        GetMovableCtrlAttribute (panelHandle, PANEL_NUMERICTANK,
							 MOVECTRL_ATTR_CTRL_MOVABLE, &movable);
	        GetMovableCtrlAttribute (panelHandle, PANEL_NUMERICTANK,
                             MOVECTRL_ATTR_CTRL_SIZABLE, &sizable);
	        GetMovableCtrlAttribute (panelHandle, PANEL_NUMERICTANK,
                             MOVECTRL_ATTR_LABEL_MOVABLE, &labelMovable);
    
	        //更新MOVABLE、SIZABLE、LABELMOVABLE的值
	        SetCtrlVal (page1, MOVEATTR_MOVABLE, movable);
            SetCtrlVal (page1, MOVEATTR_SIZABLE, sizable);
            SetCtrlVal (page1, MOVEATTR_LABELMOVABLE, labelMovable);
            break;
    }
    return 0;
}

//本章习题和练习题答案添加的代码
int CVICALLBACK CanvasCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int page;
	switch (event)
		{
		//页面切换事件
		case EVENT_TAB_CHANGED:
		
			//获取处于激活状态的页面
			EasyTab_GetAttribute (panelHandle, tabCtrl,
								  ATTR_EASY_TAB_ACTIVE_PANEL, &page);
								  
            //设置工具栏ToggleButton控件的值
            if(page==page1)
			   Toolbar_SetItemVal (toolBarHandle, 3, 1);
			else
			   Toolbar_SetItemVal (toolBarHandle, 4, 1);
			break;
		}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -