点击button按钮,根据公式计算画出函数曲线,在edit中显示,,

解决方案 »

  1.   

    在edit中画图首先要获得它的设备上下文,就是CDC *pDC = CEdit ::GetDC();然后创建一个GDI+对象,就可以画一些曲线了,个人觉得实用GDI+比GDI好,虽然CPU占用率会高一些,但是画贝塞尔什么曲线比较容易。
      

  2.   

    绘图必取DC,之后调用相应GDI函数
      

  3.   

    这是我引用别人的一个代码,是在onpaint中画的。可问题是我点击button1,画不出图啊,,,void CMy6Dlg::OnPaint() 
    { if (IsIconic())
    {
    CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
    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; // Draw the icon
    dc.DrawIcon(x, y, m_hIcon);
    }
    else if (boolpaint)
    {
    CBitmap bmp;
            CRect rc;
            CPaintDC dc2(GetDlgItem(IDC_STATIC1));
            GetDlgItem(IDC_STATIC1)->GetClientRect(rc);
            bmp.CreateCompatibleBitmap(&dc2,rc.Width(),rc.Height());
            CDC memDC;
            memDC.CreateCompatibleDC(&dc2);
            memDC.SelectObject(&bmp);   
            
            CPoint pt(rc.CenterPoint());
            int WIDTH = min(rc.Width(), rc.Height());
            int HEIGHT = WIDTH;
            int WIDTH2 = WIDTH/2;
            int HEIGHT2 = WIDTH2;
            
            int x1 = pt.x - WIDTH / 2;
            int y1 = pt.y - HEIGHT / 2;
            int x2 = pt.x + WIDTH / 2;
            int y2 = pt.y + HEIGHT / 2;
            
            
            CPen pen;
            pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
            CPen *oldpen=(CPen *)memDC.SelectObject(&pen);
            CBrush brush;
            brush.CreateSolidBrush(RGB(255,0,0));
            CBrush *oldbrush=(CBrush *)memDC.SelectObject(&brush);
            
            memDC.FillSolidRect(rc, GetSysColor(COLOR_3DFACE));
            
            memDC.Ellipse(x1,y1,x2,y2);
            
            int x3 = pt.x - WIDTH2 / 2;
            int y3 = pt.y - HEIGHT2 / 2;
            int x4 = pt.x + WIDTH2 / 2;
            int y4 = pt.y + HEIGHT2 / 2;
            pen.DeleteObject();
            pen.CreatePen(PS_SOLID, 2, RGB(255, 255, 128));
            oldpen = (CPen*)memDC.SelectObject(&pen);
            brush.DeleteObject();
            brush.CreateSolidBrush(RGB(0, 255, 0));
            oldbrush=(CBrush *)memDC.SelectObject(&brush);
            
            memDC.Ellipse(x3, y3, x4, y4);
            
            dc2.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
            memDC.SelectObject(oldpen);
            memDC.SelectObject(oldbrush);
            bmp.DeleteObject();
            memDC.DeleteDC();
    }
    else
    {
    CDialog::OnPaint();
    } //CDialog::OnPaint();

    }
    我用一个 bool 类型控制是否画图,

    void CMy6Dlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    boolpaint = true;
    OnPaint();
    }
      

  4.   

    用richedit可能简单点,先在内存中画好,然后在edit里面贴出来
      

  5.   

    dc取得不对,按1楼的方式取得DC试试,另外,最好不要在OnPaint()里画,你取得了编辑框里的DC,就可以在OnButton1();试试.
        我从没在编辑框里画过图,一般我在PICTURE控件里画
      

  6.   

    我在button1里实现的,有两个问题:
    1.//显示rect坐标   的时候怎么全是 0 啊?
    2.pDC->LineTo(x,y); 和 pDC->MoveTo(x,y);参数是int类型的,取值的时候不长也太大了,我想用long,duble类型的,取得值能密集一些,这样的话怎么实现啊?void CMy6Dlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here

    CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC);
    CDC *pDC=pWnd->GetDC();
    CRect rect;
    pWnd->GetClientRect (rect);
    int W=rect.Width();//画图区域宽度
    int H=rect.Height();//画图区域高度                  //显示rect坐标
                      char t[10];
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
                    long y_0 =2*rect.left* rect.left+3; 
    pDC->MoveTo(rect.left,y_0);
                    long y;
    for (long x =rect.left;x<rect.right ;)
    {
    y = 2*rect.left* rect.left+3; 

    pDC->LineTo(x,y);
    pDC->MoveTo(x,y);
    x+= 1;
    if (y >rect.bottom)
    {
    break;
    }
                    }
    }
      

  7.   

    上面的
    for (long x =rect.left;x<rect.right ;)
    {
    ///////////////////////////////////
    y = 2*rect.left* rect.left+3;  
    /////////////////////////////////
    pDC->LineTo(x,y);
    pDC->MoveTo(x,y);
    x+= 1;
    if (y >rect.bottom)
    {
    break;
    }
      y = 2*rect.left* rect.left+3;应该是y = 2*x* x+3; 
    刚没改过来
      

  8.   

    pWnd->GetClientRect (rect);
    这语句你编绎通过了吗,我记得是这么写:
    pWnd->GetClientRect (&rect);因为你定义的是CRect rect;
    另外,int 是32位的,不是16位的,因此够用了
      

  9.   

    CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC);
    你把IDC_STATIC改成IDC_STATIC1或其它的ID,不要用这个,这个好象是通用的或MFC特殊用途的
      

  10.   

    void CaaDlg::OnBnClickedButton1()
    {
    CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC1);
    CDC *pDC=pWnd->GetDC();
    CRect rect;
    pWnd->GetClientRect (rect);
    int W=rect.Width();//画图区域宽度
    int H=rect.Height();//画图区域高度  //显示rect坐标
    /*
    char t[10];
    memset(t,0,10);
    _itoa(rect.top,t,10);
    MessageBox(t);
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
    memset(t,0,10);
    itoa(rect.top,t,10);
    MessageBox(t);
    */ long y_0 =2*rect.left* rect.left+3;  
    pDC->MoveTo(rect.left,y_0);
    long y;
    for (long x =rect.left;x<rect.right ;)
    {
    // y = 2*rect.left* rect.left+3;  
    y = 2*x* x+3;  pDC->LineTo(x,y);
    pDC->MoveTo(x,y);
    x+= 1;
    if (y >rect.bottom)
    {
    break;
    }
      }}
    我在VS2010下编绎通过,能显示曲线