如何修改编辑框CEdit的右键菜单,并响应相应的事件函数 本帖最后由 xyzhaopeng 于 2010-06-02 13:51:58 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对了,如果是在对话框中用这个控件的话,右键菜单不是灰色的;而在CFormView中用这个控件的话,右键菜单是灰色的,不知道为什么? 灰色就不清楚了,至于响应的问题就在 pWndPopupOwner 的类中添加响应函数就可以了,也可以用 TPM_RETURNCMD 来根据 TrackPopupMenu 的返回值作处理。 这样在使用CMyEdit类的时候,右键单CMyEdit的时候会弹出我自己定义的右键菜单,可是都是灰色的,不知道怎么办?还有个大问题,这个右键菜单的事件函数应该在哪里写呢?--------------------------------------------------------------------------用VS2008试了一下,不是灰色的,右键菜单的响应事件直接在你的父窗口类中添加即可 是的,我都没有加消息响应函数,但是在对话框中用这个控件的话,右键出来的快捷菜单不是灰色的;而在CFormView中右键出来的快捷菜单则是灰色的,很奇怪。其实灰色不灰色主要是兴趣问题,对程序影响不大,就是个人感觉比较奇怪。主要是消息响应,我也知道在父类窗口中添加。可是问题是,比如我要实现“复制”功能,我在父类窗口中要知道是在哪个控件上点击了右键;比如我要实现“粘贴”功能,我要知道在哪个控件上点击了右键;因为在父类窗口中我使用了不止一个这样的控件。这个才是我主要的问题。 首先,窗口框架和对话框框架对菜单的支持是不一样的,具体差别在于是否响应WM_INITMENUPOPUP消息然后,你既然是重载Edit那就应该把菜单消息连到你的CMyEdit里 主要是消息响应,我也知道在父类窗口中添加。可是问题是,比如我要实现“复制”功能,我在父类窗口中要知道是在哪个控件上点击了右键;比如我要实现“粘贴”功能,我要知道在哪个控件上点击了右键;因为在父类窗口中我使用了不止一个这样的控件。这个才是我主要的问题。==================你是从CEdit类中继承一个类的,消息响应还是应该加在自己的类中才更加合理。 问题已经解决了,谢谢大家的回复。我在我的派生类中://自定义右键菜单void CMyEdit::OnContextMenu(CWnd* pWnd, CPoint point){ if (point.x == -1 && point.y == -1) { //keystroke invocation CRect rect; GetClientRect(rect); ClientToScreen(rect); point = rect.TopLeft(); point.Offset(5, 5); } CMenu menu; VERIFY(menu.LoadMenu(IDR_VOL_VALUE)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); CTestView *pView = (CTestView*)(GetParent()); pView->m_pCurEdit = this; pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pView);}在它的父窗口(CTestView)中定义了一个CMyEdit的指针CEditBox *m_pCurEdit;用来保存当然右键点击的是哪个控件,在控件的OnContextMenu()函数中把this指针付给其父控件的m_pCurEdit变量,这样其父窗口就得到了点击的控件。右键响应函数放在它的父窗口中,响应函数类似如下://电压等幅值void CTestView::OnVolEqual() { // TODO: Add your command handler code here if(m_pCurEdit == &m_valueUa) { AfxMessageBox("Ua"); } if(m_pCurEdit == &m_valueUb) { AfxMessageBox("Ub"); } if(m_pCurEdit == &m_valueUc) { AfxMessageBox("Uc"); } m_pCurEdit = NULL;} 在它的父窗口(CTestView)中定义了一个CMyEdit的指针CEditBox *m_pCurEdit;用来保存当然右键点击的是哪个控件,在控件的OnContextMenu()函数中把this指针付给其父控件的m_pCurEdit变量,这样其父窗口就得到了点击的控件。CMyEdit的指针,在控件的OnContextMenu()函数中把this指针付给其父控件的m_pCurEdit变量这个是怎么赋值呢? 定义了一个CMyEdit派生类之后,要怎么使用它才能让EDIT有修改过的右键菜单,初学者,多多帮助 多核CPU会自动分配一个函数里的指令吗? 这一段基本的GDI对象如何释放? lib的加载问题 请教高手对话框显示图像问题 多线程执行正确的部分,现在搬到DLL库里去就不灵了 怎样让对话框运用程序,最小化的时候,不去最小化,而是隐藏窗体? 一个奇怪的现象,望大侠们指点一二 关于COM+的分布式部署问题 紧急求助关于,PB调用vb写的Dll 有高手吗,能否回答关于EDIT控件赋值的问题? 用nsis打包的话 如何改变内置页面中文字的行距啊 wchar_t 转 char* 的问题
还有个大问题,这个右键菜单的事件函数应该在哪里写呢?
--------------------------------------------------------------------------
用VS2008试了一下,不是灰色的,右键菜单的响应事件直接在你的父窗口类中添加即可
其实灰色不灰色主要是兴趣问题,对程序影响不大,就是个人感觉比较奇怪。主要是消息响应,我也知道在父类窗口中添加。可是问题是,比如我要实现“复制”功能,我在父类窗口中要知道是在哪个控件上点击了右键;比如我要实现“粘贴”功能,我要知道在哪个控件上点击了右键;因为在父类窗口中我使用了不止一个这样的控件。这个才是我主要的问题。
然后,你既然是重载Edit那就应该把菜单消息连到你的CMyEdit里
==================
你是从CEdit类中继承一个类的,消息响应还是应该加在自己的类中才更加合理。
我在我的派生类中://自定义右键菜单
void CMyEdit::OnContextMenu(CWnd* pWnd, CPoint point)
{
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(IDR_VOL_VALUE));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CTestView *pView = (CTestView*)(GetParent());
pView->m_pCurEdit = this;
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pView);
}
在它的父窗口(CTestView)中定义了一个CMyEdit的指针CEditBox *m_pCurEdit;用来保存当然右键点击的是哪个控件,在控件的OnContextMenu()函数中把this指针付给其父控件的m_pCurEdit变量,这样其父窗口就得到了点击的控件。右键响应函数放在它的父窗口中,响应函数类似如下://电压等幅值
void CTestView::OnVolEqual()
{
// TODO: Add your command handler code here
if(m_pCurEdit == &m_valueUa)
{
AfxMessageBox("Ua");
}
if(m_pCurEdit == &m_valueUb)
{
AfxMessageBox("Ub");
}
if(m_pCurEdit == &m_valueUc)
{
AfxMessageBox("Uc");
} m_pCurEdit = NULL;
}
CMyEdit的指针,在控件的OnContextMenu()函数中把this指针付给其父控件的m_pCurEdit变量这个是怎么赋值呢?