mfc activex ocx的事件问题需求:当在宿主程序里双击 ocx的时候,弹出一个messagebox,提示:双击;单击的时候,提示:单击。 需求说清楚了,就这2个需求。
于是我用类向导添加了2个事件,一个是dbclick,一个是click.以下是CtestCtrl里的消息宏,CtestCtrl是COleControl的派生类.// 消息映射BEGIN_MESSAGE_MAP(CtestCtrl, COleControl)
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()// 事件映射BEGIN_EVENT_MAP(CtestCtrl, COleControl)
EVENT_STOCK_DBLCLICK() //这两个是与mfc不同, activex里特有的
EVENT_STOCK_CLICK()
END_EVENT_MAP()
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
// CtestCtrl 消息处理程序//双击
void CtestCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
::MessageBox(NULL,_T("双击"),NULL,NULL);
COleControl::OnLButtonDblClk(nFlags, point);
}
//单击void CtestCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
::MessageBox(NULL,_T("单击"),NULL,NULL);
COleControl::OnLButtonDown(nFlags, point);
}idl部分内容为: [ uuid(66E1FC80-09D3-4EC2-A074-DE36B6735087),
helpstring("test Control 的事件接口") ]
dispinterface _DtestEvents
{
properties:
// 事件接口没有任何属性 methods:
[id(DISPID_DBLCLICK)] void DblClick(void);
[id(DISPID_CLICK)] void Click(void);
};遇到的,需要解决的问题:
当点击ocx这个控件后,发现点击 对话框的那个"X", 竟然也会执行
void CtestCtrl::OnLButtonDown(UINT nFlags, CPoint point)里的代码。这是怎么回事,由于测试比较简单,看帖子的网友们也可以验证一下,是不是如此.
于是我用类向导添加了2个事件,一个是dbclick,一个是click.以下是CtestCtrl里的消息宏,CtestCtrl是COleControl的派生类.// 消息映射BEGIN_MESSAGE_MAP(CtestCtrl, COleControl)
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()// 事件映射BEGIN_EVENT_MAP(CtestCtrl, COleControl)
EVENT_STOCK_DBLCLICK() //这两个是与mfc不同, activex里特有的
EVENT_STOCK_CLICK()
END_EVENT_MAP()
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
// CtestCtrl 消息处理程序//双击
void CtestCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
::MessageBox(NULL,_T("双击"),NULL,NULL);
COleControl::OnLButtonDblClk(nFlags, point);
}
//单击void CtestCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
::MessageBox(NULL,_T("单击"),NULL,NULL);
COleControl::OnLButtonDown(nFlags, point);
}idl部分内容为: [ uuid(66E1FC80-09D3-4EC2-A074-DE36B6735087),
helpstring("test Control 的事件接口") ]
dispinterface _DtestEvents
{
properties:
// 事件接口没有任何属性 methods:
[id(DISPID_DBLCLICK)] void DblClick(void);
[id(DISPID_CLICK)] void Click(void);
};遇到的,需要解决的问题:
当点击ocx这个控件后,发现点击 对话框的那个"X", 竟然也会执行
void CtestCtrl::OnLButtonDown(UINT nFlags, CPoint point)里的代码。这是怎么回事,由于测试比较简单,看帖子的网友们也可以验证一下,是不是如此.
改用这个呢?
只是处理ocx自身的左键按下,没看到你处理event的代码啊.
那能否提供一个 处理event的代码吗?多谢啊还有如何提供?
似乎对属性右键后, 只有:wm_lbuttondown, wm_ldbclick这2个消息啊,所以只能够写这2个消息相应函数的代码。不能对事件写代码。
成功了,没想到会在这里添加代码。晕倒你响应的是windows的鼠标左键按下消息,而不是OCX的Click的事件。所以就。 如何理解? 我觉得ocx作为一个特殊窗口, 但是主贴里的相应代码是在ocx里,响应的对象是ocx,结果 宿主也相应了。 不可思议啊。
老师你说反了ocx是作为一个控件给用户使用,自然 ocx是宿主的子窗口了。当点击ocx这个控件后,发现点击 宿主的对话框的那个"X", 竟然也会执行,原因一时半会理解不了, 多谢你多次回帖
ps:
我是学过atl 开发com,简单的一点知识还是有的。