?? map.cpp
字號:
// Map.cpp : Implementation of CMap
#include "stdafx.h"
#include "FunMap.h"
#include "Map.h"
#include <math.h>
/////////////////////////////////////////////////////////////////////////////
// CMap
STDMETHODIMP CMap::get_MaxX(double *pVal)
{ //取得屬性,X 半軸的最大值
*pVal = m_xMax;
return S_OK;
}
STDMETHODIMP CMap::put_MaxX(double newVal)
{ //設置屬性,X 半軸的最大值
m_xMax = fabs( newVal );
FireViewChange();
return S_OK;
}
STDMETHODIMP CMap::get_MaxY(double *pVal)
{ //取得屬性,Y 半軸的最大值
*pVal = m_yMax;
return S_OK;
}
STDMETHODIMP CMap::put_MaxY(double newVal)
{ //設置屬性,Y 半軸的最大值
m_yMax = fabs( newVal );
FireViewChange();
return S_OK;
}
STDMETHODIMP CMap::get_Expression(BSTR *pVal)
{ //取得屬性,函數式
*pVal = m_sExpression.Copy();
return S_OK;
}
STDMETHODIMP CMap::put_Expression(BSTR newVal)
{ //設置屬性,函數式
m_sExpression = newVal;
if(Calc())
{
FireViewChange();
return S_OK;
}
else return E_INVALIDARG;
}
BOOL CMap::Calc()
{ //根據函數式,計算函數曲線的坐標點
CComQIPtr< IActiveScript > pAS;
pAS.CoCreateInstance( L"VBScript" );
if( !pAS )
{
Fire_ScriptErr( CComBSTR( _T("加載 VBScript 引擎失敗")) );
return FALSE;
}
CComQIPtr< IActiveScriptParse > pASP(pAS);
if( !pASP )
{
Fire_ScriptErr( CComBSTR( _T("查詢解析接口失敗")) );
return FALSE;
}
pAS->SetScriptSite( this );
HRESULT hr = pASP->InitNew();
if( FAILED(hr) )
{
Fire_ScriptErr( CComBSTR( _T("解析接口初始化失敗")) );
pAS->Close(); return FALSE;
}
hr = pAS->AddNamedItem(L"MyObject", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE);
if( FAILED(hr) )
{
Fire_ScriptErr( CComBSTR( _T("添加腳本命名錯誤")) );
pAS->Close(); return FALSE;
}
::memset( m_xVal, 0, sizeof(double) * nPointCount );
::memset( m_yVal, 0, sizeof(double) * nPointCount );
USES_CONVERSION;
for(int i=0; i<nPointCount; i++)
{
TCHAR szScript[1000];
double x=i*(2*m_xMax)/nPointCount-m_xMax; //求得自變量的值
char strX[20]; ::_gcvt(x,7,strX);
::wsprintf( szScript,
_T("i=%d\r\nx=%s\r\ny=%s\r\ncall Result(i,x,y)"),
i,A2CT(strX),OLE2CT(m_sExpression));
// ::MessageBox(NULL,szScript,_T("生成的腳本程序"),MB_OK);
/*****************************************************************
生成 VBScript 的樣式為:
i = 0 '當前正在計算的點的序號(0 ~ 199)
x = -4.0 '自變量的值(根據序號、窗口范圍和X軸坐標范圍計算得到)
y = sin(x) '用戶輸入的函數式f(x)
call Result( i, x, y ) '調用自身對象的函數,保存坐標點
******************************************************************/
EXCEPINFO ei;
hr = pASP->ParseScriptText( CComBSTR( szScript ), L"MyObject",
NULL, NULL, 0, 0, 0, NULL, &ei);
if( FAILED( hr ) ) continue;
hr = pAS->SetScriptState( SCRIPTSTATE_CONNECTED );
if( FAILED( hr ) ) continue;
}
pAS->Close();
return TRUE;
}
// IActiveScriptSite
STDMETHODIMP CMap::GetLCID(/*[out]*/ LCID *plcid)
{ // 取得當前使用的語言環境
return E_NOTIMPL; //使用默認的語言
}
STDMETHODIMP CMap::GetItemInfo(/*[in]*/ LPCOLESTR pstrName,
/*[in]*/ DWORD dwReturnMask,
/*[out]*/ IUnknown **ppunkItem,
/*[out]*/ ITypeInfo **ppTypeInfo)
{
if(ppTypeInfo)
{ //取得類型信息庫,供 VBScript 進行函數解析用
*ppTypeInfo = NULL;
if(dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
CComPtr< ITypeLib > sptLib;
::LoadTypeLib( L"FunMap.tlb", &sptLib ); //裝載自身的類型庫
if( sptLib )
sptLib->GetTypeInfo( 0, ppTypeInfo );
}
}
if(ppunkItem)
{ //取得 IUnknown 指針,供 VBScript 將來的函數調用
*ppunkItem = NULL;
if(dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
if ( 0 == _wcsicmp( L"MyObject", pstrName ) )
{
ControlQueryInterface( IID_IUnknown, (LPVOID *)ppunkItem );
}
}
}
return S_OK;
}
STDMETHODIMP CMap::GetDocVersionString(/*[out]*/ BSTR *pbstrVersionString)
{
return E_NOTIMPL;
}
STDMETHODIMP CMap::OnScriptTerminate(/*[in]*/ const VARIANT *pvarResult, /*[in]*/ const EXCEPINFO *pexcepinfo)
{
return S_OK;
}
STDMETHODIMP CMap::OnStateChange(/*[in]*/ SCRIPTSTATE ssScriptState)
{
return S_OK;
}
STDMETHODIMP CMap::OnScriptError(/*[in]*/ IActiveScriptError *pase)
{ // 當用戶輸入了不正確的函數式,或腳本執行的時候出錯
CComBSTR err,msg;
HRESULT hr = pase->GetSourceLineText( &err );
if( FAILED(hr) || !err.Length() )
msg = _T("執行錯誤");
else
{
msg = _T("語法錯誤: ");
msg.AppendBSTR( err );
}
Fire_ScriptErr( msg );
return S_OK;
}
STDMETHODIMP CMap::OnEnterScript(void)
{
return S_OK;
}
STDMETHODIMP CMap::OnLeaveScript(void)
{
return S_OK;
}
STDMETHODIMP CMap::Result(long i, double x, double y)
{ // 動態生成的腳本調用該函數,用來保存函數曲線的坐標
if( ( i >= 0 ) && ( i < nPointCount ) )
{
m_xVal[i] = x;
m_yVal[i] = y;
}
return S_OK;
}
STDMETHODIMP CMap::get_Pi(double *pVal)
{ // 取得屬性 PI
*pVal = 3.1415926;
return S_OK;
}
STDMETHODIMP CMap::Log10(double dbVal, double *pdbVal)
{ // 計算 10 為底的對數
*pdbVal = ::log10( dbVal );
return S_OK;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -