我已经用类向导工具做了一个基于dialog的基本框架,上面有两个按钮。
我想实现按不同的按钮,在Dialog上画出不同的图形,应该如何实现。以下是部分代码,问题是 我单击了按钮,改变了画线坐标,发送了重画消息但是图形并没有重画
其中按钮的单击相应函数:void CPaintDlg::OnOK() 
{
// TODO: Add extra validation here
LineTo = LineTo +10; //改变直线的坐标
SendMessage(WM_PAINT, 0, 0); //发送WM_PAINT消息(但是没用,CPaintDC并没有重画)
OnPaint() ;
}
画图函数void CPaintDlg::OnPaint() 
{ //CDialog::OnPaint();
CPaintDC dc(this);
     CRect   rc;   
        GetClientRect(&rc);
        dc.BitBlt(0,0, rc.right-rc.left, rc.bottom-rc.top,NULL,0,0,WHITENESS);    
        dc.MoveTo(1,3);
        dc.LineTo(200,LineTo);
}
首先解决点击按钮重画的问题,接着是无闪烁的问题(能给出代码的,我加分)

解决方案 »

  1.   

    将实现分为2部分: 
    1. 第一部分,定义一个CSharp的基类,然后从它派生,不同的派生类画不同的图形,但是,都不直接画到设备上,都只画到内存DC上或者GDI+的Bitmap上.2. 第二部分,实现一个控件派生类,然后在此控件派生类中使用某种方式(可以是Observer或者其它方式),根据具体的CSharp类型来将生成的内存图像画到DC上. 那么只要在对话框上放一个STATIC,然后子类化为这个控件派生类,就能实现不同的图形了。
      

  2.   

    同意楼上的观点。另外,实现无闪烁画图的一个很重要方法是,不要在响应WM_PAINT消息中画。在WM_ERASEBKGND消息响应中实现。
      

  3.   

    WM_ERASEBKGND里得不到Invalid Rect,没法做裁剪来优化复杂的画图操作。
    普遍做法是:在WM_ERASEBKGND这个消息里什么都不做(Windows的默认操作会擦背景),在WM_PAINT里画图。