麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

基于WTL 雙緩沖(double buffer)繪圖的分析詳解

2020-01-26 16:11:45
字體:
來源:轉載
供稿:網友
WTL中有兩個Mix-in類: CDoubleBufferImplCDoubleBufferWindowImpl,用于創建雙緩沖繪圖窗口,用法非常簡單。
下面創建了一個普通的WTL窗口類,在窗口的客戶區中有大量的繪圖工作,使用CDoubleBufferImpl類來消除繪圖時的閃爍現象:
復制代碼 代碼如下:

const COLORREF WHITE_COLOR = RGB(255,255,255);
const COLORREF BLUE_COLOR = RGB(0,0,255);
class CMainWindow :
 public CWindowImpl<CMainWindow,CWindow,CSimpleWinTraits>,
 public CDoubleBufferImpl<CMainWindow>
{
public:
 typedef CMainWindow _thisClass;
 typedef CDoubleBufferImpl<_thisClass> _baseDblBufImpl;
 BEGIN_MSG_MAP(CMainWindow)
  MSG_WM_CREATE(OnCreate)
  MSG_WM_DESTROY(OnDestroy)
  CHAIN_MSG_MAP(_baseDblBufImpl)
 END_MSG_MAP()
 int OnCreate(LPCREATESTRUCT lpCreateStruct)
 {
  m_RectPen.CreatePen(PS_SOLID,1,BLUE_COLOR);
  return 0;
 }
 void OnDestroy()
 {
  PostQuitMessage(0);
 }

 void OnPaint(CDCHandle)
 {
  CPaintDC dc(m_hWnd);
  DoPaint(dc.m_hDC);
 }
 void DoPaint(CDCHandle dc)
 {
  CRect rc;
  GetClientRect(&rc);
  dc.FillRect(&rc,WHITE_COLOR);
  HPEN hOldPen = dc.SelectPen(m_RectPen);
  const int width = 5;
  int x = 0;
  int count = rc.Width()/width;
  int height = 0;
  for (int i=0; i<count; i++)
  {
   height = (int)((double)rand()*rc.Height())/RAND_MAX;
   dc.Rectangle(x,rc.Height(),x+width,rc.Height()-height);
   x += width;
  }
  dc.SelectPen(hOldPen);
 }
 /*
 void DoPaint(CDCHandle dc)
 {
  CRect rc;
  GetClientRect(&rc);
  int width = rc.Width(), height = rc.Height();
  //use GDI+ to draw in the client area
  Graphics g(dc.m_hDC);
  SolidBrush whiteBrush(Color(255,255,255));
  g.FillRectangle(&whiteBrush,0,0,width,height);
  Pen bluePen(Color(0,0,255));
  const int dx = 5;
  int count = width/dx;
  int x = 0, y = 0, h = 0;
  for (int i=0;i<count;i++)
  {
   h = ((double)rand()*height)/RAND_MAX;
   g.DrawRectangle(&bluePen,x,y,dx,h);
   x += dx;
  }
 }
 */
private:
 CPen m_RectPen;
};

值得一提的是,Windows Vista操作系統增加了對Double buffered paint的內建支持,這里有一篇文章介紹如何在Win32程序中使用這些API:
Using Windows Vista Built-In Double Buffering
在WTL中使用Vista提供的這一功能非常容易,最新的WTL庫中提供了CBufferedPaintImpl和CBufferedPaintWindowImpl兩個類,這兩個類的用法和前面提到的兩個WTL自帶的雙緩沖類幾乎一樣。區別僅僅是所重載的DoPaint()函數的參數稍有不同。
對于CBufferedPaintImpl類,所需重載的DoPaint()函數的樣子如下所示:
復制代碼 代碼如下:

void DoPaint(CDCHandle dc, RECT& rect)
{
 CRect rc(rect);
 dc.FillSolidRect(&rc,WHITE_COLOR);
 HPEN hOldPen = dc.SelectPen(m_RectPen);
 const int width = 5;
 int x = 0;
 int count = rc.Width()/width;
 int height = 0;
 for (int i=0; i<count; i++)
 {
  height = (int)((double)rand()*rc.Height())/RAND_MAX;
  dc.Rectangle(x,rc.Height(),x+width,rc.Height()-height);
  x += width;
 }
 dc.SelectPen(hOldPen);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美重口另类videos人妖 | 亚洲网站免费观看 | 亚洲视频精品在线 | 中文字幕在线播放第一页 | 欧美一级高潮 | 精品久久久一二三区播放播放播放视频 | av在线直播观看 | 亚洲一区二区不卡视频 | 91精品国产综合久久男男 | 欧美四级在线观看 | 亚洲小视频 | 黄色片快播 | 圆产精品久久久久久久久久久 | 成年人视频在线免费观看 | 91懂色| 成人区一区二区 | 美女黄色毛片免费看 | 精品成人网 | 成人午夜在线免费视频 | 久久国产免费视频 | 久草网在线 | 综合精品一区 | 女人裸体让男人桶全过程 | 斗罗破苍穹在线观看免费完整观看 | 国产精品91久久久 | 久久精品一二三区白丝高潮 | 免费看日韩av | 九九热精品视频在线免费观看 | 一级一级一级一级毛片 | 国产日韩在线观看一区 | 国产精品一区二区三区在线播放 | xxxx69hd一hd72| 伊人久久电影网 | 毛片电影网址 | 有兽焉免费动画 | 久久国产午夜 | 久久精品亚洲成在人线av网址 | 精品一区二区三区在线播放 | 精品三区视频 | 午夜亚洲视频 | 久色视频|