做了三次8周的计算机图形学实验才猛地反应过来之前虽然都做出来了但是好像每次都是莫名其妙幸运的避过了一些关键点!
那就是双缓冲和鼠标事件响应。。。。每次的窗口变换其实就是图形的刷新,会更新成为新的界面。
刷新完毕后的界面会通过调用当前view.cpp的ondraw()函数来重绘函数,当然如果你是通过窗口响应并且没有在ondraw函数内统一调用某种接口或者函数的话,更新界面你之前通过窗口调用的函数就没有啦哈哈哈哈哈(我就是这么蠢过来的。
所以如果是通过窗口响应然后在窗口内写函数那么!!!一定要设置一个比如说是CGShape的类去统一调用绘图在ondraw函数内;或者是设置一个结构体数组来存储已经画了的图形;然后每次通过ondraw函数去调用查看结构体数组里面有图吗,没有就跳过,有就重绘(这是笨办法但是好理解哈哈哈哈哈
void CxxxView::OnDraw(CDC* pDC)
{
CxxxxDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
//pDoc->Draw(pDC);
CRect RectCompatible; //设置兼容区域,一般为当前窗口大小
CDC Memdc; //首先定义一个显示设备对象,建立兼容DC,即后面那块画布
CBitmap Bitmap;//定义一个位图对象
GetClientRect(&RectCompatible);//得到当前窗口的大小
Memdc.CreateCompatibleDC(pDC);//随后建立与屏幕显示兼容的内存显示设备
Bitmap.CreateCompatibleBitmap(pDC, RectCompatible.Width(), RectCompatible.Height());//创建兼容位图
Memdc.SelectObject(Bitmap);//把位图选到兼容DC中,这样才可以开始画
Memdc.FillSolidRect(RectCompatible.left, RectCompatible.top, RectCompatible.Width(), RectCompatible.Height(), RGB(255, 255, 255));//用白色先刷新整个兼容DC,这相当于原来的刷新背景
//绘图
DrawGrid(&Memdc);//其实就是和pDC一样的
Draw(&Memdc);//这两个都是绘图函数,根据需求看你自己画的效果
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(RectCompatible.left, RectCompatible.top, RectCompatible.Width(), RectCompatible.Height(), &Memdc, RectCompatible.left, RectCompatible.top, SRCCOPY);//最后把兼容DC拷贝到pDC
//实现前后交替,便不会闪动
Memdc.DeleteDC();
Bitmap.DeleteObject();
}
这个东西真的让我理解了好久,不过终于懂了,但是感觉又要秃了。。。。。。