我的edit控件是在对话框上直接加上的.在控件里面选择文本后,点击右键可以看到弹出菜单中有copy,cut,paste,undo等项,但是为什么我不能用热键比如Ctrl+C, Ctrl+X, Ctrl+V等对选中文本进行操作呢?
还需要重载PreTranslateMessage()函数做这些系统基本的热键做处理吗?或者是有什么设置我没搞好啊?
还需要重载PreTranslateMessage()函数做这些系统基本的热键做处理吗?或者是有什么设置我没搞好啊?
解决方案 »
- VC中 如何清除编辑框内的画图呢
- 求助,调用读文件函数,提示类型不匹配!!!
- 关于列举字段名称的问题
- 新建一个基于对话框项目,支持SOCKET,编译时error C2065: 'WSAPROTOCLO_INFOW' : undeclared identifier
- 分割Dialog!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 关于类厂,大家是怎么样看的?
- 怎样用BitBlt把指定位图画到桌面上?
- 救我,工作快没了!!!!
- 怎么才能看到kdprint出来的信息啊?????!!!!!!!!!!!!!!!
- MFC带滚动条的窗口上如何正确的移动位置.
- 怎样可以给线程传递参数??
- [求助]设置CStatic的背景色为透明后,为什么更改文字时会有重叠呢?
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!");
但是我的edit控件是画在CFormView类加载的对话框资源上,就不能用Ctrl+C, Ctrl+X, Ctrl+V等热键操作了,
可能是因为CFormView的原因吧。对于这些系统标准的热键,似乎没有必要自己重载PreTranslateMessage吧,应该有别的办法吧,哪位知道?
我自己把它解决了,我看了看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);
}
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
}
我的问题是CFormView对其上的CEdit控件中的选中文本的Ctrl+X等消息不做相应。
你这样只是搞了一个这样的函数OnEditCut() ,我估计你是在某个控件被选中,有focus时这个消息响应函数被调用的。这样的话,只要是有focus的控件,你就给它发了一个WM_CUT消息。呵呵,如果是一个没有选中文本的控件,也就无所谓了。如果是选中文本的控件,人家没剪切,你就发了剪切文本的消息,这样怎么行?