开发记录:
1 2 3 4 5 6 7 8 9 10 |
//这里完成将dialog嵌入到空间本身绘制区域内,ocx通过web调用,即嵌入到IE内 void COCX_KankanCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid){ if (!pdc) return; m_mainDialog.MoveWindow( rcBounds , TRUE ); //OnDraw函数中注释掉 VS2010 自动生成的画一个椭圆的代码: // pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); // pdc->Ellipse(rcBounds); } |
1 2 3 4 5 6 7 8 9 10 11 |
//其中IDD_MAINDIALOG为插入dialog的ID标识,m_MainDialog为关联dialog类的**Ctrl类成员函数; //该函数主要完成创建dialog; int COCX_KankanCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here m_mainDialog.Create( IDD_CMainDialog , this ); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//MainDialog.h #define WM_MYGATHERMSG WM_USER+101 ////自定义的消息,应该在WM_USER基础上增加,但是前100最好不用 #define WM_MYRECMSG WM_USER+102 typedef void(_stdcall* FaceRecCallback)( LONG userID , CWnd* pCtrl ); class CMainDialog : public CDialogEx{ DECLARE_DYNAMIC(CMainDialog) afx_msg LRESULT OnGatherMessage( WPARAM wParam, LPARAM lParam ); afx_msg LRESULT OnRecMessage( WPARAM wParam, LPARAM lParam ); //OnMessage返回值必须为LRESULT,其形式为:afx_msg LRESULT OnMessage(WPARAM, LPARAM); public: CWnd* pCtrl;//trick and hock; FaceRecCallback FaceRecCallbackFunc; FaceRecCallback FaceGatherCallbackFunc; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//BEGIN_MESSAGE_MAP,手动添加自己的消息映射函数BEGIN_MESSAGE_MAP,把消息和函数指针联系起来 BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx) ON_MESSAGE( WM_MYGATHERMSG , OnGatherMessage )//消息映射,消息函数返回值类型为LRESULT ON_MESSAGE( WM_MYRECMSG , OnRecMessage ) END_MESSAGE_MAP() ... //WPARAM 和 LPARAM,消息响应机制;wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16A//PI中WndProc有两个参数: 一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此//根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。 LRESULT CMainDialog::OnGatherMessage( WPARAM wParam, LPARAM lParam ){ FaceGatherCallbackFunc( wParam , pCtrl ); return 0; } LRESULT CMainDialog::OnRecMessage( WPARAM wParam, LPARAM lParam ){ FaceRecCallbackFunc( wParam , pCtrl); return 0; } |
注册OCX:
- 点击: 开始——程序 - 附件 - 命令提示符,在”命令提示符“上点击鼠标右键,选择”以管理员身份运行“打开Dos命令窗口,
- 输入Regsvr32 [Path]OCX_Kankan.ocx
- 注册完之后查找classid。运行中输入Regedit来查找。在编辑器的查找里直接输入 .OCX文件名进行查找,找到:“HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxxxxxxxxxxxxxxxxxxxx}”主键后,再利用注册表编辑器菜单上-[注册表]-[导出注册表文件]-然后在文件选择窗里输入导出的注册表文件名,并在下面的[导出范围]单选框中选[选择的分支],最后按[保存]。
1 2 3 4 5 6 7 |
项名称: HKEY_CLASSES_ROOT\OCX_KANKAN.OCX_KankanCtrl.1\CLSID 类名称: <无类> 最近写入时间: 2015/6/18 - 15:20 值 0 名称: <NO NAME> 类型: REG_SZ 数据: {3109958A-8CDB-4579-B835-EA2EBC784778}//这就是classid |
Html5调用OCX:
HTML文件由文本和各种标志 (tags)组成,ActiveX 控件对于IE在HTML中的标志是<OBJECT>,该标记有几个重要的参数特性,它们是:
1)ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的方式。
2)CLASSID:是该控件唯一的UUID,告诉IE装入哪个对象。
3)CODEBASE:如果在用户机器上没有控件的当前版本,该参数告诉用户浏览器在哪里可找到要下载的控件和最新版本号.当控件作了修改后,可以更改版本号强制用户重新下载。
4)PARAM:该标记用于设置控件的初始属性值,它有两个特性:Name和Value,即属性名称和属性值。
1 2 3 4 |
<BODY> <object id="OCX_Kankan" width=600 height=600 classid="CLSID:7EC6C2A7-3B0A-492F-B974-2D4B835C0EEB" > </object> </BODY> |