PAINT 的关系和机制(转载总结)

——————————————————————————————-

我们知道,绘制窗口的内容,通常是在WM_PAINT消息的处理中。这个消息会由各种各样的情况触发,例如,某个覆盖在自己之上的窗口关闭了,等等。不过,出于效率考虑,WM_PAINT消息的产生并不意味着整个窗口都需要重新绘制,考虑刚才说的例子,原来有个窗口B覆盖了窗口A的左上角,则窗口B关闭后,,窗口A就会收到一条WM_PAINT消息,但是需要绘制的其实只是左上角的那一部分(为了讨论简单,不考虑窗口自身的内容一直在变化的情况,如动画窗口之类的)。这里的左上角,正是一个“无效区域”。由此,我们可以解释一下InvalidateRect函数了,这个函数的作用非常简单,就是把某个矩形加入到窗口的无效区域列表中,告诉窗口在处理下一条WM_PAINT消息时,这个区域是需要重新绘制的。顺便说一下,InvalidateRect有个兄弟函数,不止是简单地处理一个矩形,而是处理一个区域,那就是InvalidateRgn函数,道理是一样的。

——————————————————————————————-

下面代码是按钮画圆功能,在画之前需要清除上一次的画的圆

voidCCircleDlg::OnButton1()

{

//TODO:Addyourcontrolnotificationhandlercodehere

//RedrawWindow();

//InvalidateRect(NULL);

//UpdateWindow();

UpdateData(TRUE);

CDC*pDC=GetDC();

pDC->SetMapMode(MM_LOMETRIC);

intHorzsize=pDC->GetDeviceCaps(HORZSIZE);

intVertsize=pDC->GetDeviceCaps(VERTSIZE);

if(m_Width!=0&&m_Height!=0)

pDC->Ellipse(0,0,10*m_Radius*Horzsize/m_Width,0-10*m_Radius*Vertsize/m_Height);//注意由于是UINT类型注意第4个参数的写法

}

1.WM_PAINT加入消息队列等待处理-InvalidateRect,InvalidateRect有个兄弟函数,不止是简单地处理一个矩形,而是处理一个区域,那就是InvalidateRgn函数

2.如果有无效区域,直接发送WM_PAINT到消息处理函数进行处理,不经过消息循环队列;如果没有无效区域啥事也不干-UpdateWindow

3.RedrawWindow可以[指定无效区域(包括矩形和路径)]这部分相当于InvalidateRect和InvalidateRgn,[并直接发送WM_PAINT到消息处理函数进行处理]这部分相当于UpdateWindow,相当于以上两者的综合。

所以上例有两种处理方法:

1.直接加个RedrawWindow了事,这时认为所有区域都是无效,直接发送WM_PAINT到消息处理函数进行处理。

2.加两句

InvalidateRect(NULL);

UpdateWindow();

第一句使整个区域无效

第二句UpdateWindow检测到有无效区域,直接发送WM_PAINT到消息处理函数进行处理。

要知道,当你一直在担心错过了什么的时候,

PAINT 的关系和机制(转载总结)

相关文章:

你感兴趣的文章:

标签云: