a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > 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);
}

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

圖片精選

主站蜘蛛池模板: 成人免费毛片高清视频 | 久热久热| 日本在线一 | 国产精品18 | 免费看a| 少妇撒尿一区二区在线视频 | 99精品国产热久久91蜜凸 | 7777久久| 午夜精品成人一区二区 | 一本岛在线视频 | 日韩成人一区二区 | 欧美日韩在线免费观看 | 九九九九精品九九九九 | 亚洲欧洲一区二区 | 在线亚洲成人 | 一本色道精品久久一区二区三区 | 青青草视频免费观看 | 欧美在线观看视频一区二区 | 亚洲国产福利在线 | 亚洲 欧美 在线 一区 | 99在线免费视频 | 污视频网站在线观看免费 | 亚洲精品久久久 | 亚洲精品欧美 | 日本久久久久久久 | 二区在线视频 | jjzz18国产 | 欧美精品亚洲精品 | 国产精品一区二区三区视频网站 | 中文字幕观看 | 精品久久久久久久久久久 | 精品国产乱码久久久久久久 | 国产在线小视频 | 国产精品久久久久久影视 | 精品国产一区二区三区四区 | 日韩综合 | 亚洲影视一区二区 | 亚洲热在线观看 | 国产精品视频二区不卡 | 国产亚洲精品久久久久久青梅 | 国产成人欧美一区二区三区一色天 |