64,643
社区成员
发帖
与我相关
我的任务
分享
// activeEventCtrl.cpp : CactiveEventCtrl ActiveX 控件类的实现。
#include "stdafx.h"
#include "activeEvent.h"
#include "activeEventCtrl.h"
#include "activeEventPropPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CactiveEventCtrl, COleControl)
// 消息映射
BEGIN_MESSAGE_MAP(CactiveEventCtrl, COleControl)
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()
// 调度映射
BEGIN_DISPATCH_MAP(CactiveEventCtrl, COleControl)
DISP_FUNCTION_ID(CactiveEventCtrl, "Test", dispidTest, Test, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()
// 事件映射
BEGIN_EVENT_MAP(CactiveEventCtrl, COleControl)
EVENT_CUSTOM_ID("OK", eventidOK, OK, VTS_NONE)
END_EVENT_MAP()
// 属性页
// TODO: 按需要添加更多属性页。请记住增加计数!
BEGIN_PROPPAGEIDS(CactiveEventCtrl, 1)
PROPPAGEID(CactiveEventPropPage::guid)
END_PROPPAGEIDS(CactiveEventCtrl)
// 初始化类工厂和 guid
IMPLEMENT_OLECREATE_EX(CactiveEventCtrl, "ACTIVEEVENT.activeEventCtrl.1",
0xbd0b363, 0xb45e, 0x414f, 0x85, 0x1e, 0xb5, 0xa9, 0x70, 0x6a, 0xff, 0x7d)
// 键入库 ID 和版本
IMPLEMENT_OLETYPELIB(CactiveEventCtrl, _tlid, _wVerMajor, _wVerMinor)
// 接口 ID
const IID BASED_CODE IID_DactiveEvent =
{ 0x91BFFB21, 0x3826, 0x4F51, { 0x80, 0x2F, 0xD7, 0x41, 0x37, 0x6B, 0x88, 0xC7 } };
const IID BASED_CODE IID_DactiveEventEvents =
{ 0x2B04D24F, 0x3C4E, 0x4987, { 0x84, 0x22, 0xD5, 0xA4, 0xF5, 0x24, 0x8D, 0x3 } };
// 控件类型信息
static const DWORD BASED_CODE _dwactiveEventOleMisc =
OLEMISC_INVISIBLEATRUNTIME |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CactiveEventCtrl, IDS_ACTIVEEVENT, _dwactiveEventOleMisc)
// CactiveEventCtrl::CactiveEventCtrlFactory::UpdateRegistry -
// 添加或移除 CactiveEventCtrl 的系统注册表项
BOOL CactiveEventCtrl::CactiveEventCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: 验证您的控件是否符合单元模型线程处理规则。
// 有关更多信息,请参考 MFC 技术说明 64。
// 如果您的控件不符合单元模型规则,则
// 必须修改如下代码,将第六个参数从
// afxRegApartmentThreading 改为 0。
if (bRegister)
return AfxOleRegisterControlClass(
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_ACTIVEEVENT,
IDB_ACTIVEEVENT,
afxRegApartmentThreading,
_dwactiveEventOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}
// CactiveEventCtrl::CactiveEventCtrl - 构造函数
CactiveEventCtrl::CactiveEventCtrl()
{
InitializeIIDs(&IID_DactiveEvent, &IID_DactiveEventEvents);
// TODO: 在此初始化控件的实例数据。
}
// CactiveEventCtrl::~CactiveEventCtrl - 析构函数
CactiveEventCtrl::~CactiveEventCtrl()
{
// TODO: 在此清理控件的实例数据。
}
// CactiveEventCtrl::OnDraw - 绘图函数
void CactiveEventCtrl::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);
}
// CactiveEventCtrl::DoPropExchange - 持久性支持
void CactiveEventCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: 为每个持久的自定义属性调用 PX_ 函数。
}
// CactiveEventCtrl::OnResetState - 将控件重置为默认状态
void CactiveEventCtrl::OnResetState()
{
COleControl::OnResetState(); // 重置 DoPropExchange 中找到的默认值
// TODO: 在此重置任意其他控件状态。
}
// CactiveEventCtrl 消息处理程序
static UINT ThreadFunc(LPVOID lparam)
{
CactiveEventCtrl* cP=(CactiveEventCtrl*)lparam;
cP->OK();//此处崩溃。
return 0;
}
void CactiveEventCtrl::Test(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HANDLE hThread = AfxBeginThread(
ThreadFunc
,this
, THREAD_PRIORITY_NORMAL
,0
,0
,NULL
);
//OK();
}
#pragma once
// activeEventCtrl.h : CactiveEventCtrl ActiveX 控件类的声明。
// CactiveEventCtrl : 有关实现的信息,请参阅 activeEventCtrl.cpp。
class CactiveEventCtrl : public COleControl
{
DECLARE_DYNCREATE(CactiveEventCtrl)
// 构造函数
public:
CactiveEventCtrl();
// 重写
public:
virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
virtual void DoPropExchange(CPropExchange* pPX);
virtual void OnResetState();
// 实现
protected:
~CactiveEventCtrl();
DECLARE_OLECREATE_EX(CactiveEventCtrl) // 类工厂和 guid
DECLARE_OLETYPELIB(CactiveEventCtrl) // GetTypeInfo
DECLARE_PROPPAGEIDS(CactiveEventCtrl) // 属性页 ID
DECLARE_OLECTLTYPE(CactiveEventCtrl) // 类型名称和杂项状态
// 消息映射
DECLARE_MESSAGE_MAP()
// 调度映射
DECLARE_DISPATCH_MAP()
// 事件映射
DECLARE_EVENT_MAP()
// 调度和事件 ID
public:
enum {
dispidTest = 1L,
eventidOK = 1L
};
void OK(void)
{
FireEvent(eventidOK, EVENT_PARAM(VTS_NONE));
}
protected:
void Test(void);
};
<HTML>
<HEAD>
<TITLE>MyActiveX - Methods and Events</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function PassParameter()
{
MyActiveX.Test();
}
</SCRIPT>
</HEAD>
<BODY>
<center>
MyActiveX - Methods and Events Example
<p></p>
<OBJECT ID="MyActiveX" CLASSID="CLSID:0BD0B363-B45E-414F-851E-B5A9706AFF7D"></OBJECT>
<p></p>
<INPUT TYPE="button" NAME="Submit" VALUE="Submit" ONCLICK=PassParameter()>
<SCRIPT FOR=MyActiveX EVENT=OK()>
<!-- {
alert("事件被触发 ")
-->
</SCRIPT>
</center>
</BODY>