MFC 基於對話框的雙緩存繪圖

 

1.在dlg類中添加如下定義

HWND m_hWnd;
CRect m_rect;
HDC hdc;
CDC* pDC;
CRect rectClient;
float num;//用於計數,初始化爲零

2.添加WM_TIMER消息。添加按鈕1,在其響應函數中開啓時鐘。添加靜態文本框用於計時(num)

 

3.在OnTimer函數中,代碼如下

SetDlgItemInt(IDC_STATIC,num,1);	
GetClientRect(&m_rect);//創建設備描述表
hdc=::GetDC(m_hWnd);//獲得窗口的設備描述表
//pDC=GetDC();
int a=500,b=500,c=1000,d=600;
a=200;
b=100;
GetClientRect(rectClient);
CBitmap MemBitmap;
CDC MemDC;	
pDC=GetDC();
MemDC.CreateCompatibleDC(pDC);//創建與目標DC相兼容的內存DC---MemDC
MemBitmap.CreateCompatibleBitmap(pDC,m_rect.Width(),m_rect.Height());//根據目標DC創建位圖
MemDC.SelectObject(&MemBitmap);//把位圖選入內存DC

MemDC.SetMapMode(MM_ANISOTROPIC);
MemDC.SetWindowOrg(a,b);//設置原點
MemDC.SetWindowExt(c,d);//設定窗口尺寸,即繪圖區的大小
MemDC.SetViewportExt(rectClient.right,rectClient.bottom);
MemDC.SetViewportOrg(0,0);

MemDC.FillSolidRect(m_rect,RGB(0,255,0));//背景填充

CPen newPen(PS_SOLID,1, RGB(255,0,0));//創建畫筆
MemDC.SelectObject(&newPen);//選用畫筆

MemDC.MoveTo(0,0);
MemDC.LineTo(200,400);


MemDC.MoveTo(a,b);
num=num+1;
if(num<=c)
{
	for(int i=0;i<num;i++)
	{
		MemDC.LineTo(i+a,-d*(sin(i*0.01))/2+b+d/2);
	}		
}
else
{
	float t=num-c;
	for(int i=0;i<=c;i++)
	{
		MemDC.LineTo(i+a,-d*(sin((i+t)*(c/1000)*0.01))/2+b+d/2);
	}
}
pDC->BitBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(),&MemDC,0,0,SRCCOPY);
ReleaseDC(pDC);//釋放DC	
CDialogEx::OnTimer(nIDEvent);

4效果如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章