2013-11-14 4 views
0

в моем примере проекта (C++ vs10). Я разместил элемент управления ActiveX в диалоговом окне (используется как PropertyPage). Диалог подключен к производному классу CPropertyPage под названием CTestPage. Если я открою PropertySheet с DoModal, где добавлен CTestPage, появится элемент управления ActiveX, но я не могу обработать его с клавиатуры. Если я нажму на элемент управления ActiveX (например, Calendar Control 8.0), элемент управления получит щелчок и отлично работает. Но управление клавиатурой не контролируется. Я тестировал десять различных элементов управления ActiveX на моей машине для разработчиков -> всегда такое же поведение. Если я устанавливаю элемент управления ActiveX в обычном диалоговом окне, все работает нормально.ActiveX в CPropertyPage не может использоваться клавиатурой

Любые подсказки, что я делаю неправильно?

Большое спасибо Heribert

PS. Да, AfxEnableControlContainer вызывается в InitInstance.

+0

Вы пытались использовать Spy ++, чтобы узнать, кто ест сообщения клавиатуры? – rrirower

+0

Спасибо за подсказку! Теперь я нашел проблему. Смотрите мой ответ ... –

ответ

0

A PropertyPage отправляет WM_GETDLGCODE каждому элементу управления, чтобы проверить, какой ввод на клавиатуре можно обработать с помощью элемента управления. Все элементы управления ActiveX я тестировал результаты с 0 в качестве ответа по запросу! Прохладный, поэтому никто не получит ввода клавиатуры. Элемент управления ActiveX, который я буду использовать, написан мной в C#. Уровень ActiveX необходим, чтобы предложить сложный элемент управления C# для C++. Но основной комплекс C# control возвращается с сообщением 0 в сообщении WM_GETDLGCODE. Итак, я подклассифицировал элемент управления 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); 
    } 
} 
Смежные вопросы