首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

使用 ATL ActiveX 繪製任意平面函數曲線:腳本引擎應用

     編輯:關於VC++

前言

使用者輸入任意函數 f(x),繪製其曲線。核心難點在於運算式求值。編譯型語言需自行實作掃描、語法分析、AST 建構、逆波蘭表式轉換、堆疊運算,極其複雜。本文另闢蹊徑:動態產生腳本交由腳本引擎運算。

控件測試容器執行畫面

圖一:函數曲線繪製控件執行畫面

腳本引擎架構

2.1 建立腳本宿主

實作 IActiveScriptSite 介面 (8 方法):

  • GetLCID:語系查詢,可回 E_NOTIMPL 使用系統預設
  • GetItemInfo:提供 ITypeInfo (型別庫) 與 IUnknown (透過 IDispatch::Invoke 呼叫擴充函數)
  • GetDocVersionString:文件版本字串,可回 E_NOTIMPL
  • OnScriptTerminate:腳本結束通知
  • OnStateChange:狀態變更通知
  • OnScriptError/OnEnterScript/OnLeaveScript:錯誤/進入/離開通知

需 UI 互動時另實作 IActiveScriptSiteWindow。

2.2 建立自動化物件

實作 IDispatch 提供後繫結方法/屬性,經 GetItemInfo 傳給腳本引擎。

2.3 使用腳本引擎流程

  1. CoCreateInstance 建立引擎 COM 物件,取得 IActiveScript
  2. QueryInterface 取得 IActiveScriptParse
  3. InitNew 初始化
  4. AddNamedItem 指定項目名稱 (觸發 GetItemInfo)
  5. ParseScriptText 提交腳本文字
  6. SetScriptState 開始執行
  7. Close 關閉釋放

常用引擎 ProGID/CLSID:

引擎ProGIDCLSID
VBScriptVBScript{B54F3741-5B07-11CF-A4B0-00AA004A55E8}
JScriptJScript{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}
XMLScriptXML{989D1DC0-B162-11D1-B6EC-D27DDCF9A923}

範例程式實作

ATL ActiveX 控件同時扮演腳本宿主與自動化物件。使用者輸入 f(x),控件依視窗寬度與 X/Y 範圍迴圈產生腳本:

' 第 1 次呼叫動態產生的腳本
i = 0
x = -4.0
y = sin(x)
call Result(i, x, y)

每次迴圈更新 x、重新 ParseScriptText、執行取得 y,繪製點連線成曲線。

VBScript 內建函數速查

運算子函數
+, -, *, /, ^, MOD, \Abs, Sgn, Sqr, Int, Fix, Round
Log, Exp, Sin, Cos, Tan, Atn

擴充方法與屬性

  • Result(i,x,y):回傳座標點 (自動附加於腳本末行,勿手動呼叫)
  • Pi:3.1415926 (如 sin(x * Pi))
  • log10():10 為底對數

結語

本文重點介紹 Windows 程式呼叫腳本引擎方法,函數曲線繪製僅為示範。腳本引擎可實作更多創意功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved