首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

需要实时在桌面DC上绘制,但是在绘制前怎么刷新前面绘制的残留

2013-10-29 
需要实时在桌面DC上绘制,但是在绘制前如何刷新前面绘制的残留最近在项目中要用到桌面共享功能,在共享了一

需要实时在桌面DC上绘制,但是在绘制前如何刷新前面绘制的残留
最近在项目中要用到桌面共享功能,在共享了一个桌面上的任意一个程序后,需要在该程序的窗口四周绘制一个红色矩形边框,让用户知道他当前正在共享红色矩形内的程序,类似于Skype的桌面共享程序。
我选择在桌面DC上绘制,通过定时器控制。代码如下,但是遇到一个问题,在重新绘制新的边框之前,老的边框还残留在上面。试了几种方法都没有能让桌面重绘,

::SHChangeNotify( SHCNE_ASSOCCHANGED , SHCNF_IDLIST | SHCNF_FLUSH, 0, 0); 

可能刷掉,但是桌面闪动太厉害。请问大家有没有什么好的方法刷新一下桌面?


void CShareWindowSolidDlg::OnTest()
{
GetDesktopWindow()->Invalidate(false);
GetDesktopWindow()->UpdateWindow();

//::PostMessage( GetDesktopWindow()->GetSafeHwnd(),WM_ERASEBKGND,NULL,NULL);
//::PostMessage(GetDesktopWindow()->GetSafeHwnd(),WM_PAINT,NULL,NULL);
//::SHChangeNotify( SHCNE_ASSOCCHANGED , SHCNF_IDLIST | SHCNF_FLUSH, 0, 0); 
CRect rcWnd;
this->GetWindowRect( &rcWnd );
//CDC* pWndDC = m_pWnd->GetWindowDC();
HDC hDesk = ::GetDC( NULL );
CDC* pWndDC = CDC::FromHandle(hDesk );

CPen pen( PS_SOLID,5, RGB(255, 0, 0));
pWndDC->SelectObject( &pen ); 

//pWndDC->DrawEdge( rcWnd, BDR_RAISEDINNER|BDR_RAISEDOUTER, BF_RECT );
pWndDC->MoveTo( CPoint(rcWnd.left - 6, rcWnd.top - 6 ) );
pWndDC->LineTo( CPoint(rcWnd.right + 6, rcWnd.top - 6 ) );
        // 此处只绘制一条直线实验
::ReleaseDC( GetDesktopWindow()->m_hWnd ,hDesk );
}


void CShareWindowSolidDlg::OnBnClickedOk()
{
SetWindowText( _T("ShareWindow") );
HWND hWnd = ::FindWindow( _T(""), _T("ShareWindow") );

m_pWnd = CWnd::FromHandle( this->GetSafeHwnd() );
SetTimer( 1, 100, NULL );
}

void CShareWindowSolidDlg::OnTimer( UINT_PTR nIDEvent )
{
OnTest();
}


[解决办法]
INvalidate或者REDRAW
[解决办法]
不要 这么 复杂。
1. 找打一个程序后。
取得 该 窗口 的 hWnd,
2. SetROP(dc,R2_XORPEN);
3. 画 边框。
4. 在 找到 另一个 窗口 时, 对 上次 窗口 再 画 一次。
[解决办法]
截取当前桌面DC,放在内存里面,定时器绘制在内存DC中的内容,一次显示。

这个双缓存效果应该会好很多

热点排行