Compartilhar via


Como: Hit Test Using a Win32 Host Container

Você pode criar objetos visuais em uma janela Win32 fornecendo uma janela hospedeira contêiner para os objetos visuais. Para fornecer tratamento de eventos para os objetos visuais contidos você processa as mensagens passadas para o laço filtro de mensagens da janela contêiner hospedeira. Consulte Tutorial: Hospedagem Visual objetos em um aplicativo Win32 para obter mais informações sobre como hospedar objetos visuais em uma janela Win32.

Exemplo

O código a seguir mostra como configurar manipuladores de eventos do mouse para uma janela Win32 que é usada como um contêiner hospedeiro para objetos visuais.

// Constant values from the "winuser.h" header file.
internal const int WM_LBUTTONUP = 0x0202,
                   WM_RBUTTONUP = 0x0205;

internal static IntPtr ApplicationMessageFilter(
    IntPtr hwnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    // Handle messages passed to the visual.
    switch (message)
    {
        // Handle the left and right mouse button up messages.
        case WM_LBUTTONUP:
        case WM_RBUTTONUP:
            System.Windows.Point pt = new System.Windows.Point();
            pt.X = (uint)lParam & (uint)0x0000ffff;  // LOWORD = x
            pt.Y = (uint)lParam >> 16;               // HIWORD = y
            MyShape.OnHitTest(pt, message);
            break;
    }

    return IntPtr.Zero;
}

O exemplo a seguir mostra como definir um teste de acerto em resposta a captura de eventos específicos de mouse.

// Constant values from the "winuser.h" header file.
public const int WM_LBUTTONUP = 0x0202,
                 WM_RBUTTONUP = 0x0205;

// Respond to WM_LBUTTONUP or WM_RBUTTONUP messages by determining which visual object was clicked.
public static void OnHitTest(System.Windows.Point pt, int msg)
{
    // Clear the contents of the list used for hit test results.
    hitResultsList.Clear();

    // Determine whether to change the color of the circle or to delete the shape.
    if (msg == WM_LBUTTONUP)
    {
        MyWindow.changeColor = true;
    }
    if (msg == WM_RBUTTONUP)
    {
        MyWindow.changeColor = false;
    }

    // Set up a callback to receive the hit test results enumeration.
    VisualTreeHelper.HitTest(MyWindow.myHwndSource.RootVisual,
                             null,
                             new HitTestResultCallback(CircleHitTestResult),
                             new PointHitTestParameters(pt));

    // Perform actions on the hit test results list.
    if (hitResultsList.Count > 0)
    {
        ProcessHitTestResultsList();
    }
}

The HwndSource objeto apresenta Windows Presentation Foundation (WPF) conteúdo dentro de um Win32 janela. O valor da RootVisual propriedade das HwndSource objeto representa o nó mais alto na árvore Visual hierarquia.

Para o exemplo completo sobre teste de clique em objetos usando um contêiner host Win32, consulte Teste com o exemplo de interoperação de Win32 de visitas.

Consulte também

Conceitos

Hit Testing in the Visual Layer

Tutorial: Hospedagem Visual objetos em um aplicativo Win32

Referência

HwndSource