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

📄 dlg_draw.cpp

📁 功能非常强大的数据采集系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DLG_DRAW.cpp : implementation file
//

#include "stdafx.h"
#include "Ncap.h"
#include "DLG_DRAW.h"
#include "ADOConn.h"
#include "DLG_QUERY.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CNcapApp theApp;
/////////////////////////////////////////////////////////////////////////////
// DLG_DRAW dialog
// colors

typedef struct {
	COLORREF crColour;			// color 
	TCHAR    *szName;			// color name
}	v_sColour_stru;

static v_sColour_stru v_sColours[] =
{ 
	{ RGB(0xD2, 0xB4, 0x8C),    _T("棕黄")              },
	{ RGB(0xFF, 0x00, 0x00),    _T("红色")              },    
	{ RGB(0x00, 0x00, 0x8B),    _T("深蓝")				},
	{ RGB(0x00, 0x00, 0x00),    _T("黑色")				},
	{ RGB(0x00, 0x93, 0x00),    _T("绿色")				},    
	{ RGB(0x8B, 0x8B, 0x00),    _T("深黄")				},
	{ RGB(0x80, 0x00, 0x80),    _T("紫色")				},    
	{ RGB(0xFF, 0x68, 0x20),    _T("桔黄")				},    
	{ RGB(0x00, 0x40, 0x40),    _T("橄榄绿")			},
	{ RGB(0xA5, 0x2A, 0x00),    _T("褐色")				},
	{ RGB(0x38, 0x8E, 0x8E),    _T("青色")              },
	{ RGB(0x00, 0xFF, 0x00),    _T("鲜绿")				},
	{ RGB(0x4B, 0x00, 0x82),    _T("靛蓝")				},
	{ RGB(0xFF, 0xD7, 0x00),    _T("金色")              },
	{ RGB(0x40, 0xE0, 0xD0),    _T("青绿")				},
	{ RGB(0xD2, 0xB4, 0x8C),    _T("棕黄")              },
	{ RGB(0x68, 0x83, 0x8B),    _T("淡蓝")				},

//	{ RGB(0x00, 0x00, 0x5E),    _T("深灰蓝")		    },
//	{ RGB(0x00, 0x00, 0xFF),    _T("蓝色")              },
//	{ RGB(0x48, 0x00, 0x48),    _T("梅红")              },
//	{ RGB(0x00, 0x55, 0x00),    _T("深绿")				},
//	{ RGB(0x7B, 0x7B, 0xC0),    _T("蓝-灰")				},
//	{ RGB(0x66, 0x66, 0x66),    _T("灰-40%")			},
//	{ RGB(0x7D, 0x9E, 0xC0),    _T("浅蓝")				},
//	{ RGB(0x32, 0xCD, 0x32),    _T("酸橙色")            }, 
//	{ RGB(0xFF, 0xAD, 0x5B),    _T("浅桔黄")			},
//	{ RGB(0x7F, 0x7F, 0x7F),    _T("灰-50%")			},
//	{ RGB(0x28, 0x28, 0x28),    _T("灰-80%")			},
//	{ RGB(0xFF, 0xC0, 0xCB),    _T("粉红")              },    
//	{ RGB(0x8B, 0x00, 0x00),    _T("深红")			    },
//	{ RGB(0x00, 0x00, 0x00),    _T("黑色")				},
//	{ RGB(0x7F, 0xFF, 0xD4),    _T("宝石蓝")            },
//	{ RGB(0x3C, 0xB3, 0x71),    _T("海绿")				},
//	{ RGB(0xFF, 0xFF, 0x00),    _T("黄色")				},    
//	{ RGB(0xC0, 0xFF, 0xFF),    _T("天蓝")				},
//	{ RGB(0xC0, 0xC0, 0xC0),    _T("灰-25%")			},
//	{ RGB(0xFF, 0xFF, 0xE0),    _T("浅黄")				},
//	{ RGB(0xAF, 0xEE, 0xEE),    _T("浅青绿")			},
//	{ RGB(0xE6, 0xE6, 0xFA),    _T("淡紫")				},
//	{ RGB(0xFF, 0xE4, 0xE1),    _T("玫瑰红")            },
//	{ RGB(0x98, 0xFB, 0x98),    _T("浅绿")				},
//	{ RGB(0xFF, 0xFF, 0xFF),    _T("白色")				}
};

const int v_iColourCount = sizeof(v_sColours) / sizeof(v_sColour_stru);


DLG_DRAW::DLG_DRAW(CWnd* pParent /*=NULL*/)
	: CDialog(DLG_DRAW::IDD, pParent)
{
	//{{AFX_DATA_INIT(DLG_DRAW)
	m_iInput = 0;
	m_iMax = 0;
	m_sUnit = _T("");
	//}}AFX_DATA_INIT
	v_pCurveCtrl = NULL;												//绘制图形指针
	v_iCurveCount = 0;													//绘制图形序号
}


