/*--------------------------------------------------------------------------* * * Microsoft Windows * Copyright (C) Microsoft Corporation, 1992 - 1999 * * File: msgview.h * * Contents: Interface file for CMessageView * * History: 28-Apr-99 jeffro Created * *--------------------------------------------------------------------------*/ #ifndef __MESSAGEVIEW_H_ #define __MESSAGEVIEW_H_ #include "tstring.h" ///////////////////////////////////////////////////////////////////////////// // CMessageView class ATL_NO_VTABLE CMessageView : public CComObjectRootEx, public CComCoClass, public CComControl, public IMessageView, public IPersistStreamInitImpl, public IOleControlImpl, public IOleObjectImpl, public IOleInPlaceActiveObjectImpl, public IViewObjectExImpl, public IOleInPlaceObjectWindowlessImpl { public: CMessageView(); ~CMessageView(); DECLARE_NOT_AGGREGATABLE(CMessageView) DECLARE_MMC_OBJECT_REGISTRATION ( g_szMmcndmgrDll, // implementing DLL CLSID_MessageView, // CLSID _T("MessageView Class"), // class name _T("MessageView.MessageView.1"), // ProgID _T("MessageView.MessageView")) // version-independent ProgID BEGIN_COM_MAP(CMessageView) COM_INTERFACE_ENTRY(IMessageView) COM_INTERFACE_ENTRY_IMPL(IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY_IMPL(IOleControl) COM_INTERFACE_ENTRY_IMPL(IOleObject) COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit) END_COM_MAP() BEGIN_PROPERTY_MAP(CMessageView) // Example entries // PROP_ENTRY("Property Description", dispid, clsid) // PROP_PAGE(CLSID_StockColorPage) END_PROPERTY_MAP() BEGIN_MSG_MAP(CMessageView) MESSAGE_HANDLER (WM_CREATE, OnCreate) MESSAGE_HANDLER (WM_DESTROY, OnDestroy) MESSAGE_HANDLER (WM_SIZE, OnSize) MESSAGE_HANDLER (WM_SETTINGCHANGE, OnSettingChange) MESSAGE_HANDLER (WM_KEYDOWN, OnKeyDown) MESSAGE_HANDLER (WM_VSCROLL, OnVScroll) MESSAGE_HANDLER (WM_MOUSEWHEEL, OnMouseWheel) CHAIN_MSG_MAP (CComControl) END_MSG_MAP() #define MESSAGE_HANDLER_FUNC(func) LRESULT (func)(UINT msg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) MESSAGE_HANDLER_FUNC (OnCreate); MESSAGE_HANDLER_FUNC (OnDestroy); MESSAGE_HANDLER_FUNC (OnSize); MESSAGE_HANDLER_FUNC (OnSettingChange); MESSAGE_HANDLER_FUNC (OnKeyDown); MESSAGE_HANDLER_FUNC (OnVScroll); MESSAGE_HANDLER_FUNC (OnMouseWheel); DECLARE_WND_CLASS_EX(NULL, CS_HREDRAW, COLOR_WINDOW); // IViewObjectEx STDMETHOD(GetViewStatus)(DWORD* pdwStatus) { ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n")); *pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE; return S_OK; } // IMessageView STDMETHOD(SetTitleText)(LPCOLESTR pszTitleText); STDMETHOD(SetBodyText)(LPCOLESTR pszBodyText); STDMETHOD(SetIcon)(IconIdentifier id); STDMETHOD(Clear)(); public: HRESULT OnDraw(ATL_DRAWINFO& di); private: void RecalcLayout(); void RecalcIconLayout(); void RecalcTitleLayout(); void RecalcBodyLayout(); void UpdateSystemMetrics(); struct TextElement; void DrawTextElement (HDC hdc, TextElement& te, DWORD dwFlags = 0); int CalcTextElementHeight (const TextElement& te, int cx); HRESULT SetTextElement (TextElement& te, LPCOLESTR pszNewText); void CreateFonts (); void DeleteFonts (); void VertScroll (int nScrollCmd, int nScrollPos, int nRepeat); void ScrollToPosition (int yScroll); void UpdateScrollSizes (); int GetOverallHeight() const { return (m_TextElement[Body].rect.bottom + m_sizeMargin.cy); } private: enum { Title, Body, ElementCount }; struct TextElement { TextElement() : rect (0,0,0,0) {} tstring str; WTL::CFont font; WTL::CRect rect; }; TextElement m_TextElement[ElementCount]; HICON m_hIcon; WTL::CRect m_rectIcon; // for scrolling int m_yScroll; int m_yScrollMax; int m_yScrollMin; int m_cyPage; int m_cyLine; int m_nAccumulatedScrollDelta; // for WM_MOUSEWHEEL processing WTL::CSize m_sizeWindow; WTL::CSize m_sizeIcon; WTL::CSize m_sizeMargin; }; #endif //__MESSAGEVIEW_H_