cedit的multiline下如果按esc时退出程序 该如何处理? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 让窗口接收按键事件,如果发现ESC按下,退出程序, 如果是这样的话,好像和MultiLine没什么关系吧, 我就是不想退出程序窗口接受的都被 过滤了就是在CEdit控件中接收esc 整个窗口都退出去了 pretranslateMessage()捕获ESC消息后,将这个消息KILL掉,就OK 了! if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { // don't allow dialog to process return or escape keys. ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; }这段代码根本抓不到多行的CEdit的esc消息阿 if (GetFocus()->m_hWnd == GetDlgItem(IDC_EDIT3)->m_hWnd) { if (pMsg->wParam == VK_ESCAPE) { return TRUE; } } if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { // don't allow dialog to process return or escape keys. ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; }我又加了一段代码 判断如果如果焦点在CEdit控件上 经常程序中断... 处理Edit的父窗口的ESC按键事件,这个和Edit没有关系 if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { // don't allow dialog to process return or escape keys. ::TranslateMessage(pMsg); ::DispatchMessage(pMsg); return TRUE; }中间的Translate和dispatch语句要屏蔽掉啊!直接返回TRUE 我刚才弄了个测试程序,这种现象好像与Multiline有关。 重载edit所在的表单的PreTranslateMessage(MSG* pMsg)在里面加上:if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE; 我测试没这个现象,你怎么测试的?我的做法:1.创建一个对话框工程2. 点击Cancel按钮,并把里面的CDialog::OnCancel()删除3. 在对话框上加一个edit,然后选上Multiline 点击Cancel按钮,并把里面的CDialog::OnCancel()删除???在实际应用时不能这么做吧,用户点击取消时就应该退出对话框。 呵呵~刚才留意了一下,对于一个对话框,无论鼠标焦点在对话框什么地方,点击ESC时都会退出对话框,这样的情况以前还没注意过。 MFC在CDialog::PreTranslateMessage中专门对多行的edit做了处理,不知道是何原因,有可能又是兼容问题吧 if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_CANCEL) && (::GetWindowLong(pMsg->hwnd, GWL_STYLE) & ES_MULTILINE) && _AfxCompareClassName(pMsg->hwnd, _T("Edit"))) { HWND hItem = ::GetDlgItem(m_hWnd, IDCANCEL); if (hItem == NULL || ::IsWindowEnabled(hItem)) { SendMessage(WM_COMMAND, IDCANCEL, 0); return TRUE; } }如果想不影响对话框的ESC键退出的作用的话,可以派生CEdit关联到控件,然后在CMyEdit::PreTranslateMessage中处理掉VK_ESCAPE 一个路径算法的小问题 请教如何在程序中将字符串输出到软件界面中去? 字体宽度 线程互斥问题 如何在自动化组件DLL(Automation组件DLL)中使用ActiveX控件? 希望VC高手加入,最好有五年以上VC工作经验 如何向AVI文件中写入附加的“作者”,“版权”等信息? 如何在VC中显示Gif动画? lpPoint中的缩写lp完整的写法是什么? 如果删除消息队列中的消息? 窗口最大化,怎么使客户区的图片也跟着变大 PostMessage的奇怪问题??
我就是不想退出程序
窗口接受的都被 过滤了
就是在CEdit控件中接收esc 整个窗口都退出去了
pMsg->wParam == VK_ESCAPE)
{
// don't allow dialog to process return or escape keys.
::TranslateMessage(pMsg);
::DispatchMessage(pMsg); return TRUE;
}这段代码根本抓不到多行的CEdit的esc消息阿
if (GetFocus()->m_hWnd == GetDlgItem(IDC_EDIT3)->m_hWnd)
{
if (pMsg->wParam == VK_ESCAPE)
{
return TRUE;
}
}
if (pMsg->wParam == VK_RETURN ||
pMsg->wParam == VK_ESCAPE)
{
// don't allow dialog to process return or escape keys.
::TranslateMessage(pMsg);
::DispatchMessage(pMsg); return TRUE;
}
我又加了一段代码 判断如果如果焦点在CEdit控件上 经常程序中断...
if (pMsg->wParam == VK_RETURN ||
pMsg->wParam == VK_ESCAPE)
{
// don't allow dialog to process return or escape keys.
::TranslateMessage(pMsg);
::DispatchMessage(pMsg); return TRUE;
}中间的Translate和dispatch语句要屏蔽掉啊!直接返回TRUE
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE;
我的做法:
1.创建一个对话框工程
2. 点击Cancel按钮,并把里面的CDialog::OnCancel()删除
3. 在对话框上加一个edit,然后选上Multiline
(pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_CANCEL) &&
(::GetWindowLong(pMsg->hwnd, GWL_STYLE) & ES_MULTILINE) &&
_AfxCompareClassName(pMsg->hwnd, _T("Edit")))
{
HWND hItem = ::GetDlgItem(m_hWnd, IDCANCEL);
if (hItem == NULL || ::IsWindowEnabled(hItem))
{
SendMessage(WM_COMMAND, IDCANCEL, 0);
return TRUE;
}
}如果想不影响对话框的ESC键退出的作用的话,可以派生CEdit关联到控件,然后在CMyEdit::PreTranslateMessage中处理掉VK_ESCAPE