在我的示例项目(c ++ vs10)中,我在对话框中放置了一个ActiveX控件(用作PropertyPage)。 Dialog连接到名为CTestPage的CPropertyPage派生类。如果我打开一个带有DoModal的PropertySheet,其中添加了CTestPage,则会出现ActiveX控件,但我无法通过键盘处理它。如果我单击ActiveX控件(例如Calendar Control 8.0),控件将收到单击并正常工作。但控件不会处理键盘敲击。我在我的开发者机器上测试了十个不同的ActiveX控件 - >总是一样的行为。 如果我将ActiveX控件放在普通的Dialog中,一切正常。
任何提示我做错了什么?
非常感谢 heribert
PS。是的,在InitInstance中调用AfxEnableControlContainer。
答案 0 :(得分:0)
一个PropertyPage向每个要检出的控件发送WM_GETDLGCODE,控件可以处理哪个键盘输入。 我已经测试了所有的ActiveX控件,结果为0,作为请求的答案!很酷,所以没有人会收到任何键盘输入。 我将使用的ActiveX控件是由c#编写的。需要ActiveX层来为c ++提供复杂的c#控件。 但是底层的复杂c#控件也会在WM_GETDLGCODE消息上返回0。 所以我将c#控件子类化为以下代码,现在它工作正常!!
internal class SubclassedComplexControl : ComplexControl
{
[SecurityPermission(SecurityAction.LinkDemand,
Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_GETDLGCODE = 0x0087;
const int DLGC_WANTARROWS = 0x0001;
const int DLGC_WANTALLKEYS = 0x0004;
const int DLGC_WANTCHARS = 0x0080;
const int VK_ESCAPE = 0x1B;
const int VK_RETURN = 0x0D;
if (m.Msg == WM_GETDLGCODE)
{
if (m.WParam.ToInt32() == VK_RETURN || m.WParam.ToInt32() == VK_ESCAPE)
m.Result = (IntPtr) DLGC_WANTALLKEYS;
else
m.Result = (IntPtr)(DLGC_WANTARROWS | DLGC_WANTCHARS);
return;
}
base.WndProc(ref m);
}
}