本人写了一个曲线类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);
}

解决方案 »

  1.   

    视图类提供CView::OnInitialUpdate()成员函数来初始化视图类的数据成员。   
      在以下情况下,应用程序将自动执行视图类的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()里试试
      

  2.   


    本人写了一个曲线类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);
    }
      

  3.   

    m_Plot.InitCpen(DARK_GRAY,RGB(127,127,127),RGB(252,63,115),LIGHT_GRAY,RGB(0,78,152));
    后是不是要调用一下
    m_Plot.RedrawWindow呢?
    这主要取决于你曲线的刷新方式
      

  4.   

    修改一下,m_pLeftView1_01->m_Plot.InitTaxis(m_pLeftView1_01->m_y_low,m_pLeftView1_01->m_y_up,
    后是不是要调用一下 
    m_Plot.RedrawWindow呢? 
    这主要取决于你曲线的刷新方式
      

  5.   

    http://download.csdn.net/source/1151548这是我的源码  大家帮我看看菜单响应函数在void CDemoView::OnMenuitemZoomout() 
    主要通过改变plot类的坐标量程来实现的。但是就是实时曲线 不能实时响应 ,不知道用什么办法 好点
      

  6.   

    看了一下你的程序,绘制时好象是使用m_dValuePrPixel来计算的,而SetLYRange改变了minrange和maxrange,并没有重新计算m_dValuePrPixel。
      

  7.   

    m_leftaxis.m_dValuePrPixel   = ((double)(m_leftaxis.maxrange- m_leftaxis.minrange) / (double)m_plotRect.Height());这个值m_dValuePrPixel   也是通过坐标轴量程计算的实时曲线 没有改变大小 是因为没有去即时去刷新 视图区域 
    关键是怎去刷新视图区域
      

  8.   

    用Invalidate就可以刷新窗口,你已经在定时刷新了。现在的问题不是刷新窗口,是要更新clPlot类中与刻度有关的变量,你目前的做法是只更新了minrange和maxrange,而在绘制过程中使用的变量不止这两个。
      

  9.   

    我的 意思 通过改变y轴的量程来把曲线放大,
    菜单下test-->zoomout 按钮  ,曲线并不实时地更新,但是如果移动或改变窗口的大小 ,那么这个窗口才会重绘,改变的效果才会出来
      

  10.   


    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);
      

  11.   

    void CDemoView::OnMenuitemZoomout() 
    {
    // 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);

    }