📄 dlg_draw.cpp
字号:
// 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 + -