我们有一个C ++应用程序,它在MFC对话框中托管一个flex应用程序。一切正常,所有按钮按等都直接传递到flex而没有任何问题,除了enter和escape键,它会立即关闭对话框。
我们可以通过实施PreTranslateMessage()
或OnOK()
来捕获回车键
并阻止窗口关闭行为,但我们仍然存在将这些输入键推送到托管的Flex应用程序的问题。
表单上没有“默认”按钮或类似的东西,也许MFC将回车键链接到幕后标题栏中的关闭按钮或其他东西。
有没有人有任何想法如何阻止MFC将输入键视为特殊情况。
非常感谢任何提示。
编辑:这是mmonem请求的PreTranslateMessage()
。
BOOL CFlexDialog::PreTranslateMessage(MSG* pMsg)
{
if ((pMsg->message == WM_KEYDOWN))
{
if (pMsg->wParam == VK_RETURN)
{
m_ctrlFlex->OnReturnKeyPressed();
return TRUE;
}
}
return __super::PreTranslateMessage(pMsg);
}
但它不是一个合适的解决方案,在flex应用程序中调用这样的方法,因为它使Flex开发人员的生活变得非常困难,这意味着他必须编写一个特殊版本来实现每个控件的返回键行为。 / p>
我们只是希望MFC像对待其他键一样处理返回和转义键。
答案 0 :(得分:2)
删除OnOK()
和OnCancel()
;在考虑VK_ESCAPE后,PreTransateMessage
已足够。
为什么不使用:
m_ctrlFlex->SendMessage(WM_KEYDOWN, VK_RETURN, 0)
而不是
m_ctrlFlex->OnReturnKeyPressed();
在您PreTranslateMessage
的实施中?
答案 1 :(得分:1)
即使MFC命令按钮没有焦点,它们也可以响应事件。
您是否尝试过捕获OnClicked事件和OnOk以不返回任何内容?
示例:陷阱OnClick ...
void CMyDialog::OnClickedMyOK() { CDialog::OnOK(); }
然后在OnOk()中执行no-op
void CMyDialog::OnOK() { }
这应该停止处理回车键。
答案 2 :(得分:0)
另一种方法是“Windows子类化”。也就是说,将消息从一个Window Procedure(即WindProc())发送到另一个WndProc()。这可能提供一种没有直接干预的方法。 (这不是C ++子类化。)
这是MFC Subclassing编辑方式:提供更好的链接。
如果需要更多信息,请搜索“Windows / MFC子类”。
flex控件/窗口有一个WndProc,你的窗口肯定有一个WndProc,Windows Subclassing应该可以工作。
新编辑:这可能是用于子类化ActiveX控件的更好链接。
ActiveX Controls: Subclassing a Windows Control
Subclassing Windows Forms Controls - 更多.Net-centric。
注意:在MFC中,您应该看到这些功能。
CDialog继承自CWnd,因此您将这两个函数视为“对话框”函数。它们是实现这项工作的关键。如果Flash窗口是真实窗口,请使用SubclassWindow。如果它是一个控件使用SubclassDlgItem。
最后,如果没有别的办法。一个产品/库,希望能让它变得简单。 EasyHook看起来像是这里的产品。在CodeProject EasyHook,您可以获得所有源代码。
答案 3 :(得分:0)
如果您在处理标签和问题时遇到问题输入密钥我建议您使用窗口而不是对话框。该对话框添加了模态(如果您使用模态),Tabbing&默认按钮处理。如果您不需要/想要这些功能,或者它们妨碍您使用,那么请不要使用对话框。
如果我理解你在做什么,那么你想要flex来处理tabbing,输入key和各种其他消息。获取对话框代码。如果您仍然需要模态样式,那么您可能必须处理父窗口的启用/禁用 - 这就是打开模式对话框时窗口所做的全部内容。