描述:
我用MFC做了一个ActiveX控件,继承自Static,我添加了一个右键菜单,可是嵌入网
页测试却发现菜单怎么也弹不出来,于是我就用spy++查看控件窗口,发现我的控件被
一个类名叫AfxOleControl42的容器包含着,所有的消息(比如我单击鼠标右键)都被这
个可恶的家伙截获到了,我的ActiveX控件根本就没有收到WM_RBUTTONDOWN或者别的任
何消息,怎么解决这个问题???????
解决方案1:
msdn说过这个问题,给你看看我的代码吧!
BOOL CDesignerCtrl::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
case WM_KEYUP:
case WM_CHAR:
_draw_wnd.SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
}
return COleControl::PreTranslateMessage(pMsg);
}
int CDesignerCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
if (!m_bUIActive)
OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
}
void CDesignerCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if (m_hWnd == NULL)
{
OnOpen(TRUE, NULL);
LockInPlaceActive(TRUE);
//OnActivateInPlace(TRUE, NULL);
}
else
{
//OnActivateInPlace(TRUE, NULL);
::ShowWindow(::GetParent(m_hWnd), SW_SHOW);
ShowWindow(SW_SHOW);
}
// TODO: 用您自己的绘图代码替换下面的代码。
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
/*
CString text = _T("Workflow Designer Control");
RECT r = rcBounds;
pdc->DrawText(text, &r, DT_CENTER | DT_END_ELLIPSIS | DT_VCENTER | DT_SINGLELINE);
*/
}
gz
解决方案3:在OnCreate()中添加COleControl::OnActiveInplace(TRUE, NULL);
解决方案4: PreTranslateMessage
是 MFC 或 WTL的框架中的
在ATL中的确没这个东西,
PreTranslateMessage 是在 TranlateMsg 和 dispathmsg前多处理的一层
而是需要外面的容器, 在PreTranslateMessage时候, 路由给你的控件
如果外面没有路由,当然没有
1。 感觉上不应该收不到这些消息
2。 如果是上层真的截获了,没路由过来, 那就hook啊,也是常用的处理方式
因为网页是个没有window的容器,你要用window什么东西,你可以动态创建一个。可否告诉我你要实现什么样的效果,我可帮你想想办法
解决方案7: 改成:
DWORD CStaticTestCtrl::GetControlFlags()
{
DWORD dwFlags = COleControl::GetControlFlags();
// The control can activate without creating a window.
// TODO: when writing the control's message handlers, avoid using
// the m_hWnd member variable without first checking that its
// value is non-NULL.
dwFlags |= windowlessActivate; //添加这句
return dwFlags;
}