edit控件中被选中的文本不能用Ctrl+C, Ctrl+X, Ctrl+V等热键操作的问题

yuanchao111 2005-05-19 03:07:09
我的edit控件是在对话框上直接加上的.在控件里面选择文本后,点击右键可以看到弹出菜单中有copy,cut,paste,undo等项,但是为什么我不能用热键比如Ctrl+C, Ctrl+X, Ctrl+V等对选中文本进行操作呢?
还需要重载PreTranslateMessage()函数做这些系统基本的热键做处理吗?或者是有什么设置我没搞好啊?

...全文
223 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vcmute 2005-05-20
重载Edit的Cut等,如下
void CSdi_formView::OnEditCut()
{
// TODO: Add your command handler code here
GetFocus()->SendMessage(WM_CUT);
}

void CSdi_formView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable();//此处可根据具体情况Enable
}
回复
yuanchao111 2005-05-20
to vcmute(横秋),这样好像不行吧。
我的问题是CFormView对其上的CEdit控件中的选中文本的Ctrl+X等消息不做相应。
你这样只是搞了一个这样的函数OnEditCut() ,我估计你是在某个控件被选中,有focus时这个消息响应函数被调用的。这样的话,只要是有focus的控件,你就给它发了一个WM_CUT消息。呵呵,如果是一个没有选中文本的控件,也就无所谓了。如果是选中文本的控件,人家没剪切,你就发了剪切文本的消息,这样怎么行?
回复
commandconque 2005-05-20
mark
回复
yuanchao111 2005-05-19
bohut(伯虎)的方法不是不行,但是如果你的formview中的edit控件太多时,一个一个做判断就太麻烦了。
我自己把它解决了,我看了看MFCCFormView中PreTranslateMessage的源代码,发现它先调用Cview的CView::PreTranslateMessag函数,如果不成功,然后再调用GetTopLevelFrame()得到最顶层的frame,调用它的CFrameWnd::PreTranslateMessag函数,如果不成功,最后再调用PreTranslateInput()函数。
照分析,很有可能对于Ctrl+C, Ctrl+X, Ctrl+V这样的热键消息,CView::PreTranslateMessag或者CFrameWnd::PreTranslateMessag返回了TRUE,但是并没有做相应的处理,最后真正做处理的PreTranslateInput()函数便没有被调用到。恐怕这是MFC中CFormView的一个bug吧

我继承于CFormView的类CMyFormView中,我先判断是不是Ctrl+C, Ctrl+X, Ctrl+V这样的热键消息,如果是,就调用的PreTranslateInput()函数处理并返回。如果不是这样的消息,则调用基类的CFormView::PreTranslateMessage(pMsg)函数。

BOOL CMyFormView::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
if(GetKeyState(VK_CONTROL) & 0x80)
if(pMsg->wParam == 'c' || pMsg->wParam == 'C'
||pMsg->wParam == 'v' || pMsg->wParam == 'V'
||pMsg->wParam == 'z' || pMsg->wParam == 'Z'
||pMsg->wParam == 'x' || pMsg->wParam == 'X')
{
return PreTranslateInput(pMsg);
}

return CFormView::PreTranslateMessage(pMsg);
}
回复
yuanchao111 2005-05-19
我刚才又仔细检查了一下,发现如果edit控件是画在CDialog类的对话框资源上的话,什么都不用做,就可以用Ctrl+C, Ctrl+X, Ctrl+V等热键操作了,
但是我的edit控件是画在CFormView类加载的对话框资源上,就不能用Ctrl+C, Ctrl+X, Ctrl+V等热键操作了,
可能是因为CFormView的原因吧。对于这些系统标准的热键,似乎没有必要自己重载PreTranslateMessage吧,应该有别的办法吧,哪位知道?
回复
bohut 2005-05-19
重载PreTranslateMessage()函数,函数里添加如下代码
if(GetFocus() == GetDlgItem(IDC_EDIT2)) //判断焦点在不在edit框内
{
if (pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_ESCAPE:
SetFocus();
return TRUE;
case 'A':
if(::GetKeyState(VK_CONTROL) < 0)
{
AfxMessageBox("Ctrl + A!");
。。。。。。。。。
回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2005-05-19 03:07
社区公告
暂无公告