本人要实现在某一个小矩形区域内图形变换, 如果直接在该区域画上新图形,会造成原来的图形没有擦除,后面的图形有可能比它小,而盖上去,仍然能看到前面的图形。
我现在的想法是,把该区域的背景获得,再画一遍,然后再在上面添加新的图形。 请问这如何实现:主要是如何实现获取该区域原来背景图? 求具体做法和相关函数! 本人曾经考虑采用invalidaterect()函数把原来的图形擦除,但是我这个图形变化是时间1秒钟触发一次,造成的结果是,新图一出来就闪一下没了,等到下一个时钟,又出来新图然后又闪一下没了, 对于这个方法,本人不得其解, 所以只好放弃,而采用上述方法。!
我现在的想法是,把该区域的背景获得,再画一遍,然后再在上面添加新的图形。 请问这如何实现:主要是如何实现获取该区域原来背景图? 求具体做法和相关函数! 本人曾经考虑采用invalidaterect()函数把原来的图形擦除,但是我这个图形变化是时间1秒钟触发一次,造成的结果是,新图一出来就闪一下没了,等到下一个时钟,又出来新图然后又闪一下没了, 对于这个方法,本人不得其解, 所以只好放弃,而采用上述方法。!
void CTestbackgroundDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
srand( (unsigned)time( NULL ) );
int shape = rand()%3;
CClientDC dlgDC(this);
CRect rect(basex+5,basey+5, basex+size+1-5, basey+size+1-5);
CPoint pts[4];
switch (shape)
{
case 0:
//画三角形 pts[0].x= basex;
pts[0].y= basey;
pts[1].x = basex+size;
pts[1].y = basey;
pts[2].x = basex;
pts[2].y = basey + size;
pts[3].x = basex;
pts[3].y = basey;
InvalidateRect(&rect, true);
dlgDC.Polygon(pts, 4);
break;
case 1:
pts[0].x= basex;
pts[0].y= basey+size ;
pts[1].x = basex+size;
pts[1].y = basey+size;
pts[2].x = basex+size;
pts[2].y = basey;
pts[3].x = basex;
pts[3].y = basey+size;
InvalidateRect(&rect, true);
dlgDC.Polygon(pts, 4);
break;
case 2:
pts[0].x = basex;
pts[0].y = basey;
pts[1].x = basex+size;
pts[1].y = basey;
pts[2].x = basex+size;
pts[2].y = basey + size;
pts[3].x = basex;
pts[3].y = basey;
InvalidateRect(&rect, true);
dlgDC.Polygon(pts, 4);
break;
default:
break;
} CDialog::OnTimer(nIDEvent);
}
我主要实现功能是设置一个时钟,然后根据时钟触发, 当生成随机数是0,1 ,2时分别在固定的方形区域内画三角形,并且在画之前先使用invalidaterect()该区域,很奇怪的是,新画的图只是一闪就过去了, 我一直不知道我这里出了什么问题,请各位执教!