这一节来演示一种绘图的方法,让我们的程序真正的看得见~ 哈哈哈,而不再是命令行的黑框框。 采用的是二重缓冲的方式
先说一下当前工程的启动过程,省略一部分,直接看到我们的ChildView.cpp这个文件,里边有两个函数BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
和 void CChildView::OnPaint()
,可以简单的理解为,前者是窗口出现之间,程序所做的事情,所以你可以把游戏的一些初始化的操作放在这个函数里边,后者就是绘制这个窗口,每执行一次这个函数,就会重新绘制一下当前的窗口,你所看到的动画啊,游戏啊 都是通过一直执行这个函数实现的动画的效果的~,好啦~ 说了这么一堆话了,来开始贴上我们的飞机们把~
第一步:
找到ChildView.h 这个头文件,在里边添加一些我们所需要的属性,
// 特性
public:
//绘图相关
CRect m_client;//记录客户区大小
CDC m_cacheDC; //缓冲DC
CBitmap m_cacheCBitmap;//缓冲位图
然后转到ChildView.cpp这个文件,修改OnPaint函数
void CChildView::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
// TODO: 在此处添加消息处理程序代码
// 不要为绘制消息而调用 CWnd::OnPaint()
//获取窗口DC指针
CDC *cDC = this->GetDC();
//获取窗口大小
GetClientRect(&m_client);
//创建缓冲DC
m_cacheDC.CreateCompatibleDC(NULL);
m_cacheCBitmap.CreateCompatibleBitmap(cDC, m_client.Width(), m_client.Height());
m_cacheDC.SelectObject(&m_cacheCBitmap);
//————————————————————开始绘制——————————————————————
//把要绘制的内容都贴到m_cacheDC当中就可以了
Manager.Draw(&m_cacheDC);
//最后将缓冲DC内容输出到窗口DC中
cDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_cacheDC, 0, 0, SRCCOPY);
//————————————————————绘制结束—————————————————————
//在绘制完图后,使窗口区有效
ValidateRect(&m_client);
//释放缓冲DC
m_cacheDC.DeleteDC();
//释放对象
m_cacheCBitmap.DeleteObject();
//释放窗口DC </