需求:
js調用ocx方法,傳遞字符串到ocx控件中顯示
操作步驟:
一、新建 ocx 項目
二、填寫項目信息
三、完成項目創建
四、修改項目屬性
打開 項目屬性 -> 鏈接器 -> 常規 -> 逐用戶重定義 改為 是
五、打開資源視圖,創建 dialog
六、修改 dialog 屬性
邊框 改為 None
樣式 改為 child
可見 改為 True (*:必須設置成可見,不然網頁中看不見這個窗口)
七、添加一個 edit 控件,用來和網頁做交互
八、雙擊 dialog,添加類文件,基類(CDialog)
九、給新建的 test 類添加一個方法,用來和網頁交互,網頁傳遞數據過來,ocx進行顯示
test.h
public: long myShow(BSTR text);
test.cpp
long Test::myShow(BSTR text) { SetDlgItemText(IDC_EDIT1, text); return 0; }
十、在類視圖中,打開類向導,添加 create 消息,雙擊添加到現有處理程序,確認
十一、操作 MyOCXCtrl 類
MyOCXCtrl.h
#include "Test.h" public: Test tt;
MyOCXCtrl.cpp
// CMyOCXCtrl::OnDraw - 繪圖函數 void CMyOCXCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */) { if (!pdc) return; // TODO: 用您自己的繪圖代碼替換下面的代碼。 //pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); //pdc->Ellipse(rcBounds); tt.MoveWindow(rcBounds, TRUE); }
int CMyOCXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您專用的創建代碼 tt.Create(IDD_DIALOG1, this); return 0; }
十二、在類視圖中,添加一個方法,給網頁調用
十三、在 MyOCXCtrl 類中完善添加的方法
MyOCXCtrl.cpp
LONG CMyOCXCtrl::addEditText(BSTR text) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此處添加分派處理程序代碼 tt.myShow(text); return 0; }
十四、生成,然后注冊ocx
reg.bat
cd /d %~dp0
regsvr32 ./xxx.ocx
十五、編寫 HTML 進行測試
classID 是 MyOCX.idl 文件中 最后一個 uuid (CMyOCXCtrl 的類信息)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <object id="Test" classid="CLSID:d75dee6b-c9a5-4bcb-9644-ce39c033a228" width="400" height="300">123</object> <button onclick="test()">test</button> <script> function test(){ Test.addEditText("hahaha") } </script> </body> </html>
完結!