55分,求解ocx里的诡异问题
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)里的代码。
这是怎么回事,由于测试比较简单,看帖子的网友们也可以验证一下,是不是如此.
[解决办法]
ocx中也可以有对话框,另外ocx不一定有窗口。我是说让你看看你的CtestCtrl和你所谓的“对话框的那个"X"”这句话中那个对话框是什么关系。我说的对话框也是ocx中的吧,是一种猜测。别人只能给你建议和提示,具体怎么解决,需要自己去搞。