// MFCApplication1Dlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMFCApplication1Dlg 对话框
CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
xLine = 0;
m_dYTop = 10;
m_dYBottom = 0;
m_dXRight = 8;
m_dXLeft = 0;
}
void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_1, m_Static);
}
BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
END_MESSAGE_MAP()
// CMFCApplication1Dlg 消息处理程序
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
SetTimer(0, 1000, NULL);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMFCApplication1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCApplication1Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWnd *pWin = GetDlgItem(IDC_STATIC_1);
CRect rect;
pWin->GetClientRect(rect);
m_rtWave.SetRect(rect.left, rect.top, rect.right, rect.bottom);
CDC *pDc = pWin->GetDC();
m_MemDC.CreateCompatibleDC(pDc);
m_MemBitmap.CreateCompatibleBitmap(pDc, rect.Width(), rect.Height());
//把内存位图选进内存DC中用来保存在内存DC中绘制的图形
m_MemDC.SelectObject(&m_MemBitmap);
rtWave.SetRect(m_rtWave.left + 60, m_rtWave.top + 30, m_rtWave.right - 60, m_rtWave.bottom - 30);
xLine++;
num = rand() / 10;
ValSave.insert(ValSave.end(),num);
DrawBK(&m_MemDC);
DrawWave(&m_MemDC);
pDc->BitBlt(0, 0, m_rtWave.Width(), m_rtWave.Height(), &m_MemDC, 0, 0, SRCCOPY);
m_MemBitmap.DeleteObject();
m_MemDC.DeleteDC();
ReleaseDC(pDc);
CDialogEx::OnTimer(nIDEvent);
}
void CMFCApplication1Dlg::DrawBK(CDC * pDC)
{
// TODO: 在此处添加实现代码.
//画背景
CBrush myBrush;
myBrush.CreateSolidBrush(RGB(192, 250, 233));
pDC->FillRect(m_rtWave, &myBrush);
pDC->FillSolidRect(m_rtWave, RGB(192, 250, 233));
CSize sz;
CString s;
CPoint pts[10];
CPen penDot;
penDot.CreatePen(PS_DOT, 1, RGB(100, 100, 100));
CPen* pOldPen = NULL;
CFont* pOldFont = NULL;
// 画X轴网格和刻度
int cx;
int nPos;
int nXCount = 10;
int dXStep = 0;
CString m_strXName;
cx = rtWave.Width() / nXCount;
s.Format(_T("%d"), ValSave.size());
sz = pDC->GetTextExtent(s);
if (cx < sz.cx+5)
{
cx = sz.cx+5;
nXCount = rtWave.Width() / cx;
}
double x;
m_dXRight = max(m_dXRight, xLine);
if (nXCount > 0)
{
dXStep = (int)((m_dXRight - m_dXLeft) / nXCount);
dXStep = max(1, dXStep);
nXCount = (int)((m_dXRight - m_dXLeft) / dXStep);
}
x = m_dXLeft;
s.Format(_T("%d"), x);
sz = pDC->GetTextExtent(s);
pDC->SetTextColor(RGB(10, 10, 10));
pDC->TextOut(rtWave.left - sz.cx / 2, rtWave.bottom + sz.cy / 2, s);
pDC->SelectObject(&penDot);
for (int i = 0; i < nXCount; i++)
{
x += dXStep;
nPos = (int)((x - m_dXLeft)*rtWave.Width() / (m_dXRight - m_dXLeft));
pts[0].x = rtWave.left + nPos; pts[0].y = rtWave.top;
pts[1].x = rtWave.left + nPos; pts[1].y = rtWave.bottom;
pDC->Polyline(pts, 2);
s.Format(_T("%.0f"), x);
sz = pDC->GetTextExtent(s);
pDC->TextOut(rtWave.left + nPos - sz.cx / 2, rtWave.bottom + sz.cy / 2, s);
}
// X轴名称
pDC->SetTextColor(RGB(10, 10, 10));
m_strXName = "时间(s)";
sz = pDC->GetTextExtent(m_strXName);
pDC->TextOut(rtWave.left + rtWave.Width() + 2, rtWave.bottom - sz.cy / 2, m_strXName);
// 画Y轴网格和刻度
int cy;
int nYCount = 8;
CString m_strYName;
cy = rtWave.Height() / nYCount;
sz = pDC->GetTextExtent(_T("123456"));
if (cy < sz.cy)
{
cy = sz.cy;
nYCount = rtWave.Height() / cy;
}
double dYStep = 0;
double y;
m_dYTop = max(m_dYTop, num);
if (nYCount > 0)
{
dYStep = (m_dYTop - m_dYBottom) / nYCount;
}
y = m_dYBottom;
s.Format(_T("%.2f"), y);
sz = pDC->GetTextExtent(s);
pDC->SetTextColor(RGB(10, 10, 10));
pDC->TextOut(rtWave.left - sz.cx - 5, rtWave.bottom - sz.cy / 2, s);
pDC->SelectObject(&penDot);
for (int i = 0; i < nYCount; i++)
{
y += dYStep;
nPos = (int)((y - m_dYBottom)*rtWave.Height() / (m_dYTop - m_dYBottom));
pts[0].x = rtWave.left; pts[0].y = rtWave.bottom - nPos;
pts[1].x = rtWave.right; pts[1].y = rtWave.bottom - nPos;
pDC->Polyline(pts, 2);
//压力
s.Format(_T("%.2f"), y);
sz = pDC->GetTextExtent(s);
pDC->TextOut(rtWave.left - sz.cx - 5, rtWave.bottom - nPos - sz.cy / 2, s);
}
// Y轴名称
pDC->SetTextColor(RGB(10, 10, 10));
m_strYName = "压力(kPa)";
sz = pDC->GetTextExtent(m_strYName);
pDC->TextOut(rtWave.left - sz.cx / 2, rtWave.top - sz.cy * 3 / 2, m_strYName);
//画XY轴
CPen pen(PS_INSIDEFRAME, 2, RGB(0, 0, 192)); //设置画笔
CPen GreenPen(PS_INSIDEFRAME, 2, RGB(0, 255, 0));
CPen YellowPen(PS_INSIDEFRAME, 2, RGB(250, 250, 0));
pDC->SelectObject(&pen);
pts[0].x = rtWave.left; pts[0].y = rtWave.top;
pts[1].x = rtWave.left; pts[1].y = rtWave.bottom;
pts[2].x = rtWave.right; pts[2].y = rtWave.bottom;
pDC->Polyline(pts, 3);
pDC->SelectObject(pOldPen);
pDC->SelectOb
没有合适的资源?快使用搜索试试~ 我知道了~
MFC基于Static控件的双缓存实时曲线
共41个文件
tlog:9个
h:6个
cpp:3个
4星 · 超过85%的资源 需积分: 25 6 下载量 162 浏览量
2023-02-23
18:01:53
上传
评论
收藏 71.43MB ZIP 举报
温馨提示
在实际运用中经常需要绘制实时曲线,网上大多是基于第三方控件来绘制的在实际运用中不太方便,而大多数情况下只需要实时显示曲线就行了。本资源就是利用Static控件实现双缓冲实时曲线的绘制。
资源推荐
资源详情
资源评论
收起资源包目录
MFCApplication1.zip (41个子文件)
.vs
MFCApplication1
v15
Browse.VC.db 75.46MB
.suo 34KB
ipch
15df454449f3f135.ipch 116MB
MFCApplication1.sln 1KB
MFCApplication1
MFCApplication1Dlg.cpp 9KB
MFCApplication1.cpp 3KB
resource.h 740B
framework.h 2KB
res
MFCApplication1.ico 66KB
MFCApplication1.rc2 686B
pch.h 544B
MFCApplication1Dlg.h 1KB
MFCApplication1.vcxproj 10KB
MFCApplication1.vcxproj.filters 2KB
MFCApplication1.aps 106KB
MFCApplication1.h 530B
pch.cpp 158B
MFCApplication1.rc 11KB
Debug
vc141.pdb 6.72MB
vc141.idb 1.31MB
MFCApplication1.res 68KB
MFCApplication1.tlog
CL.write.1.tlog 2KB
rc.command.1.tlog 502B
rc.write.1.tlog 306B
rc.read.1.tlog 3KB
MFCApplication1.lastbuildstate 219B
CL.command.1.tlog 3KB
link.command.1.tlog 2KB
link.read.1.tlog 6KB
link.write.1.tlog 990B
CL.read.1.tlog 107KB
MFCApplication1.obj 126KB
MFCApplication1Dlg.obj 236KB
pch.obj 984KB
MFCApplication1.pch 54.19MB
MFCApplication1.log 297B
MFCApplication1.vcxproj.user 238B
targetver.h 299B
Debug
MFCApplication1.exe 253KB
MFCApplication1.ilk 1.93MB
MFCApplication1.pdb 3MB
共 41 条
- 1
资源评论
- liuhuilfh2023-07-14内容挺好,可以参考
夏木_泽阳
- 粉丝: 1
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功