我用dc将一些随时变化的文字信息在OnPaint()里画到面板上,设个定时器
文字的背景色我设置为透明色,然后在OnTimer函数里定时去刷新Invalidate(),
这样可以刷新,但刷新后面板(包括其它的一些按钮什么的)总是闪个不停,
请问各位高手该怎么处理,才能不闪。
void CPlayPane::OnPaint()
{
CString FileName;
CString Curr;
CString Time;
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* old=memDC.SelectObject(&m_tempBMP);
CRect rc;
this->GetClientRect(&rc);
CBrush br(&m_bkimg);
memDC.FillRect(&rc,&br);
//int CurrTime,hours,minute,temp,temp2,second;
//CClientDC dc(this);
memDC.SetBkMode(1);
//dc.SetBkColor(RGB(81,54,166));
//dc.SetTextColor(RGB(215,249,9));
memDC.SetTextColor(RGB(255,0,0));
memDC.SetBkMode(0); dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(old); dc.SetBkMode(1);
dc.TextOut(498,85,"0.0");
dc.TextOut(622,85,"0.25");
dc.TextOut(748,85,"0.5");
dc.TextOut(870,85,"1"); Time=m_pPlayer.TotalTime().c_str();
dc.TextOut(670,5,Time);
dc.TextOut(660,5,"/");
FileName.Format("%s",m_pPlayer.m_PlayBack->GetFileName().c_str());
dc.TextOut(110,5,FileName);
Curr=m_pPlayer.CurrTime().c_str();
dc.TextOut(600,5,Curr); dc.SetBkMode(0);
//SetTimer(2,100,NULL);
// CDC* pDC;
//ASSERT_VALID(pDC);}
void CPlayPane::OnTimer(UINT nIDEvent)
{
CWnd::UpdateWindow();
//if(nIDEvent==2)
Invalidate();..........}
文字的背景色我设置为透明色,然后在OnTimer函数里定时去刷新Invalidate(),
这样可以刷新,但刷新后面板(包括其它的一些按钮什么的)总是闪个不停,
请问各位高手该怎么处理,才能不闪。
void CPlayPane::OnPaint()
{
CString FileName;
CString Curr;
CString Time;
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* old=memDC.SelectObject(&m_tempBMP);
CRect rc;
this->GetClientRect(&rc);
CBrush br(&m_bkimg);
memDC.FillRect(&rc,&br);
//int CurrTime,hours,minute,temp,temp2,second;
//CClientDC dc(this);
memDC.SetBkMode(1);
//dc.SetBkColor(RGB(81,54,166));
//dc.SetTextColor(RGB(215,249,9));
memDC.SetTextColor(RGB(255,0,0));
memDC.SetBkMode(0); dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(old); dc.SetBkMode(1);
dc.TextOut(498,85,"0.0");
dc.TextOut(622,85,"0.25");
dc.TextOut(748,85,"0.5");
dc.TextOut(870,85,"1"); Time=m_pPlayer.TotalTime().c_str();
dc.TextOut(670,5,Time);
dc.TextOut(660,5,"/");
FileName.Format("%s",m_pPlayer.m_PlayBack->GetFileName().c_str());
dc.TextOut(110,5,FileName);
Curr=m_pPlayer.CurrTime().c_str();
dc.TextOut(600,5,Curr); dc.SetBkMode(0);
//SetTimer(2,100,NULL);
// CDC* pDC;
//ASSERT_VALID(pDC);}
void CPlayPane::OnTimer(UINT nIDEvent)
{
CWnd::UpdateWindow();
//if(nIDEvent==2)
Invalidate();..........}
{
CString FileName;
CString Curr;
CString Time;
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* old=memDC.SelectObject(&m_tempBMP);
CRect rc;
this->GetClientRect(&rc);
CBrush br(&m_bkimg);
memDC.FillRect(&rc,&br);
memDC.SetBkMode(1);
memDC.SetTextColor(RGB(255,0,0));
memDC.SetBkMode(0); memDC.SetBkMode(1);
memDC.TextOut(498,85,"0.0");
memDC.TextOut(622,85,"0.25");
memDC.TextOut(748,85,"0.5");
memDC.TextOut(870,85,"1"); Time=m_pPlayer.TotalTime().c_str();
memDC.TextOut(670,5,Time);
memDC.TextOut(660,5,"/");
FileName.Format("%s",m_pPlayer.m_PlayBack->GetFileName().c_str());
memDC.TextOut(110,5,FileName);
Curr=m_pPlayer.CurrTime().c_str();
memDC.TextOut(600,5,Curr); memDC.SetBkMode(0); dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(old);
}
这样试试呢?
如果不行,你重载
BOOL CPlayPane::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
// 被子窗口挡住的部分不用重画
long style;
style = GetWindowLong(m_hWnd,GWL_STYLE);
style = style | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |WS_MINIMIZEBOX;
SetWindowLong(m_hWnd,GWL_STYLE,style);
计算出文字输出区域用InvalidateRect
{
CPaintDC dc1(this); // device context for painting
dcMemory.CreateCompatibleDC(&dc1);
CBitmap bmp;//这里的Bitmap是必须的,否则当心弄出一个大黑块哦。
bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height());
dcMemory.SelectObject(&bmp);//接下来你想怎么画就怎么画吧。
//dcMemory.FillRect(rectClient,&brush); dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
// Do not call CWnd::OnPaint() for painting messages
}
{
return TRUE;
}
我创建的是一块播放面板,上面还创建了很多按钮(比如播放按钮等),
而我在OnPaint() 函数里面用dc画的只是一些文本和背景(按钮没放在这里创建和显示),
所以一强制刷新,面板上的文字和背景都没有闪(没问题),而是面板上其他的按钮在抖动,关键是怎么解决这个问题。望各位大哥再指点一下,谢谢!!!
2重载OnEraseBkGnd,返回TRUE