基于MFC对话框的画图,添加了编辑框和滑动块控件及picture控件,在onpaint下画图。为何执行后可以显示图形,但如果将整个对话框拖动,上面就什么都没有了?是重绘的问题吗

解决方案 »

  1.   

    用Invalidate();或者updatewindow吗,除了picture控件中的图再闪,其他的还是不显示呀
      

  2.   

    编辑框控件用来输入数据,在onpaint画图中会用到这些数据;然后还有按钮控件,在按下按钮后显示相应的图
      

  3.   

    [Quote=引用 5 楼 fandh 的回复:]
    编辑框和滑动块控件 是在资源里面添加进去的?还是你程序里面写的?
    [/Quote山是在资源文件里的
      

  4.   

    那我怀疑你在什么地方有资源没有释放,比如GDI资源!
      

  5.   

    在OnPaint中单步跟一下, 看当前获取的DC是否正确
      

  6.   

    把你OnPaint中的代码贴出来,你是否加了控制变量在里面。
      

  7.   

    修改窗口属性ModifyStyle(0, WS_CLIPCHILDREN | WS_CLIPSIBLINGS);试试
      

  8.   

    你的bitmap是不是成员变量,CBitmap m_bmp
    DC只CBitmap* pOldBmp = SelectObject(&m_bmp);
    但是没有在绘制结束后SelectObject(pOldBmp);结果将m_bmp给释放了
      

  9.   

    void CkuangjiaDlg::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
    {   CBitmap bmp1;
    CRect rc1;
    CPaintDC dc1(GetDlgItem(IDC_STATIC1));
    GetDlgItem(IDC_STATIC1)->GetClientRect(rc1);
    bmp1.CreateCompatibleBitmap(&dc1,rc1.Width(),rc1.Height());
    CDC memDC1;
    memDC1.CreateCompatibleDC(&dc1);
    memDC1.SelectObject(&bmp1);
          
    //CWnd *pic;
    //pic=GetDlgItem(IDC_STATIC1);
    //pic->GetClientRect(rc);
    CPen pen;
    pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
    CPen *oldpen=(CPen*)memDC1.SelectObject(&pen);
    CPoint pt(rc1.CenterPoint());
    int WIDTH = min(rc1.Width(), rc1.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;
    memDC1.Ellipse(x1,y1,x2,y2);              
    CBrush  brush;
    brush.CreateSolidBrush(RGB(255,0,0));
    CBrush *oldbrush=(CBrush *)memDC1.SelectObject(&brush);
    int num11,num22;  

    num11=(int)num1;
    num22=(int)num2;
    int xx,yy;
    xx=num11-20;
    yy=num22-20;
    memDC1.Ellipse (num11,num22,xx,yy);
    memDC1.ExtFloodFill(num11,num22,RGB(255,0,0),RGB(255,0,0));   
    brush.DeleteObject();
    pen.DeleteObject();
    dc1.BitBlt(0,0,rc1.Width(),rc1.Height(),&memDC1,0,0,SRCCOPY);
    memDC1.SelectObject(oldpen);
    memDC1.SelectObject(oldbrush);
    bmp1.DeleteObject();
    memDC1.DeleteDC();

    CBitmap bmp2;
    CRect rc2;
    CPaintDC dc2(GetDlgItem(IDC_STATIC2));
    GetDlgItem(IDC_STATIC2)->GetClientRect(rc2);
    bmp2.CreateCompatibleBitmap(&dc2,rc2.Width(),rc2.Height());
    CDC memDC2;
    memDC2.CreateCompatibleDC(&dc2);
    memDC2.SelectObject(&bmp2);
    double v, rr,x,y,I,I1,R=8.8;
    double n=fbl/2;
    int i,j;
    double s[3],dy[fbl][fbl],dimage[fbl][fbl];
    double r[3]={1,3,-4};
    double m[3]={3.85,0.82,15};
    double max=0,min=0;
    rr=dot(r,r);
    if (rr<R*R)
    {for(i=1;i<=fbl;i++)
     {for(j=1;j<=fbl;j++)
       { x=(i-n)/n*R;
       y=(j-n)/n*R;
       s[0]=x;
       s[1]=y; 
       s[2]=sqrt(R*R-x*x-y*y);
       I=x*x+y*y;
       if(I<=R*R)
    v=potential(r,m,s);
       else
    v=0;
       dy[i-1][j-1]=v;
      }
     }
    }
    max=dy[0][0];
    min=dy[0][0];
    for(i=1;i<=fbl;i++)
      {for(j=1;j<=fbl;j++)
    { x=(i-n)/n*R;
    y=(j-n)/n*R;
    I1=x*x+y*y;
    if(I1<R*R)
    {if(max<dy[i-1][j-1])
    max=dy[i-1][j-1];
    if(min>dy[i-1][j-1])
    min=dy[i-1][j-1];
    dimage[i-1][j-1]=255*(dy[i-1][j-1]-min)/(max-min);
    }
    else dimage[i-1][j-1]=255;
    }
       }
    CPen pen1;
    pen1.CreatePen(PS_DOT,100,RGB(dimage,0,0));
    CPen *oldpen1=(CPen*)memDC2.SelectObject(&pen1);
        for(i=0+10;i<=fbl+10;i++)
    for(j=0;j<=fbl;j++)
    {memDC2.SetPixelV(i,j,RGB(dimage[i-10][j],dimage[i-10][j],dimage[i-10][j]));} dc2.BitBlt(0,0,rc2.Width(),rc2.Height(),&memDC2,0,0,SRCCOPY);
    memDC2.SelectObject(oldpen1);
        bmp2.DeleteObject();
    memDC2.DeleteDC();
    }
    }
    其中num1,num2,num3是通过编辑框获取的输入变量
    void CkuangjiaDlg::OnBnClickedButton1(){UpdateData(1);
    int num1,num2;   
    char ch1[10],ch2[10];
    GetDlgItemText(IDC_EDIT1,LPTSTR(ch1),10);
    GetDlgItemText(IDC_EDIT2,LPTSTR(ch2),10);
    num1=atoi(ch1);
    num2=atoi(ch2); 
       Invalidate();
    }
      

  10.   

    void CkuangjiaDlg::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
    {   CBitmap bmp1;
    CRect rc1;
    CPaintDC dc1(GetDlgItem(IDC_STATIC1));
    GetDlgItem(IDC_STATIC1)->GetClientRect(rc1);
    bmp1.CreateCompatibleBitmap(&dc1,rc1.Width(),rc1.Height());
    CDC memDC1;
    memDC1.CreateCompatibleDC(&dc1);
    memDC1.SelectObject(&bmp1);
          
    //CWnd *pic;
    //pic=GetDlgItem(IDC_STATIC1);
    //pic->GetClientRect(rc);
    CPen pen;
    pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
    CPen *oldpen=(CPen*)memDC1.SelectObject(&pen);
    CPoint pt(rc1.CenterPoint());
    int WIDTH = min(rc1.Width(), rc1.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;
    memDC1.Ellipse(x1,y1,x2,y2);              
    CBrush  brush;
    brush.CreateSolidBrush(RGB(255,0,0));
    CBrush *oldbrush=(CBrush *)memDC1.SelectObject(&brush);
    int num11,num22;  

    num11=(int)num1;
    num22=(int)num2;
    int xx,yy;
    xx=num11-20;
    yy=num22-20;
    memDC1.Ellipse (num11,num22,xx,yy);
    memDC1.ExtFloodFill(num11,num22,RGB(255,0,0),RGB(255,0,0));   
    brush.DeleteObject();
    pen.DeleteObject();
    dc1.BitBlt(0,0,rc1.Width(),rc1.Height(),&memDC1,0,0,SRCCOPY);
    memDC1.SelectObject(oldpen);
    memDC1.SelectObject(oldbrush);
    bmp1.DeleteObject();
    memDC1.DeleteDC();

    CBitmap bmp2;
    CRect rc2;
    CPaintDC dc2(GetDlgItem(IDC_STATIC2));
    GetDlgItem(IDC_STATIC2)->GetClientRect(rc2);
    bmp2.CreateCompatibleBitmap(&dc2,rc2.Width(),rc2.Height());
    CDC memDC2;
    memDC2.CreateCompatibleDC(&dc2);
    memDC2.SelectObject(&bmp2);
    double v, rr,x,y,I,I1,R=8.8;
    double n=fbl/2;
    int i,j;
    double s[3],dy[fbl][fbl],dimage[fbl][fbl];
    double r[3]={1,3,-4};
    double m[3]={3.85,0.82,15};
    double max=0,min=0;
    rr=dot(r,r);
    if (rr<R*R)
    {for(i=1;i<=fbl;i++)
     {for(j=1;j<=fbl;j++)
       { x=(i-n)/n*R;
       y=(j-n)/n*R;
       s[0]=x;
       s[1]=y; 
       s[2]=sqrt(R*R-x*x-y*y);
       I=x*x+y*y;
       if(I<=R*R)
    v=potential(r,m,s);
       else
    v=0;
       dy[i-1][j-1]=v;
      }
     }
    }
    max=dy[0][0];
    min=dy[0][0];
    for(i=1;i<=fbl;i++)
      {for(j=1;j<=fbl;j++)
    { x=(i-n)/n*R;
    y=(j-n)/n*R;
    I1=x*x+y*y;
    if(I1<R*R)
    {if(max<dy[i-1][j-1])
    max=dy[i-1][j-1];
    if(min>dy[i-1][j-1])
    min=dy[i-1][j-1];
    dimage[i-1][j-1]=255*(dy[i-1][j-1]-min)/(max-min);
    }
    else dimage[i-1][j-1]=255;
    }
       }
    CPen pen1;
    pen1.CreatePen(PS_DOT,100,RGB(dimage,0,0));
    CPen *oldpen1=(CPen*)memDC2.SelectObject(&pen1);
        for(i=0+10;i<=fbl+10;i++)
    for(j=0;j<=fbl;j++)
    {memDC2.SetPixelV(i,j,RGB(dimage[i-10][j],dimage[i-10][j],dimage[i-10][j]));} dc2.BitBlt(0,0,rc2.Width(),rc2.Height(),&memDC2,0,0,SRCCOPY);
    memDC2.SelectObject(oldpen1);
        bmp2.DeleteObject();
    memDC2.DeleteDC();
    }
    }
    其中num1,num2,num3是通过编辑框获取的输入变量
    void CkuangjiaDlg::OnBnClickedButton1(){UpdateData(1);
    int num1,num2;   
    char ch1[10],ch2[10];
    GetDlgItemText(IDC_EDIT1,LPTSTR(ch1),10);
    GetDlgItemText(IDC_EDIT2,LPTSTR(ch2),10);
    num1=atoi(ch1);
    num2=atoi(ch2); 
       Invalidate();
    }
      

  11.   

    代码贴出来了,怎么没有高手指教呀,这是分别在两个picture上画两个图,一个是画圆,并在其中根据输入的数据位置坐标画个小圆。第二个是跟句一个函数求得的函数值画灰度图!请高手指教
      

  12.   

    用一个dc
    也就是CPaintDC dc1(this);
    该写你的程序试一下
      

  13.   

    拖动对话框上面的东东就都没有了,但在picture位置点两下,会显示更新后的图片,但是其他的东西就都没有显示了
      

  14.   

    按道理 通过OnPaint画图,你在移动后会再做一次OnPaint(), 我也做过这样的程序,画过的内容应该不会消失的
      

  15.   

    Invalidate();-》
    Invalidate(FALSE);