0

在我的示例项目(c++ vs10)中,我在对话框中放置了一个 ActiveX 控件(用作 PropertyPage)。Dialog 连接到名为 CTestPage 的 CPropertyPage 派生类。如果我用 DoModal 打开一个 PropertySheet,其中添加了 CTestPage,ActiveX 控件会出现,但我无法通过键盘处理它。如果我单击 ActiveX 控件(例如日历控件 8.0),该控件会收到单击并正常工作。但是控件不处理键盘敲击。我在我的开发人员机器上测试了十个不同的 ActiveX 控件 -> 总是相同的行为。如果我将 ActiveX 控件放在普通对话框中,一切正常。

任何提示我做错了什么?

非常感谢赫里伯特

PS。是的,在 InitInstance 中调用了 AfxEnableControlContainer。

4

1 回答 1

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);
     }
 }
于 2013-11-15T09:16:58.927 回答