在VC对话框里,总是会遇到贴图重绘时发生频闪,原因有2个:
1,,对整个窗口进行刷新;
2,刷新重绘时,对背景进行了擦出。
今天看到一个函数可以消除这种情况,特意贴出来供大家参考:
假如有4个图片框控件:CStatic *pSt[4];
在对图片处理后,想把结果在图片框里显示,可以先调用下面这个函数,尤其注意最后一句:
这样重绘的区域为rect,且不擦出背景重绘,频闪效果消除。可能还有更好的效果,请大家畅所欲言。热烈讨论。
void CXXDlg::UpdateImageRect()
{
CStatic*pSt[4];
pSt[0]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE1);
pSt[1]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE2);
pSt[2]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE3);
pSt[3]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE4);
for(int i=0; i<PLOTNUM; i++)
{
RECTrect;
pSt[i]->GetWindowRect(&rect);
ScreenToClient(&rect);
InvalidateRect(&rect,FALSE);//不擦出背景画画
}
}
然后在OnPaint()函数(这里基于对话框框架)
添加:
void CXXDlg::OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND,(WPARAM) dc.GetSafeHdc(), 0);
//Center icon in client rectangle
intcxIcon = GetSystemMetrics(SM_CXICON);
intcyIcon = GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx = (rect.Width() - cxIcon + 1) / 2;
inty = (rect.Height() - cyIcon + 1) / 2;
//Draw the icon
dc.DrawIcon(x,y, m_hIcon);
}
else
{
CPaintDCdc(this); // device context for painting
IplImage*ShownImage;
CStatic*pSt[PLOTNUM];
pSt[0]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE1);
pSt[1]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE2);
pSt[2]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE3);
pSt[3]= (CStatic *)GetDlgItem(IDC_STATIC_IMAGE4);
for(int i=0; i<4; i++)
{
//计算视频区域位置
RECTrect;
pSt[i]->GetWindowRect(&rect);
ScreenToClient(&rect);
m_FrameOrg[i].Show(dc.GetSafeHdc(),rect.left, rect.top,
rect.right-1,rect.bottom-1, 0, 0 );
/// m_FrameOrg[i] 为图片指针对象数组,调用它的显示函数
}
CDialog::OnPaint();
}
}
spaYn=��`_�d值为NULL的消息,该消息由函数PostThreadMessage寄送。如果wMsgFilterMin和wMsgFilterMax都为零,PeekMessage返回所有可得的消息(即,无范围过滤)。常数WM_KEYFIRST和WM_KEYLAST可作为过滤值取得所有键盘消息;常数WM_MOUSEFIRST和WM_MOUSELAST可用来接收所有的鼠标消息。
PeekMessage通常不从队列里清除WM_PAINT消息。该消息将保留在队列里直到处理完毕。但如果WM_PAINT消息有一个空更新区,PeekMessage将从队列里清除WM_PAINT消息。[1]
Windows CE:有一个NULL更新区的WM_PAINT消息不从队列里清除。
以上的接受消息的两个函数恰好与发消息的两个函数相对应:PostMessage SendMessage