void DLG_DRAW::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DLG_DRAW)
	DDX_Control(pDX, IDC_Y_SCALE, m_cY_scale);
	DDX_Control(pDX, IDC_MOVE_NUM, m_cMove_num);
	DDX_Control(pDX, IDC_NAME, m_cName);
	DDX_Control(pDX, IDC_CURVE, m_cCurve);
	DDX_Control(pDX, IDC_RIGHT, m_cRight);
	DDX_Control(pDX, IDC_LEFT, m_cLeft);
	DDX_Control(pDX, IDC_DEC, m_cDec);
	DDX_Control(pDX, IDC_ALL, m_cAll);
	DDX_Control(pDX, IDC_ADD, m_cAdd);
	DDX_Text(pDX, IDC_DRAW_INPUT, m_iInput);
	DDX_Text(pDX, IDC_DRWA_MAX, m_iMax);
	DDX_Text(pDX, IDC_DRAW_UNIT, m_sUnit);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DLG_DRAW, CDialog)
	//{{AFX_MSG_MAP(DLG_DRAW)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_DEC, OnDec)
	ON_BN_CLICKED(IDC_RIGHT, OnRight)
	ON_BN_CLICKED(IDC_ALL, OnAll)
	ON_BN_CLICKED(IDC_LEFT, OnLeft)
	ON_WM_SIZE()
	ON_BN_CLICKED(IDC_READ, OnRead)
	ON_CBN_SELCHANGE(IDC_MOVE_NUM, OnSelchangeMoveNum)
	ON_WM_MOUSEWHEEL()
	ON_BN_CLICKED(IDC_Y_SCALE, OnYScale)
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DLG_DRAW message handlers

//-------------------------------------------------------------------------------------------------
// 窗体缩放处理
// 参数:
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CRect rect;
	GetWindowRect(rect);
	ScreenToClient(rect);

	CRect ctrrect;

	if (v_pCurveCtrl)
	{
		v_pCurveCtrl->GetWindowRect(ctrrect);
		ScreenToClient(ctrrect);

		CRect newrect(ctrrect.left, ctrrect.top, rect.right - 15,  rect.bottom - 15);
		v_pCurveCtrl->MoveWindow(newrect);
	}

	Invalidate();	
}

//-------------------------------------------------------------------------------------------------
// 消息预处理(主要针对按键处理)
//-------------------------------------------------------------------------------------------------
BOOL DLG_DRAW::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
	{
		CDialog* Pwnd=(CDialog*)GetActiveWindow();						//取得对话框指针 
		Pwnd->NextDlgCtrl();											//切换到下一个输入焦点 
		return true;
	}
	
	return CDialog::PreTranslateMessage(pMsg);
}

//-------------------------------------------------------------------------------------------------
// 初始化对话窗信息
//-------------------------------------------------------------------------------------------------
BOOL DLG_DRAW::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	int			v_iIndex,v_iNum,v_iNumber;								//临时变量
	CString		v_sTemp,v_sTemp1,v_sNum,v_sUnit;						//临时变量

	DLG_QUERY	*v_pParent=(DLG_QUERY *)GetParent();					//获得父窗口指针
	
	//显示位置坐标初始化
	CRect v_cRect;														//定义矩形变量:显示位置
	m_cCurve.GetWindowRect(v_cRect);									//获得显示区域的位置数据
	ScreenToClient(v_cRect);											//将点坐标转换为相对于客户区的坐标
	
	if (NULL == v_pCurveCtrl)
	{
		v_pCurveCtrl = new CCurveCtrl;									//生成新的曲线绘制实例
		v_pCurveCtrl->Create(v_cRect, this, ID_CURVE_CONTROL);			//设置控件栅格线当前的风格
		v_pCurveCtrl->SetGridLineStyle(PS_DOT);							//线型:点线笔
		v_pCurveCtrl->SetMargin(CRect(70, 60, 50, 60));					//设置显示区域边框的空白
	}
	
	//绘图实验数据处理
	v_iXmax_dot=0;														//采集点数
	v_iXh=0;															//图形序号
	for(v_iNum=0;v_iNum<v_pParent->m_iSum;v_iNum++)						//查找实验编号
	{
		v_sNum=v_pParent->m_cList.GetItemText(v_iNum,0);				//选取标志
		if(v_sNum==" √")												//有效?
		{
			v_iXh++;													//图形序号加一
			v_sNum=v_pParent->m_cList.GetItemText(v_iNum,1);			//实验编号
			v_sTemp.Format("%02d",v_iXh);
			v_sTemp+=":编号("+v_sNum+");名称("+v_pParent->m_cList.GetItemText(v_iNum,2)+")";
			m_cName.AddString(v_sTemp);									//下拉窗口添加数据
			v_iDs_time=atoi(v_pParent->m_cList.GetItemText(v_iNum,3));	//时间间隔
			v_iNumber=atoi(v_pParent->m_cList.GetItemText(v_iNum,4));	//采集点数
			v_iXmax_dot=max(v_iXmax_dot,v_iNumber);
			v_sUnit=v_pParent->m_cList.GetItemText(v_iNum,5);			//物理量
			//读取数据库实验数据,并绘制图形
			v_iCurveCount++;											//绘制图形序号
			v_sTemp.Format("%02d_", v_iCurveCount);						//曲线名称
			v_iIndex=v_pCurveCtrl->AddCurve(v_sTemp+v_sNum, v_sColours[v_iXh % v_iColourCount].crColour);
																		//增加一条曲线、名称及其显示色彩	
			We_open(v_sNum,v_sTemp+v_sNum,v_iNumber);					//数据库数据读取及处理
		}
	}
	m_cName.SetCurSel(0);												//显示第一个实验编号
	m_sUnit=v_sUnit;													//物理量
	m_iInput=v_iDs_time;												//时间间隔
	m_iMax=v_iXmax_dot;													//采集点数
	m_cMove_num.SetCurSel(4);											//移动点数控制
	v_iMove_num=5;														//移动点数

	//图形绘制参数设置
	v_iXmax_page=(int(v_iXmax_dot/10)+1)*10;							//全屏显示点数
	v_iPage=v_iXmax_page;												//全屏显示点数
	v_pCurveCtrl->m_fHoriBegin=float(0);								//初始化显示X坐标:原点为0
	v_pCurveCtrl->m_fHoriEnd=float(v_iPage);							//初始化显示X坐标:全屏显示
	v_pCurveCtrl->Invalidate();											//图形显示
	v_pCurveCtrl->SetVertLabel(m_sUnit);								//设置实验物理量
	v_pCurveCtrl->SetHoriLabel(theApp.a_sXunit);						//设置x轴显示内容
	m_cY_scale.SetCheck(true);											//Y轴按比例变化
	v_pCurveCtrl->m_bVert=true;											//设置按比例变化标志

	//屏幕按钮控制
	m_cAdd.EnableWindow(v_iXmax_page>10?true:false);					//放大有/无效
	m_cDec.EnableWindow(false);											//缩小无效
	m_cAll.EnableWindow(false);											//全屏无效

	ShowWindow(SW_SHOWMAXIMIZED);										//屏幕最大化
	UpdateData(false);													//屏幕显示

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

//-------------------------------------------------------------------------------------------------
// 功能:曲线放大
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnAdd() 
{
	// TODO: Add your control notification handler code here
	CPoint	pt;															//临时变量
	pt.x=0;																//
	pt.y=0;																//
	We_add(pt);															//曲线放大
}

//-------------------------------------------------------------------------------------------------
// 功能:图形绘制->缩小
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnDec() 
{
	// TODO: Add your control notification handler code here
	int		v_iNum;														//临时变量

	//显示位置控制
	if(v_iPage>=v_iXmax_page)
		return;
	v_iPage=v_iPage*2;													//一屏显示点数
	if(v_iPage>=v_iXmax_page)
	{
		v_iPage=v_iXmax_page;
		v_pCurveCtrl->m_fHoriBegin=float(0);							//初始化显示X坐标:原点为0
		v_pCurveCtrl->m_fHoriEnd=float(v_iPage);						//初始化显示X坐标:满屏显示
	}
	else
	{
		v_iNum=v_pCurveCtrl->m_fHoriBegin-v_iPage/4;
		if(v_iNum<=0)
			v_iNum=0;
		v_pCurveCtrl->m_fHoriBegin=float(v_iNum);						//初始化显示X坐标:原点为v_iNum
		v_pCurveCtrl->m_fHoriEnd=float(v_pCurveCtrl->m_fHoriBegin+v_iPage);	
																		//初始化显示X坐标:一屏显示
	}
	v_pCurveCtrl->Invalidate();											//图形显示		
	//屏幕按钮控制
//	if(v_pCurveCtrl->m_fHoriBegin<=0)									//大雨原点?
//		m_cLeft.EnableWindow(false);									//左移按钮无效
//	if(v_pCurveCtrl->m_fHoriEnd>v_iXmax_dot)							//小于最大采集点数
//		m_cRight.EnableWindow(false);									//右移按钮无效	
	if(v_iPage>10)
		m_cAdd.EnableWindow(true);										//放大有效
	if(v_iPage==v_iXmax_page)
	{
		m_cDec.EnableWindow(false);										//缩小有效
//		m_cAll.EnableWindow(false);										//全屏无效
	}
//	else
//		m_cAll.EnableWindow(true);										//全屏有效
}

//-------------------------------------------------------------------------------------------------
// 功能:图形绘制->左移一点
// 参数:无
//-------------------------------------------------------------------------------------------------
void DLG_DRAW::OnLeft() 
{
	// TODO: Add your control notification handler code here
 	int		v_iNum;														//临时变量
 
 	//显示位置控制
 	v_iNum=v_pCurveCtrl->m_fHoriBegin-v_iMove_num;						//左移移动点数
 	v_pCurveCtrl->m_fHoriBegin=float(v_iNum);							//初始化显示X坐标:原点为v_iNum

⌨️ 快捷键说明

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