贴图时的频闪怎么处理

在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

 

你可能感兴趣的:(窗口,mfc,InvalidateRec,消除闪烁)