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)里的代码。这是怎么回事,由于测试比较简单,看帖子的网友们也可以验证一下,是不是如此.

解决方案 »

  1.   

    void FireClick( )
    改用这个呢?
      

  2.   

    Fired when the control captures the mouse, any BUTTONUP (left, middle, or right) message is received, and the button is released over the control. The stock MouseDown and MouseUp events occur before this event.
      

  3.   

    你响应的是windows的鼠标左键按下消息,而不是OCX的Click的事件。所以就。
      

  4.   

    没看到你用ocx中的“事件”
      

  5.   

    你的void CtestCtrl::OnLButtonDown(UINT nFlags, CPoint point)
    只是处理ocx自身的左键按下,没看到你处理event的代码啊.
      

  6.   


    那能否提供一个 处理event的代码吗?多谢啊还有如何提供?
    似乎对属性右键后,  只有:wm_lbuttondown, wm_ldbclick这2个消息啊,所以只能够写这2个消息相应函数的代码。不能对事件写代码。
      

  7.   

    另建一个项目。测试你的OCX,属性->事件->控件->你的ocx。事件的响应在测试项目中写。
      

  8.   

    你ocx工程 view clssWizard,里找事件,添加ActiveX Events
      

  9.   


    成功了,没想到会在这里添加代码。晕倒你响应的是windows的鼠标左键按下消息,而不是OCX的Click的事件。所以就。 如何理解? 我觉得ocx作为一个特殊窗口, 但是主贴里的相应代码是在ocx里,响应的对象是ocx,结果 宿主也相应了。  不可思议啊。
      

  10.   

    你再看看CtestCtrl类和你的对话框是什么关系?对话框也是oCX中的吧,active控件是做出来给别人用的。提供方法,事件等。
      

  11.   


    老师你说反了ocx是作为一个控件给用户使用,自然 ocx是宿主的子窗口了。当点击ocx这个控件后,发现点击 宿主的对话框的那个"X", 竟然也会执行,原因一时半会理解不了, 多谢你多次回帖
    ps:
    我是学过atl  开发com,简单的一点知识还是有的。
      

  12.   

    ocx中也可以有对话框,另外ocx不一定有窗口。我是说让你看看你的CtestCtrl和你所谓的“对话框的那个"X"”这句话中那个对话框是什么关系。我说的对话框也是ocx中的吧,是一种猜测。别人只能给你建议和提示,具体怎么解决,需要自己去搞。