准备做个实时显示网络流量的曲线,使用VC6,MFC生成一名为Realtime_Monitor对话框,并在函数void CRealtime_MonitorDlg::OnPaint() 中加入了绘制坐标系的代码。 现在准备画曲线,可发现需要在计算流量的全局函数中加入绘制曲线的代码。我对获取设备环境DC搞得不太明白,在void CRealtime_MonitorDlg::OnPaint()中也只使用了CPaintDC dc(this);而已,现在不知道如何获取对话框的设备环境,我画的线很简单,只需要Moveto和Lineto之类的函数,只是不知道如何得到对话框的设备环境,请知道的高手指点。 还有,顺便问一句,有没有可以擦掉已经画出的图形的函数或者让整个坐标系平移的函数。 谢谢。

解决方案 »

  1.   

    在你说的全局函数中加入CDC *pDC = GetDC();然后在需要画图的地方用pDC就行了
    PDC-Lineto();pDC->Moveto();
    至于擦掉已经画出的图形的,你可以用Invalidate()函数
      

  2.   

    报错:
    'GetDC':function does not take 0 patameters
    还有参数吗?
      

  3.   

    GetDC是窗口类的函数。如果用全局,则需要窗口句柄作为参数。
    HDC GetDC(    HWND hWnd  // handle of window  
       );
      

  4.   

    按上面的做法在窗口重绘时会丢失画面建议数据做为类成员变量,在OnPaint内画,定时器内调用Invalidate()刷新.擦掉已经画出的图形也就是用新画刷再画一遍
    让整个坐标系平移的函数没有,得自己做.
      

  5.   

    这样就可以了
    CDC* pDC=GetDlagItem(IDC_**你要画图的地方**)->GetDC();//获得画图区域句柄
    然后再用
    pDC->MoveTo(x,y);
    pDC->LineTo(x,y);来画图
      

  6.   

    完整的可以这样
    在C******View.h里的protected:
    定义
    void DrawCurve(CDC* pDC);
    在C******View.cpp定义全局变量BOOL m_DrawFlag=FALSE;
    void C******View::OnDrawcurve()//响应画图的消息 一个响应画图的按钮函数
    {
    m_DrawFlag = TRUE;
    SendMessage(WM_PAINT);
    }
    重载OnPaint函数
    void C******View::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    if(m_DrawFlag)//画曲线,响应OnDrawcurve()的消息
    DrawCurve(&dc);
    // Do not call CFormView::OnPaint() for painting messages
    }
    void C******View::DrawCurve(CDC* pDC)
    {
    pDC =GetDlgItem(IDC_BITMAP)->GetDC();//获得画图区域句柄
    // 创建画笔对象
    CPen* pPen = new CPen;
    // *色画笔
    pPen->CreatePen(PS_SOLID,1,RGB(58,110,165));//兰色
    // 选中当前*色画笔,并保存以前的画笔
    CGdiObject* pOldPen = pDC->SelectObject(pPen);
    pDC->MoveTo(x,y);
    pDC->LineTo(x,y);//画图
    .......
    ReleaseDC(pDC);//销毁DC
    }