MFC SDI: How do I create transparent SDI views

来源:互联网 发布:snmp获取linux信息 编辑:程序博客网 时间:2024/06/05 02:06

 

MFC SDI: How do I create transparent SDI views?

Q: How do I create transparent SDI views?

A: One can make a the view of an MFC application transparent by handling 'CView::OnEraseBkgnd()' function and returning 'FALSE' instead of the default 'CView::OnEraseBkgnd()' call.


Code:
BOOL CTransparentView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return FALSE;// return CView::OnEraseBkgnd(pDC);}

But this will not give a real transparent window, since the original view background will be dragged along while moving the application window. To overcome this, I have handled 'OnMove()' and 'OnSize()' functions of 'CMainFrame' class to update the view to reflect the real background, by repainting the view each time the application window is moved / sized.


Code:
void CMainFrame::OnMove(int x, int y) { CFrameWnd::OnMove(x, y); // TODO: Add your message handler code here RepaintView();}void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize(nType, cx, cy); // TODO: Add your message handler code here RepaintView();}

I have defined a function 'RepaintWindow()' as part of the 'CMainFrame' class and implemented to repaint the view with correct background information.


Code:
void CMainFrame::RepaintView(){ // Gets current view CView* pView = GetActiveView(); if (pView) // Valid view { // Hides view to get background ShowWindow(SW_HIDE); // Gets desktop device context HDC hDC = ::GetDC(NULL); if (hDC) // Valid device context handle { // Get clients rectangle in screen coordinates CRect Rect; pView->GetClientRect(Rect); pView->ClientToScreen(Rect); // Gets device context for current view CClientDC DC(pView); // Pastes background to view ::BitBlt(DC.m_hDC, 0, 0, Rect.Width(), Rect.Height(), hDC, Rect.left, Rect.top, SRCCOPY); // Releases desktop device context ::ReleaseDC(NULL, hDC); } // Shows view with right background info ShowWindow(SW_SHOW); }}

At present, this is implemented for SDI application. With little modification (for updating all views), this methodology can be extended for MDI applications as well.
原创粉丝点击