本人写了一个曲线类clPlot,它的派生情况是class clPlot : public CWnd
它有这么几个主要的成员函数void clPlot::InitTaxis(double x,double y, double a,double b )
是关于x轴和y轴的量程的赋值,本人想通过改变y轴量程的大小来改变 实时曲线的大小,例如 我的量程放大,该曲线就
缩小,否则 ,就是该曲线缩小在LeftView1_01中,有下面几个主要的函数
LeftView1_01::LeftView1_01()
{
canSize=FALSE;
m_y_up=40;
m_y_low=20;
m_x_up=400;
m_x_low=0;
}
void LeftView1_01::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect Rect;
GetClientRect(Rect);
CMPFMSDoc *pDoc=(CMPFMSDoc *)GetDocument();
m_Plot.InitTaxis(m_y_low,m_y_up,m_x_low,m_x_up);
m_Plot.m_sample_rate = pDoc->m_sample_rate;
m_Plot.Create(WS_CHILD|WS_VISIBLE,Rect,this,12000);
m_Plot.InitCpen(DARK_GRAY,RGB(127,127,127),RGB(252,63,115),LIGHT_GRAY,RGB(0,78,152));
m_Plot.SetTitlebar(2, PS_SOLID,RGB(0,0,12), "含水率%");
canSize=TRUE;
}在文档类中,m_pLeftView1_01就是上面视图的指针,是该文档的成员变量,
下面是一个 文档中的菜单消息响应函数,是用来实现曲线的放大。但是每次菜单运行后,
并不能立即更新m_pLeftView1_01的曲线的大小,需要把该窗口点击一下,刷新后来能显示,
我想做到菜单响应函数的实时改变,我该怎么做啊 ?
void CMPFMSDoc::OnMenuCurvezoomout()
{
// TODO: Add your command handler code here
m_pLeftView1_01->m_y_low=m_pLeftView1_01->m_y_low+5;
m_pLeftView1_01->m_y_up=m_pLeftView1_01->m_y_up-5;
m_pLeftView1_01->m_Plot.InitTaxis(m_pLeftView1_01->m_y_low,m_pLeftView1_01->m_y_up,
m_pLeftView1_01->m_x_low,m_pLeftView1_01->m_y_up);
UpdateAllViews(m_pLeftView1_01,0,NULL);
}
它有这么几个主要的成员函数void clPlot::InitTaxis(double x,double y, double a,double b )
是关于x轴和y轴的量程的赋值,本人想通过改变y轴量程的大小来改变 实时曲线的大小,例如 我的量程放大,该曲线就
缩小,否则 ,就是该曲线缩小在LeftView1_01中,有下面几个主要的函数
LeftView1_01::LeftView1_01()
{
canSize=FALSE;
m_y_up=40;
m_y_low=20;
m_x_up=400;
m_x_low=0;
}
void LeftView1_01::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect Rect;
GetClientRect(Rect);
CMPFMSDoc *pDoc=(CMPFMSDoc *)GetDocument();
m_Plot.InitTaxis(m_y_low,m_y_up,m_x_low,m_x_up);
m_Plot.m_sample_rate = pDoc->m_sample_rate;
m_Plot.Create(WS_CHILD|WS_VISIBLE,Rect,this,12000);
m_Plot.InitCpen(DARK_GRAY,RGB(127,127,127),RGB(252,63,115),LIGHT_GRAY,RGB(0,78,152));
m_Plot.SetTitlebar(2, PS_SOLID,RGB(0,0,12), "含水率%");
canSize=TRUE;
}在文档类中,m_pLeftView1_01就是上面视图的指针,是该文档的成员变量,
下面是一个 文档中的菜单消息响应函数,是用来实现曲线的放大。但是每次菜单运行后,
并不能立即更新m_pLeftView1_01的曲线的大小,需要把该窗口点击一下,刷新后来能显示,
我想做到菜单响应函数的实时改变,我该怎么做啊 ?
void CMPFMSDoc::OnMenuCurvezoomout()
{
// TODO: Add your command handler code here
m_pLeftView1_01->m_y_low=m_pLeftView1_01->m_y_low+5;
m_pLeftView1_01->m_y_up=m_pLeftView1_01->m_y_up-5;
m_pLeftView1_01->m_Plot.InitTaxis(m_pLeftView1_01->m_y_low,m_pLeftView1_01->m_y_up,
m_pLeftView1_01->m_x_low,m_pLeftView1_01->m_y_up);
UpdateAllViews(m_pLeftView1_01,0,NULL);
}
解决方案 »
- ftp如何停止文件上传?
- unicode字符如何WriteFile文本文件
- 程序每20ms接收200B数据,请问多久保存一次、用何种方式保存(到硬盘),效率最高?
- vc+mysql+ado如何存储和读取图片?
- 请教:有VC中使用的LED数码字显示的控件吗?谢谢
- 调整列宽度的时候 可产生什么消息
- 请问 char flag[2]={0};是什么意思?
- 什么意思啊????
- 单文档应用程序中遇到的和对话框有关的问题.(一点错误代码提示帮助给看看,毛病出在那里).up有分~~~1!!
- 小弟我有很多很多关于vc++的问题,所以我想认识几位编程高手
- 请教VC下流媒体处理
- 无线局域网内传输大量视频文件用UDP还是tcp?
在以下情况下,应用程序将自动执行视图类的OnInitialUpdate()来初始化视图类数据成员:
1 用户启动应用程序
2 从File菜单选择New菜单项,CWinApp::OnFileNew在调用CDocument::OnNewDocument后即调用OnInitialUpdate准备绘图输出;
你这里的菜单消息并没有发送oninitialupdate消息 可以把
m_Plot.InitTaxis(m_y_low,m_y_up,m_x_low,m_x_up);
放到菜单响应函数OnMenuCurvezoomout()里试试
本人写了一个曲线类clPlot,它的派生情况是class clPlot : public CWnd
它有这么几个主要的成员函数void clPlot::InitTaxis(double x,double y, double a,double b )
是关于x轴和y轴的量程的赋值,本人想通过改变y轴量程的大小来改变 实时曲线的大小,例如 我的量程放大,该曲线就
缩小,否则 ,就是该曲线缩小 C/C++ code
在LeftView1_01中,有下面几个主要的函数
LeftView1_01::LeftView1_01()
{
canSize=FALSE;
m_y_up=40;
m_y_low=20;
m_x_up=400;
m_x_low=0;
}
void LeftView1_01::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect Rect;
GetClientRect(Rect);
CMPFMSDoc *pDoc=(CMPFMSDoc *)GetDocument();
m_Plot.InitTaxis(m_y_low,m_y_up,m_x_low,m_x_up);
m_Plot.m_sample_rate = pDoc->m_sample_rate;
m_Plot.Create(WS_CHILD|WS_VISIBLE,Rect,this,12000);
m_Plot.InitCpen(DARK_GRAY,RGB(127,127,127),RGB(252,63,115),LIGHT_GRAY,RGB(0,78,152));
m_Plot.SetTitlebar(2, PS_SOLID,RGB(0,0,12), "含水率%");
canSize=TRUE;
}在文档类中,m_pLeftView1_01就是上面视图的指针,是该文档的成员变量,
下面是一个 文档中的菜单消息响应函数,是用来实现曲线的放大。但是每次菜单运行后,
并不能立即更新m_pLeftView1_01的曲线的大小,需要把该窗口点击一下,刷新后来能显示,
我想做到菜单响应函数的实时改变,我该怎么做啊 ?
void CMPFMSDoc::OnMenuCurvezoomout()
{
// TODO: Add your command handler code here
m_pLeftView1_01->m_y_low=m_pLeftView1_01->m_y_low+5;
m_pLeftView1_01->m_y_up=m_pLeftView1_01->m_y_up-5;
m_pLeftView1_01->m_Plot.InitTaxis(m_pLeftView1_01->m_y_low,m_pLeftView1_01->m_y_up,
m_pLeftView1_01->m_x_low,m_pLeftView1_01->m_y_up);
UpdateAllViews(m_pLeftView1_01,0,NULL);
}
后是不是要调用一下
m_Plot.RedrawWindow呢?
这主要取决于你曲线的刷新方式
后是不是要调用一下
m_Plot.RedrawWindow呢?
这主要取决于你曲线的刷新方式
主要通过改变plot类的坐标量程来实现的。但是就是实时曲线 不能实时响应 ,不知道用什么办法 好点
关键是怎去刷新视图区域
菜单下test-->zoomout 按钮 ,曲线并不实时地更新,但是如果移动或改变窗口的大小 ,那么这个窗口才会重绘,改变的效果才会出来
void CDemoView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if(canSize)
{
CRect Rect;
GetClientRect(Rect);
m_Plot.MoveWindow(Rect); //
}
}void clPlot::MoveWindow(CRect & Rect)
{
m_ctlRect = Rect;
GetParent()->ClientToScreen(m_ctlRect);
ScreenToClient(m_ctlRect);
ComputeRects(TRUE); //
CWnd::MoveWindow(Rect);
}
void clPlot::ComputeRects(BOOL bInitialization)
{
m_leftaxis.m_dValuePrPixel = ((double)(m_leftaxis.maxrange- m_leftaxis.minrange) / (double)m_plotRect.Height()); }
视图大小 会触发 m_Plot.MoveWindow(Rect);
{
// TODO: Add your command handler code here
m_y_up=m_y_up-300;
// m_Plot.SetSerie(0, PS_SOLID, RGB(255,0,0), 0.0, 300.0, "Pressure");
m_Plot.SetLYRange(m_y_low,m_y_up);
m_Plot.ComputeRects(true); //加上这句 就行啦
// m_Plot.Invalidate(true);
}