2010-05-16 7 views
2

La zone graphique de la capture d'écran est un contrôle HwndHost qui héberge une fenêtre Win32 native (avec son propre WNDCLASS enregistré) implémentée en C++/CLI et dessinée avec Direct2D. Le HwndHost est hébergé dans un contrôle WPF Border. Le problème que j'ai est que je ne peux pas mettre le focus du clavier sur la fenêtre Win32 hébergée. Je veux que l'accent se déplace vers la fenêtre Win32 hébergée lorsque les clics utilisés sur la zone graphique. J'ai essayé d'appeler SetFocus sur WM_LBUTTONDOWN, mais cela se concentre sur le reste de l'application.WPF HwndHost mise au point clavier

Actuellement, même si je clique sur la fenêtre Win32, le focus reste sur l'arborescence à gauche, et si j'appuie sur les touches fléchées haut/bas, l'arborescence les aura, pas la fenêtre graphique .

Comment faire pour que la fenêtre Win32 hébergée reçoive une entrée au clavier lorsque l'utilisateur clique sur la zone de graphique, jusqu'à ce qu'elle clique sur un autre contrôle (comme l'arborescence ou la barre d'outils)?

alt text http://dl.dropbox.com/u/190212/public/wpf_hwndhost.png

EDIT: Voici le code C++/CLI pour l'hôte de la fenêtre:

template <typename T> 
inline T intPtrToPtr(IntPtr value) 
{ 
    return reinterpret_cast<T>(static_cast<void*>(value)); 
} 

public ref class ChartWindowHost : public HwndHost, IKeyboardInputSink 
{ 
private: 
    ChartWindow* chartWindow; // this is a C++ class doing the actual work 

protected: 
    virtual HandleRef BuildWindowCore(HandleRef parent) override 
    { 
     chartWindow = new ChartWindow; 
     const HINSTANCE hInstance = intPtrToPtr<HINSTANCE>(Marshal::GetHINSTANCE(Assembly::GetExecutingAssembly()->GetModules()[0])); 
     const HWND parentWindow = intPtrToPtr<HWND>(parent.Handle); 
     chartWindow->Create(hInstance, parentWindow); 
     return HandleRef(this, IntPtr(chartWindow->GetHandle())); 
    } 

    virtual void DestroyWindowCore(HandleRef /*window*/) override 
    { 
     chartWindow->Destroy(); 
     delete chartWindow; 
     chartWindow = NULL; 
    } 
}; 

Répondre

0

Eh bien, quelque chose msdn dit d'avoir à passer outre WndProc() sur la sous-classe HwndHost ...

Questions connexes