读书人

需要实时在桌面DC上绘制但是在绘制前

发布时间: 2013-10-29 12:07:57 作者: rapoo

需要实时在桌面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中的内容,一次显示。

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

读书人网 >VC/MFC

热点推荐