OnContextMenu的问题,我只能给这么多分了,高手快来取分吧!!!kkk

waiwaiwai 2001-07-13 02:21:47
我在视类中重载了OnContextMenu()用以截获鼠标右键的点击事件,可是当消息产生的时候,我的事件hanlder确响应不了这一消息,为什么?我的代码时这样的:
void CMy1View::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu* pSubMenu=::GetSubCMenu(ID_EDIT_UNDO,this);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
{
AfxMessageBox("this view window has WS_CHILD attribute");
pWndPopupOwner = pWndPopupOwner->GetParent();
}

if (pSubMenu) {
ClientToScreen(&point);
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this);
}

}
其中,GetSubCMenu为一自定义 的全局函数,ID_EDIT_UNDO为菜单id,函数原型为:
CMenu* GetSubCMenu(int nStartId, CView* pThis)
...全文
296 点赞 收藏 24
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
waiwaiwai 2001-07-13
另外,关于设定标志位,我一般是设定一个枚举类型,然后在我的程序中进行判断,不过,看微软的例子或者其他的一些代码,发现有设定DWORD类型变量然后进行判断的手段,这样做一定具有更快的执行效率,而且代码专业,我很想学,有哪位高手可以举个例子吗?
回复
waiwaiwai 2001-07-13
代码已经发给你nustchen(壁虎)啦,贴子先不加分,我明天再加
回复
nustchen 2001-07-13
说不定我有更好的解决方法。
回复
nustchen 2001-07-13
给我看看,nustchen@21cn.com
回复
waiwaiwai 2001-07-13
kao
回复
waiwaiwai 2001-07-13
加分喽,呵呵
回复
waiwaiwai 2001-07-13
谢谢,哎,网络太慢,老加不上分哟
回复
james_razor 2001-07-13
代码我看过了,用swxh的方法,很不错(又学了一招,要不要放分啊swxh),不过我觉得这是控件的问题,不是MFC的问题。
鼠标原始就是插入符形状的对不对,在CONTENT MENU弹出的时候,Windows不会替你修改鼠标的,你还是自己改吧,上面我说过了,弹出菜单时加个标记位,在WM_SETCURSOR消息中设定鼠标,返回时恢复就行了。
回复
james_razor 2001-07-13
ok,看看去
回复
waiwaiwai 2001-07-13
给分
回复
waiwaiwai 2001-07-13
james_razor(蹬三轮的),代码已经发给你了
回复
james_razor 2001-07-13
很奇怪,能把原码给我看看吗?james_razor@21cn.com。
光标的形状你可以在WM_SETCURSOR中修改,不要告诉我你又收不到这条消息了,呵呵。
回复
waiwaiwai 2001-07-13
不过微软提供的WORDPAD中的例子同样是以CRichEditView作为基类,它的上下文菜单鼠标的弹出样式就是一般的箭头图标,哎,看来今天晚上又要不合眼研究代码啦!不过,还是要谢谢swxh(中重),我的分数全部给你。
回复
不解 2001-07-13
这与MFC对CRichEditView的封装有关,在MFC中EDIT这一类都有自己默认的OnContextMenu()处理,如拷贝,复制等windows操作。
可是鼠标指针仍然不是我想要的箭头样式,是不是与你的自定义鼠标指针有关,在我的机器上是默认的箭头样式。
回复
waiwaiwai 2001-07-13
谢谢swxh(中重),可是鼠标指针仍然不是我想要的箭头样式,如果只是这样的话,我可以响应OnRButtonDown()来达到相同的结果。不过,有一点不太明白,为什么视类中的oncontextmenu会得不到调用呢?即使重载了OnMouseActivate()也是一样的不管用呢?
回复
不解 2001-07-13
BOOL CMyEditView::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_RBUTTONDOWN)
{
pMsg->message=WM_CONTEXTMENU;
pMsg->hwnd=this->GetSafeHwnd();
}
return CRichEditView::PreTranslateMessage(pMsg);



在OnCointextMenu()函数中如此调用
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this->GetParent());


}
回复
waiwaiwai 2001-07-13
不对不对,消息产生了,可是视图中的OnContextMenu()却仍然得不到调用,这是为什么呀?
回复
不解 2001-07-13
对不起,你可以判断是否是WM_RBUTTONDOWN消息,然后调用你的OnContextMenu()函数。
如:
BOOL CMyEditView::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_RBUTTONDOWN)
{
CPoint pt;//只是测试,你可以取得当前鼠标位置??!!
pt.x=10;
pt.y=10;
this->OnContextMenu(this,pt);
return FALSE;
}
return CRichEditView::PreTranslateMessage(pMsg);
}
回复
waiwaiwai 2001-07-13
我又重载了视类的OnMouseActivate(CWnd *pWnd, UINT nHitTest, UINT message)希望强行向框架发送消息,代码是这样的:
int OnMouseActivate(CWnd *pWnd, UINT nHitTest, UINT message)
{
const MSG *pMsg = ::GetCurrentMessage();
GetParent->SendMessage(WM_MOUSEACTIVATE, pMsg->wParam, pMsg->lParam);
return CRichEditView::OnMouseActivate(pWnd, nHitTest, message);
可是还不行呀,根本就没有消息啊!
回复
waiwaiwai 2001-07-13
up
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-07-13 02:21
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……