📄 sample9.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 + -