最近有個需求,要在KingScada上面開發一個控件。
原來是用的WinCC,WinCC本身是支持調用.net控件,就是winform控件的,winform控件開發簡單,相對功能也更豐富。奈何WinCC不是國產的。
話說KingScada,國產組態軟件里面,做的比較好的了,但是不支持.net控件,只支持OCX,實際上就是ActiveX,一個已經被世人遺忘的玩意。
一、啥是ActiveX
? ? ? ? 實際就是開發一個自定義系統組件,類似按鈕,下拉框,文本框。開發完,還得在系統注冊一下才能用。注冊指令regsvr32 OCX控件文件
二、開發準備
? ? ? ? 首先需要使用VS,我這里使用的VS2017。VS需要安裝MFC庫,能看出來MFC已經被VS拋棄了,在VC6的時代,MFC是核心功能。現在MFC需要在單個組件,往下拉很久才能看到。見下圖。真不容易找。
三、創建項目
見下圖,找到MFC/ATL,選中ActiveX控件。位置換一個喜歡的位置就行了。
下面這個圖,選默認就行了,不用動。
?下一步,最好還是直接跳過。不要修改默認配置。
創建好以后,右側是項目的結構。MyControl.cpp是控件的入口文件,一般不用動。
MyControlCtrl.h和MyControlCtrl.CPP是ActiveX控件的代碼。但是這個控件沒有資源文件,就沒法可視化設計,必須用代碼創建子控件。
propPage是控件屬性頁,實際不用這個也可以,用普通的Dialog也可以。?
RC文件里包含兩個對畫面,圖表,字符串等。這兩個Dialog可以雙擊可視化編輯。?
屬性頁可視化編輯見下圖。目前這個屬性頁沒啥用。?
四、運行項目看效果
效果如下,報了個錯,提示沒有權限,但是能看出來已經生成了MyControl.OCX
?可以用管理員身份的CMD去運行這個指令,見下圖:
成功以后,怎么用這個控件呢?
五、KingScada加載控件
點組態王,對象,OCX控件
然后找到控件名稱,點擊確定就行了。
?控件上去的效果,見下圖。目前是啥代碼都沒有寫,默認就化一個圓圈。
?六、隨便加點功能
首先加一個文字輸出,見下圖:
變成了這個樣子。說明代碼沒有問題。?
七、添加一個按鈕
光繪圖是不行的,需要增加子控件。MFC本身可以可視化調整窗體,但是這個地方不行。必須手動創建。
按鈕是CButton,首先需要在控件頭文件里面聲明,見下圖。初始化需要寫在ondraw里面,但是只能初始化一次,用ready來判斷是否初始化完成。init函數里面完成對按鈕的初始化。
?CPP文件對應添加的內容如下,主要是初始化,調用,以及釋放資源。
效果見下面圖:?
八、點擊事件
在頭文件里面增加一個事件函數聲明,聲明在protected下面
afx_msg void OnBtnClick();//聲明一個事件函數?
在cpp文件實現:
綁定事件,見下圖,在MESSAGE_MAP里面綁定?
九、最后是測試
由于我KingScada沒有加密狗,所以用Winfform?測試。效果圖下:
?最后補充一下,這個控件在winform,瀏覽器,KingScada,KingView,WinCC等支持OCX的地方都可以使用。
但是這仍然是一個被淘汰的技術,希望KingScada盡快支持.net,獲取其他方式進行插件開發。