?? map.h
字號(hào):
// Map.h : Declaration of the CMap
#ifndef __MAP_H_
#define __MAP_H_
#include "resource.h" // main symbols
#include <atlctl.h>
#include <activscp.h>
#include "FunMapCP.h"
/////////////////////////////////////////////////////////////////////////////
// CMap
const int nPointCount = 200; // 計(jì)算 X 方向200個(gè)點(diǎn)
class ATL_NO_VTABLE CMap :
public CComObjectRootEx<CComSingleThreadModel>,
public CStockPropImpl<CMap, IMap, &IID_IMap, &LIBID_FUNMAPLib>,
public CComControl<CMap>,
public IPersistStreamInitImpl<CMap>,
public IOleControlImpl<CMap>,
public IOleObjectImpl<CMap>,
public IOleInPlaceActiveObjectImpl<CMap>,
public IViewObjectExImpl<CMap>,
public IOleInPlaceObjectWindowlessImpl<CMap>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CMap>,
public IPersistStorageImpl<CMap>,
public ISpecifyPropertyPagesImpl<CMap>,
public IQuickActivateImpl<CMap>,
public IDataObjectImpl<CMap>,
public IProvideClassInfo2Impl<&CLSID_Map, &DIID__IMapEvents, &LIBID_FUNMAPLib>,
public IPropertyNotifySinkCP<CMap>,
public CComCoClass<CMap, &CLSID_Map>,
public IPersistPropertyBagImpl<CMap>, // 手工添加持續(xù)性屬性包的接口
public IActiveScriptSite, // 手工添加腳本主機(jī)的接口
public CProxy_IMapEvents< CMap >
{
public:
CMap()
{
m_clrBackColor = RGB( 0, 0, 0 ); // 默認(rèn)背景(黑)
m_clrBorderColor = RGB( 128, 128, 128 ); // 默認(rèn)坐標(biāo)線(灰)
m_clrForeColor = RGB( 255, 255, 0 ); // 默認(rèn)函數(shù)曲線(黃)
m_xMax=4.0; // 默認(rèn) X 軸范圍 [-4.0 , +4.0]
m_yMax=1.0; // 默認(rèn) Y 軸范圍 [-1.0 , +1.0]
// 清空坐標(biāo)點(diǎn)數(shù)據(jù)
::memset( m_xVal, 0, sizeof(double) * nPointCount );
::memset( m_yVal, 0, sizeof(double) * nPointCount );
}
DECLARE_REGISTRY_RESOURCEID(IDR_MAP)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CMap)
COM_INTERFACE_ENTRY(IMap)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IViewObjectEx)
COM_INTERFACE_ENTRY(IViewObject2)
COM_INTERFACE_ENTRY(IViewObject)
COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceObject)
COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
COM_INTERFACE_ENTRY(IOleControl)
COM_INTERFACE_ENTRY(IOleObject)
COM_INTERFACE_ENTRY(IPersistStreamInit)
COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
COM_INTERFACE_ENTRY(IQuickActivate)
COM_INTERFACE_ENTRY(IPersistStorage)
COM_INTERFACE_ENTRY(IDataObject)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IPersistPropertyBag) // 添加持續(xù)性屬性包接口
COM_INTERFACE_ENTRY(IActiveScriptSite) // 添加腳本主機(jī)接口
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_PROP_MAP(CMap)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
PROP_ENTRY("Expression", 1, CLSID_MapPP) // 屬性:函數(shù)式
PROP_ENTRY("MaxX", 2, CLSID_MapPP) // 屬性:X半軸最大值
PROP_ENTRY("MaxY", 3, CLSID_MapPP) // 屬性:Y半軸最大值
PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
PROP_ENTRY("BorderColor", DISPID_BORDERCOLOR, CLSID_StockColorPage)
PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_StockColorPage)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
BEGIN_CATEGORY_MAP(CMap) // 添加腳本安全組件類型
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()
BEGIN_CONNECTION_POINT_MAP(CMap)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
CONNECTION_POINT_ENTRY(DIID__IMapEvents)
END_CONNECTION_POINT_MAP()
BEGIN_MSG_MAP(CMap)
CHAIN_MSG_MAP(CComControl<CMap>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
{
static const IID* arr[] =
{
&IID_IMap,
};
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i], riid))
return S_OK;
}
return S_FALSE;
}
// IViewObjectEx
DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// IActiveScriptSite 添加腳本主機(jī)接口的方法聲明
STDMETHOD(GetLCID)(/*[out]*/ LCID *plcid);
STDMETHOD(GetItemInfo)(/*[in]*/ LPCOLESTR pstrName, /*[in]*/ DWORD dwReturnMask, /*[out]*/ IUnknown **ppunkItem, /*[out]*/ ITypeInfo **ppTypeInfo);
STDMETHOD(GetDocVersionString)(/*[out]*/ BSTR *pbstrVersionString);
STDMETHOD(OnScriptTerminate)(/*[in]*/ const VARIANT *pvarResult, /*[in]*/ const EXCEPINFO *pexcepinfo);
STDMETHOD(OnStateChange)(/*[in]*/ SCRIPTSTATE ssScriptState);
STDMETHOD(OnScriptError)(/*[in]*/ IActiveScriptError *pase);
STDMETHOD(OnEnterScript)(void);
STDMETHOD(OnLeaveScript)(void);
// IMap
public:
// 腳本擴(kuò)展方法:計(jì)算10為底的對(duì)數(shù)
STDMETHOD(Log10)(/*[in]*/ double dbVal, /*[out,retval]*/ double * pdbVal);
// 腳本擴(kuò)展屬性:只讀屬性 PI
STDMETHOD(get_Pi)(/*[out, retval]*/ double *pVal);
// 腳本擴(kuò)展方法:用來(lái)保存腳本計(jì)算后的函數(shù)曲線坐標(biāo)點(diǎn)
// i: 第幾個(gè)點(diǎn) x: 自變量 y: 因變量
STDMETHOD(Result)(/*[in]*/ long i, /*[in]*/ double x, /*[in]*/ double y);
// 屬性讀寫(xiě)函數(shù)
STDMETHOD(get_Expression)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(put_Expression)(/*[in]*/ BSTR newVal);
STDMETHOD(get_MaxY)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_MaxY)(/*[in]*/ double newVal);
STDMETHOD(get_MaxX)(/*[out, retval]*/ double *pVal);
STDMETHOD(put_MaxX)(/*[in]*/ double newVal);
double m_xMax; // 保存屬性 X 半軸的最大值
double m_yMax; // 保存屬性 Y 半軸的最大值
double m_xVal[nPointCount]; // 自變量點(diǎn)
double m_yVal[nPointCount]; // 因變量點(diǎn)
CComBSTR m_sExpression; // 函數(shù)式
HRESULT OnDraw(ATL_DRAWINFO& di)
{
// 取得繪圖范圍
RECT& rc = *(RECT*)di.prcBounds;
// 計(jì)算坐標(biāo)原點(diǎn)
long x = rc.left + ( rc.right - rc.left )/2;
long y = rc.top + ( rc.bottom - rc.top )/2;
// 用背景顏色填充
COLORREF clr;
::OleTranslateColor( m_clrBackColor, NULL, &clr);
HBRUSH hbr = ::CreateSolidBrush( clr );
hbr = (HBRUSH)::SelectObject( di.hdcDraw, hbr );
Rectangle( di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom );
hbr = (HBRUSH)::SelectObject( di.hdcDraw, hbr );
::DeleteObject( hbr );
// 繪制坐標(biāo)線
::OleTranslateColor( m_clrBorderColor, NULL, &clr );
HPEN hPen = ::CreatePen( PS_SOLID, 0, clr );
hPen = (HPEN)::SelectObject( di.hdcDraw, hPen );
// 畫(huà) X 軸
::MoveToEx( di.hdcDraw, rc.left, y, NULL );
::LineTo( di.hdcDraw, rc.right, y );
// 畫(huà) X 軸上的箭頭
::SetPixel( di.hdcDraw, rc.right-2, y-1, clr );
::SetPixel( di.hdcDraw, rc.right-3, y-1, clr );
::SetPixel( di.hdcDraw, rc.right-3, y-2, clr );
::SetPixel( di.hdcDraw, rc.right-4, y-1, clr );
::SetPixel( di.hdcDraw, rc.right-4, y-2, clr );
::SetPixel( di.hdcDraw, rc.right-4, y-3, clr );
// 畫(huà) Y 軸
::MoveToEx( di.hdcDraw, x, rc.top, NULL );
::LineTo( di.hdcDraw, x, rc.bottom );
// 畫(huà) Y 軸上的箭頭
::SetPixel( di.hdcDraw, x-1, rc.top+1, clr );
::SetPixel( di.hdcDraw, x-1, rc.top+2, clr );
::SetPixel( di.hdcDraw, x-2, rc.top+2, clr );
::SetPixel( di.hdcDraw, x-1, rc.top+3, clr );
::SetPixel( di.hdcDraw, x-2, rc.top+3, clr );
::SetPixel( di.hdcDraw, x-3, rc.top+3, clr );
hPen = (HPEN)::SelectObject( di.hdcDraw, hPen );
::DeleteObject( hPen );
// 繪制函數(shù)曲線坐標(biāo)點(diǎn)
::OleTranslateColor( m_clrForeColor, NULL, &clr );
for( int i=0; i<nPointCount; i++ )
{
long xPos = (long)( x + ( rc.right - rc.left ) * m_xVal[i] / (m_xMax*2) );
long yPos = (long)( y - ( rc.bottom - rc.top ) * m_yVal[i] / (m_yMax*2) );
if(xPos>=rc.left && xPos<rc.right &&
yPos>=rc.top && yPos<rc.bottom)
{
::SetPixel( di.hdcDraw, xPos, yPos, clr );
}
}
return S_OK;
}
OLE_COLOR m_clrBackColor; // 背景色
OLE_COLOR m_clrBorderColor; // 坐標(biāo)線顏色
OLE_COLOR m_clrForeColor; // 函數(shù)曲線顏色
private:
BOOL Calc(); // 計(jì)算函數(shù)曲線的坐標(biāo)函數(shù)
};
#endif //__MAP_H_
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -