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

📄 sample3.c

📁 机械工业出版社 Lab Windows/CVI逐步深入与开发实例源代码
💻 C
字号:
#include <formatio.h>
#include <ansi_c.h>
#include <cvirte.h>		
#include <userint.h>
#include <toolbox.h>
#include "sample3.h"

#ifndef FALSE
#define FALSE 0
#define TRUE !FALSE
#endif

static int ClickIsOnCtrl (int panel, int control, int x, int y);
void UpdateTextBox (char* event_gen);

static int panelHandle;

void UpdateTextBox (char* event_gen)
//参数event_gen为指向字符串的指针
{
    char display_str[100];
    
    // Fmt函数位于格式化和I/O函数库中,用来改变变量的形式
    Fmt(display_str, "%s<%s\n", event_gen);

    //显示所发生事件消息    
    SetCtrlVal (panelHandle, PANEL_TEXTBOX, display_str);
}

static int ClickIsOnCtrl (int panel, int control, int x, int y)
{
    int height, width;
    
    //如果X坐标或者Y坐标小于0,退出
    if ((x < 0) || (y < 0))
        return FALSE;
        
    //如果control为0表示检测鼠标是否在面板上,
    //否则检测光标是否在控件上
    if (control == 0) 
    {
        //获取面板的高度和宽度
        GetPanelAttribute (panel, ATTR_HEIGHT, &height);
        GetPanelAttribute (panel, ATTR_WIDTH, &width);
    }
    else 
    {
        //获取控件的高度和宽度
        GetCtrlAttribute (panel, control, ATTR_HEIGHT, &height);
        GetCtrlAttribute (panel, control, ATTR_WIDTH, &width);
    }
    
   //检测X坐标和Y坐标是否分别小于面板或控件的宽度和高度 
   if ((y < height) && (x < width))
        return TRUE;
    else
        return FALSE;
}

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)	
		return -1;
		
	if ((panelHandle = LoadPanel (0, "sample3.uir", PANEL)) < 0)
		return -1;
		
	//添加的代码,设置控件TEXTBOX可使用扩展鼠标事件
    EnableExtendedMouseEvents (panelHandle, PANEL_TEXTBOX, 2);

    DisplayPanel (panelHandle);
	RunUserInterface ();
	
	//添加的代码,结束使用扩展鼠标事件
    DisableExtendedMouseEvents (panelHandle, PANEL_TEXTBOX);
	return 0;
}


int CVICALLBACK TimerCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
    int x, y, left, right, keys, panelX, panelY, ctrlX, ctrlY,iPanel;
    char coords[15];
    
    switch (event) 
    {
        //定时器触发事件
        case EVENT_TIMER_TICK:
        
            //获取鼠标绝对坐标和按键状态
            GetGlobalMouseState (&iPanel, &x, &y, &left, &right, &keys);
            
            //显示鼠标按键状态
            SetCtrlVal (panel, PANEL_LEFT, left);
            SetCtrlVal (panel, PANEL_RIGHT, right);
            
            //显示鼠标绝对坐标
            sprintf (coords, "(%ld, %ld)", x, y);
            SetCtrlVal (panel, PANEL_COORGLOBE, coords);
            
            //显示键盘按键状态
            SetCtrlVal (panel, PANEL_SHIFT, keys & VAL_SHIFT_MODIFIER);
            SetCtrlVal (panel, PANEL_CTRL, keys & VAL_MENUKEY_MODIFIER);
            
            //获取鼠标相对于面板的坐标
            GetRelativeMouseState (panel, 0, &panelX, &panelY, NULL,
                                   NULL, NULL);
                                   
            //显示鼠标相对于面板的坐标
            sprintf (coords, "(%ld, %ld)", panelX, panelY);
            SetCtrlVal (panel, PANEL_COORPANEL, coords);
            
            //获取鼠标相对于文本框控件的坐标         
            GetRelativeMouseState (panel, PANEL_TEXTBOX, &ctrlX, &ctrlY, NULL,
                                   NULL, NULL);
                                   
            //显示鼠标相对于文本框控件的坐标
            sprintf (coords, "(%ld, %ld)", ctrlX, ctrlY);
            SetCtrlVal (panel, PANEL_COORCTRL, coords);
            
            //判断面板是否处于激活状态
            if (GetActivePanel() == panel)
            {
                //判断鼠标是否处于面板上
                if (ClickIsOnCtrl (panel, 0, panelX, panelY)) 
                {
                    int i;
                    
                    //判断鼠标位置是否在文本框控件上
                    i=ClickIsOnCtrl (panel, PANEL_TEXTBOX, ctrlX, ctrlY);
                    
                    if (i)
                       //设置光标显示方式为十字形 
                       SetMouseCursor (VAL_HIDDEN_CURSOR);
                    else            
                       //设置光标显示方式为手指形       
                       SetMouseCursor (VAL_POINTING_FINGER_CURSOR);
                }
                else
                  //设置光标显示方式为默认形       
                  SetMouseCursor (VAL_DEFAULT_CURSOR);
            }
            else
                 //设置光标显示方式为默认形       
                 SetMouseCursor (VAL_DEFAULT_CURSOR);
            
            break;
    }
    return 0;
}

