我已经用类向导工具做了一个基于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);
}
首先解决点击按钮重画的问题,接着是无闪烁的问题(能给出代码的,我加分)
我想实现按不同的按钮,在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. 第一部分,定义一个CSharp的基类,然后从它派生,不同的派生类画不同的图形,但是,都不直接画到设备上,都只画到内存DC上或者GDI+的Bitmap上.2. 第二部分,实现一个控件派生类,然后在此控件派生类中使用某种方式(可以是Observer或者其它方式),根据具体的CSharp类型来将生成的内存图像画到DC上. 那么只要在对话框上放一个STATIC,然后子类化为这个控件派生类,就能实现不同的图形了。
普遍做法是:在WM_ERASEBKGND这个消息里什么都不做(Windows的默认操作会擦背景),在WM_PAINT里画图。