// Version: 9.3 #if !defined(AFX_OXSHADOWEDWND_H__6BAD3A54_4046_453C_A79B_4A9BB99FF063__INCLUDED_) #define AFX_OXSHADOWEDWND_H__6BAD3A54_4046_453C_A79B_4A9BB99FF063__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "StdAfx.h" #include "OXShdWnd.h" // OXSkinnedWnd.h : header file // ///////////////////////////////////////////////////////////////////////////// // COXShadowedWnd window /* Description: COXSkinnedWnd is a template class that implements a window shadow. Usage: If you want a window to have a shadow just derive it from COXSkinnedWnd. Example: Creating a dialog with a shadow: class CMyDialog : public COXShadowedWnd */ template class COXShadowedWnd : public BASE_CLASS { // Construction public: COXShadowedWnd() { }; COXShadowedWnd(UINT nIDTemplate) : BASE_CLASS(nIDTemplate) { }; // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides protected: virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam); // Implementation public: virtual ~COXShadowedWnd() { }; private: COXShdWnd m_wndShadow; }; ///////////////////////////////////////////////////////////////////////////// // COXShadowedWnd template LRESULT COXShadowedWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { #if defined (_WINDLL) #if defined (_AFXDLL) AFX_MANAGE_STATE(AfxGetAppModuleState()); #else AFX_MANAGE_STATE(AfxGetStaticModuleState()); #endif #endif // TODO: Add your specialized code here and/or call the base class ASSERT_VALID(this); switch(message) { case WM_CREATE: { BOOL bRes = PtrToInt(BASE_CLASS::WindowProc(message, wParam, lParam)); CRect rect; GetWindowRect(rect); rect.OffsetRect(4, 4); // Create the shadow window m_wndShadow.CreateEx(/*WS_EX_TRANSPARENT*/0, AfxRegisterWndClass(CS_DBLCLKS), _T(""), WS_POPUP | WS_VISIBLE | WS_DISABLED, rect, AfxGetMainWnd(), NULL); m_wndShadow.SetCastingWindow(this); //ModifyStyle(DS_3DLOOK, 0); //Commented out by Nish : Jun/06/05 ModifyStyleEx(WS_EX_WINDOWEDGE, 0); return bRes; } case WM_DESTROY: { m_wndShadow.DestroyWindow(); break; } case WM_WINDOWPOSCHANGED: { WINDOWPOS* pWP = (WINDOWPOS*) lParam; if (::IsWindow(m_wndShadow.m_hWnd)) { m_wndShadow.SetWindowPos(this, pWP->x + 4, pWP->y + 4, pWP->cx, pWP->cy, /*SWP_NOZORDER |*/ SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_NOCOPYBITS); } break; } case WM_NCPAINT: { LRESULT lRes = BASE_CLASS::WindowProc(message, wParam, lParam); CWindowDC dc(this); CRect rectWindow; GetWindowRect(rectWindow); rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top); dc.DrawEdge(rectWindow, BDR_SUNKENOUTER, BF_FLAT | BF_RECT); rectWindow.DeflateRect(1, 1, 1, 1); dc.DrawEdge(rectWindow, BDR_RAISEDINNER, BF_FLAT | BF_RECT); return lRes; } case WM_SHOWWINDOW: { if (wParam) m_wndShadow.ShowWindow(SW_SHOW); else m_wndShadow.ShowWindow(SW_HIDE); break; } case WM_WINDOWPOSCHANGING: { if (::GetKeyState( VK_LBUTTON ) < 0) { m_wndShadow.ModifyStyleEx(0, WS_EX_TRANSPARENT); } break; } case WM_NCMOUSEMOVE: { // Remove the transparent style if (::GetKeyState( VK_LBUTTON ) >= 0) m_wndShadow.ModifyStyleEx(WS_EX_TRANSPARENT, 0); break; } } return BASE_CLASS::WindowProc(message, wParam, lParam); } ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_OXSHADOWEDWND_H__6BAD3A54_4046_453C_A79B_4A9BB99FF063__INCLUDED_)