int CVICALLBACK SlideCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	
	double t;
	
    //判断事件类型
    switch (event)
		{
		
        //获取焦点事件 
        case EVENT_GOT_FOCUS :
            UpdateTextBox("Got Focus                Slide Control");
            break;
            
        //失去焦点事件 
        case EVENT_LOST_FOCUS :
            UpdateTextBox("Lost Focus               Slide Control");
            break;
            
        //控件值改变事件 
        case EVENT_VAL_CHANGED :
            UpdateTextBox("Value Changed            Slide Control");
            break;
            
        //点击事件 
        case EVENT_COMMIT :
            UpdateTextBox("Control Committed        Slide Control");
            GetCtrlVal (panel, control, &t);
            SetCtrlAttribute (panel, PANEL_TIMER, ATTR_INTERVAL, t);
            break;
            	 
			}
        
    return 0;

}

int CVICALLBACK PanelCallback (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
    
    int i,j;
    char keypushed[100];
    
    //判断事件类型
    switch (event)
		{
		
        //鼠标左键单击事件
        case EVENT_LEFT_CLICK :
            UpdateTextBox("Left Click              Panel            ");
            break;
            
        //鼠标右键单击事件
        case EVENT_RIGHT_CLICK :
            UpdateTextBox("Right Click             Panel            ");
            break;
            
        //鼠标左键双击事件
        case EVENT_LEFT_DOUBLE_CLICK :
            UpdateTextBox("Left Double Click       Panel            ");
            break;
            
        //鼠标右键双击事件
        case EVENT_RIGHT_DOUBLE_CLICK :
            UpdateTextBox("Right Double Click      Panel            ");
            break;
            
        //键盘按键事件
        case EVENT_KEYPRESS :
        
            //参数 eventData1表示按键值及其状态,
            //具体说明参见本章提高部分    
            if ((eventData1 & VAL_ASCII_KEY_MASK) != 0)
            {
				sprintf (keypushed, "Keypress detected     %c was pressed \n",
						 eventData1);
                SetCtrlVal (panel, PANEL_TEXTBOX, keypushed);
            }
            
            break;
            
        //面板缩放事件
        case EVENT_PANEL_SIZE :
            UpdateTextBox("Panel Resize            Panel");
            break;
            
        //面板移动事件
        case EVENT_PANEL_MOVE :
            UpdateTextBox("PanZel Moved            Panel");
            break;
            
        //面板关闭事件
        case EVENT_CLOSE :
            UpdateTextBox("Panel Close Event       Panel");
			QuitUserInterface (0);
			break;

		}
	return 0;
}

int CVICALLBACK ToggleCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	
	int i;
	
    //判断事件类型
    switch (event)
		{
		
		//控件被点击,包括鼠标左键单击和键盘回车输入
		case EVENT_COMMIT:
            //设置定时器Enable属性
            GetCtrlVal(panel,control,&i);
			SetCtrlAttribute (panel, PANEL_TIMER, ATTR_ENABLED, i);
            
            UpdateTextBox("Control Commit          ToggleButton");
			break;
			
        //控件值改变事件
        case EVENT_VAL_CHANGED:
            UpdateTextBox("Value Changed           ToggleButton");
			break;
			
        //鼠标左键单击事件
        case EVENT_LEFT_CLICK:
            UpdateTextBox("Left Click              ToggleButton");
			break;
			
        //鼠标左键双击事件
        case EVENT_LEFT_DOUBLE_CLICK:
            UpdateTextBox("Left Double Click       ToggleButton");
			break;
			
	    //鼠标右键单击事件
	    case EVENT_RIGHT_CLICK:
            UpdateTextBox("Right Click             ToggleButton");
			break;
			
	    //鼠标右键双击事件
	    case EVENT_RIGHT_DOUBLE_CLICK:
            UpdateTextBox("Right Double Click      ToggleButton");
			break;
			
	    //获得焦点事件
	    case EVENT_GOT_FOCUS:
            UpdateTextBox("Got Focus               ToggleButton");
			break;
			
	    //失去焦点事件
	    case EVENT_LOST_FOCUS:
            UpdateTextBox("Lost Focus              ToggleButton");
			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 TextBoxCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
         //鼠标移动事件
         case EVENT_MOUSE_MOVE:
            UpdateTextBox("Mouse Move               TextBox Control");
    	    break;
     
         //鼠标左键弹起
         case EVENT_LEFT_MOUSE_UP:
            UpdateTextBox("Left Mouse Up            TextBox Control");
    		break;

         //鼠标右键弹起
         case EVENT_RIGHT_MOUSE_UP:
            UpdateTextBox("Right Mouse Up           TextBox Control");
    		break;
		}
	return 0;
}

⌨️ 快捷键说明

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