Compartir a través de


Cómo: Realizar pruebas de posicionamiento mediante un contenedor host Win32

Actualización: noviembre 2007

Puede crear objetos visuales dentro de una ventana de Win32 proporcionando un contenedor de ventana host para ellos. Para proporcionar el control de eventos para los objetos visuales contenidos, se procesan los mensajes que se pasan al bucle de filtro de mensajes del contenedor de ventana host. Vea Tutorial: Hospedar objetos visuales en una aplicación Win32 para obtener más información sobre cómo hospedar objetos visuales en una ventana de Win32.

Ejemplo

En el código siguiente se muestra cómo configurar controladores de eventos de mouse para una ventana de Win32 que se utiliza como contenedor host para objetos visuales.

// 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;
}

En el ejemplo siguiente se muestra cómo establecer a una prueba de posicionamiento en respuesta a la interceptación de eventos de mouse concretos.

// 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();
    }
}

El objeto HwndSource presenta el contenido de Windows Presentation Foundation (WPF) dentro de una ventana de Win32. El valor de la propiedad RootVisual del objeto HwndSource representa el nodo de nivel superior en la jerarquía del árbol visual.

Para obtener el ejemplo completo sobre cómo realizar pruebas de posicionamiento de objetos mediante un contenedor host de Win32, vea Ejemplo Hit Test with Win32 Interoperation.

Vea también

Conceptos

Realizar pruebas de posicionamiento en la capa visual

Tutorial: Hospedar objetos visuales en una aplicación Win32

Referencia

HwndSource