17.7 GDI+与GDI共同实现双缓冲绘图
双缓冲绘图可以有效避免因屏幕重绘而造成的闪屏效果。虽然GDI与GDI+自身都能够实现双缓冲绘图的功能,但是GDI的功能有限,如本实例的翻页效果用GDI+实现就比较简单,是GDI所不能替代的。而由于GDI+的DrawImage()函数不能像GDI的BitBlt()函数那样简单地进行像素拷贝,所以只有将两者结合才能够实现设计简单、速度快捷的双缓冲绘图的功能。下面将详细介绍本实例中用到的GDI与GDI+结合实现双缓冲的方法。在本节仍用17.6节的对话框实例来讲解。
17.7.1 重载窗体的OnPaint()函数
一般窗体的重绘都是调用重载窗体的OnPaint()函数来实现,所以在OnPaint()函数中进行双缓冲绘图,是解决闪屏的有效途径。
- 01 void CMyAlbumDlg::OnPaint()
- 02 {
- 03 if (IsIconic())
- 04 {
- 05 CPaintDC dc(this); //设备描述符
- 06 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- 07 int cxIcon = GetSystemMetrics(SM_CXICON);
- 08 int cyIcon = GetSystemMetrics(SM_CYICON);
- 09 CRect rect;
- 10 GetClientRect(&rect);
- 11 int x = (rect.Width() - cxIcon + 1) / 2;
- 12 int y = (rect.Height() - cyIcon + 1) / 2;
- 13 dc.DrawIcon(x, y, m_hIcon);
- 14 }
- 15 else
- 16 {
- 17 CDialog::OnPaint();
- 18 }
- 19 }
【代码解析】
在原OnPaint()函数中仅仅处理了当窗体最小化时,绘制最小化图标的功能。一般用户添加的绘图功能也会被添加到这个函数。