Re: Refelecting Messages to child window

"mmartinsson123" <[email protected]>
Newsgroups gmane.comp.windows.wtl
Message-ID <[email protected]>
Have a look at the code :-)

template <class T, class TBase = CCommandBarCtrlBase, class TWinTraits = CControlWinTraits>
	class ATL_NO_VTABLE CCommandBarCtrlImplXP : public CCommandBarCtrlImpl< T, TBase, TWinTraits >,
		public CThemeImpl< T >
	{
	public:
		DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())

		// Message map and handlers
		typedef CCommandBarCtrlImplXP< T, TBase, TWinTraits >   thisClass;
		typedef CCommandBarCtrlImpl< T, TBase, TWinTraits >     baseClass;

		BEGIN_MSG_MAP(CCommandBarCtrlXP)
			NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
			/*OCM_*/COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
			CHAIN_MSG_MAP(baseClass)
			CHAIN_MSG_MAP(CThemeImpl< T >)
			ALT_MSG_MAP(1)      // Parent window messages
			CHAIN_MSG_MAP_ALT(baseClass,1)
			ALT_MSG_MAP(2)		// MDI client window messages
			CHAIN_MSG_MAP_ALT(baseClass,2)
			ALT_MSG_MAP(3)		// Message hook messages
			CHAIN_MSG_MAP_ALT(baseClass,3)
			//REFLECTED_COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
			//MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging)
			//DEFAULT_REFLECTION_HANDLER()
		END_MSG_MAP()

		//BOOL SubclassWindow(HWND hWnd)
		//{
		//	BOOL bRet = baseClass::SubclassWindow(hWnd);
		//	if(bRet)
		//	{
		//		HWND hWndParent = ::GetParent(hWnd);
		//		RECT rc = {0,0,0,0};
		//		/*m_wndReflector.Create(hWndParent, &rc, NULL, WS_CHILD, 0,
		//			Reflector::REFLECTOR_MAP_ID);
		//		SetNotifyWnd(m_wndReflector);*/
		//	}
		//	return bRet;
		//}

		HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
			DWORD dwStyle = 0, DWORD dwExStyle = 0,
			UINT nID = 0, LPVOID lpCreateParam = NULL)
		{
			HWND hWnd = baseClass::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
			if (hWnd)
			{
				HWND hWndParent = ::GetParent(hWnd);
				RECT rc = {0,0,0,0};
				/*m_wndReflector.Create(hWndParent, &rc, NULL, WS_CHILD, 0,
					Reflector::REFLECTOR_MAP_ID);*/
				//SetNotifyWnd(hWnd);
			}
			return hWnd;
		}

		LRESULT OnFileNew(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
		{
			//CChildFrame* pChild = new CChildFrame;
			//		pChild->CreateEx(m_hWndClient);

			// TODO: add code to initialize document
			return 0;
		}

		LRESULT OnCustomDraw (int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
		{
			TCHAR sClass[128];

			GetClassName (pnmh->hwndFrom, sClass, 128);

			if ( _tcscmp (sClass, _T("nt.gui.commandbar")) )
			{
				return CDRF_DODEFAULT;
			}

			NMCUSTOMDRAW* pCustomDraw = (NMCUSTOMDRAW*)pnmh;

			if ( pCustomDraw->dwDrawStage == CDDS_PREPAINT )
			{
				// Request prepaint notifications for each item
				return CDRF_NOTIFYITEMDRAW;
			}
			if ( pCustomDraw->dwDrawStage == CDDS_ITEMPREPAINT )
			{
				CDCHandle cDC (pCustomDraw->hdc);
				CRect rc = pCustomDraw->rc;
				TCHAR sBtnText[128];

				::SendMessage (pnmh->hwndFrom, TB_GETBUTTONTEXT, pCustomDraw->dwItemSpec, (LPARAM)sBtnText);

				if ( pCustomDraw->uItemState & CDIS_HOT )
				{
					COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
					CPenDC pen (cDC, crHighLight);
					CBrushDC brush (cDC, (pCustomDraw->uItemState & CDIS_SELECTED) ? HLS_TRANSFORM (crHighLight, +50, -50) : HLS_TRANSFORM (crHighLight, +70, -57));

					cDC.Rectangle (rc);
					cDC.SetTextColor ((pCustomDraw->uItemState & CDIS_SELECTED) ? ::GetSysColor (COLOR_HIGHLIGHTTEXT) : RGB(0,0,0));
				}
				else
				{
					//                cDC.FillSolidRect (rc, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +20, 0));
					cDC.SetTextColor ( ::GetSysColor (m_bParentActive ? COLOR_BTNTEXT : COLOR_3DSHADOW ) );
				}
				cDC.SetBkMode (TRANSPARENT);
				cDC.SelectFont ((HFONT)GetStockObject (DEFAULT_GUI_FONT));
				cDC.DrawText (sBtnText, _tcslen (sBtnText), rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

				return CDRF_SKIPDEFAULT;
			}
			bHandled = FALSE;

			return CDRF_DODEFAULT;
		}

#define IMGPADDING 6
#define TEXTPADDING 8

		// From <winuser.h>
#define OBM_CHECK 32760

		void DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct)
		{
			_MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
			CDCHandle dc = lpDrawItemStruct->hDC;
			const RECT& rcItem = lpDrawItemStruct->rcItem;
			LPCRECT pRect = &rcItem;
			BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
			BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
			BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
			COLORREF crBackImg = CLR_NONE;
			CDCHandle* pDC = &dc; 

			if ( bSelected )
			{
				COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
				CPenDC pen (*pDC, crHighLight);
				CBrushDC brush (*pDC, crBackImg = bDisabled ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +73, 0) : HLS_TRANSFORM (crHighLight, +70, -57));

				pDC->Rectangle (pRect);
			}
			else
			{
				CRect rc (pRect);

				rc.right = m_szBitmap.cx+IMGPADDING;
				pDC->FillSolidRect (rc, crBackImg = HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +20, 0));
				rc.left = rc.right;
				rc.right = pRect->right;
				pDC->FillSolidRect (rc, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +75, 0));
			}
			if ( pmd->fType & MFT_SEPARATOR )
			{
				CPenDC pen (*pDC, HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -18, 0));

				pDC->MoveTo (pRect->left+m_szBitmap.cx+IMGPADDING+TEXTPADDING,  (pRect->top+pRect->bottom)/2);
				pDC->LineTo (pRect->right-1, (pRect->top+pRect->bottom)/2);
			}
			else
			{
				CRect rc (pRect);
				CString sCaption = pmd->lpstrText;
				int nTab = sCaption.Find ('\t');

				if ( nTab >= 0 )
				{
					sCaption = sCaption.Left (nTab);
				}
				pDC->SetTextColor (bDisabled ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -18, 0) : ::GetSysColor (COLOR_MENUTEXT));
				pDC->SetBkMode (TRANSPARENT);

				CBoldDC bold (*pDC, (lpDrawItemStruct->itemState & ODS_DEFAULT) != 0);

				rc.left = m_szBitmap.cx+IMGPADDING+TEXTPADDING;
				pDC->DrawText (sCaption, sCaption.GetLength(), rc, DT_SINGLELINE|DT_VCENTER|DT_LEFT);

				if ( nTab >= 0 )
				{    
					rc.right -= TEXTPADDING+4;
					pDC->DrawText (pmd->lpstrText+nTab+1, _tcslen (pmd->lpstrText+nTab+1), rc, DT_SINGLELINE|DT_VCENTER|DT_RIGHT);
				}
				if ( bChecked  )
				{
					COLORREF crHighLight = ::GetSysColor (COLOR_HIGHLIGHT);
					CPenDC pen (*pDC, crHighLight);
					CBrushDC brush (*pDC, crBackImg = bDisabled ? HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), +73, 0) :
						(bSelected ? HLS_TRANSFORM (crHighLight, +50, -50) : HLS_TRANSFORM (crHighLight, +70, -57)));

					pDC->Rectangle (CRect (pRect->left+1, pRect->top+1, pRect->left+m_szButton.cx-2, pRect->bottom-1));
				}
				if ( m_hImageList != NULL && pmd->iButton >= 0 )
				{
					bool bOver = !bDisabled && bSelected;

					if ( bDisabled || (bSelected && !bChecked) )
					{
						HICON hIcon = ImageList_ExtractIcon (NULL, m_hImageList, pmd->iButton);
						CBrush brush;

						brush.CreateSolidBrush (bOver ? HLS_TRANSFORM (::GetSysColor (COLOR_HIGHLIGHT), +50, -66) : HLS_TRANSFORM (::GetSysColor (COLOR_3DFACE), -27, 0));
						pDC->DrawState (CPoint (pRect->left + ( bOver ? 4 : 3 ), rc.top + ( bOver ? 5 : 4 )),
							CSize (m_szBitmap.cx, m_szBitmap.cx), hIcon, DSS_MONO, brush);
						DestroyIcon (hIcon);
					}
					if ( !bDisabled )
					{
						::ImageList_Draw (m_hImageList, pmd->iButton, pDC->m_hDC,
							pRect->left+( (bSelected && !bChecked) ? 2 : 3 ), rc.top+( (bSelected && !bChecked) ? 3 : 4 ), ILD_TRANSPARENT);
					}
				}
				else if ( bChecked )
				{
					// Draw the check mark
					rc.left  = pRect->left+5;
					rc.right = rc.left + m_szBitmap.cx+IMGPADDING;
					pDC->SetBkColor (crBackImg);
					HBITMAP hBmp = LoadBitmap (NULL, MAKEINTRESOURCE(OBM_CHECK));
					pDC->DrawState (CPoint (rc.left,rc.top+3), CSize(rc.Size()), hBmp, DSS_NORMAL, (HBRUSH)NULL);
					DeleteObject (hBmp);
				}
			}
		}

		LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
		{
			return DefWindowProc(uMsg, wParam, lParam);
		}
	};

	class CCommandBarCtrlXP : public CCommandBarCtrlImplXP<CCommandBarCtrlXP>
	{
	public:
		DECLARE_WND_SUPERCLASS(_T("WTL_commandbar"), GetWndClassName())
	};



------------------------------------

Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/wtl/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/wtl/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:[email protected] 
    mailto:[email protected]

<*> To unsubscribe from this group, send an email to:
    [email protected]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.