Usando la tecnología WPF en MFC
Introducción
Este artículo proporciona un ejemplo de cómo integrar la tecnología WPF en una aplicación basada en MFC. El objetivo principal de esta tecnología es mejorar la visualización de gráficos de aplicaciones basadas en Win/MFC. El programa de demostración mostrará un reloj WPF animado en una aplicación de marco de diálogo MFC, con la interfaz que se muestra en la figura
Herramientas de desarrollo y bibliotecas necesarias para este artículo. Para iniciar y ejecutar el programa de demostración, necesitamos instalar los siguientes componentes
Visual Studio o Visual Visual Studio o Visual Studio NET. Framework o NET Framework
El programa de demostración de plataforma requerido debe ejecutarse en una de las siguientes plataformas de sistema operativo que admitan NET Framework
Windows Server SP
Si es desarrollador de C y desea mejorar las aplicaciones basadas en Win/MFC utilizando la tecnología WPF, entonces este artículo es para usted. Para obtener más información de este artículo, debemos estar familiarizados con VC/CLi, MFC, XAML y C#. Sin embargo, si no conocemos C# o XAML, aún podemos usarlos haciendo referencia a archivos DLL existentes. Sin embargo, si no conocemos C# o XAML, aún podemos usar programas WPF haciendo referencia a archivos DLL ya preparados.
2 ¿Qué es WPF?
WPF es la abreviatura de Windows Presentation Foundation. Es un subsistema de NET Framework de Microsoft. Es un sistema que permite a los desarrolladores crear y mejorar aplicaciones visuales de manera eficiente. Tecnología de experiencia de usuario. Gracias al lanzamiento de WPF, los desarrolladores pueden aprovechar la tecnología para crear aplicaciones visuales de manera eficiente y mejorar la experiencia del usuario. Diseñar y desarrollar controles enriquecidos es aún más poderoso con los programas de Windows. WPF se centra en un conjunto de servicios de aplicaciones, interfaz de usuario, vectores, animación, enlace de datos y audio, y proporciona límites muy claros entre la interfaz de usuario y la lógica empresarial.
La API de WPF es código no supervisado, pero la mayoría de los programas Win/MFC son código C no supervisado. Por convención, las API de WPF no se pueden llamar desde programas no canónicos. Sin embargo, al usar la opción /clr del compilador VC, podemos crear un sistema con una combinación de código canónico y no canónico, donde el código canónico y no canónico se combinan a la perfección.
Una cosa a tener en cuenta es que la compilación de archivos XAML no está permitida en proyectos C, por lo que tenemos que crear un sistema que contenga el código necesario en este ejemplo y luego crear un sistema que contenga el código necesario. en este sistema de ejemplo. Por lo tanto, tenemos que crear una DLL de C# que contenga todo el XAML necesario para este ejemplo y luego incluir una referencia a esa DLL en el proyecto de C.
Existen dos técnicas básicas para mezclar código WPF y Win/MFC
Incorporar WPF en programas Win/MFC. Con esta técnica, los desarrolladores pueden utilizar las capacidades gráficas avanzadas de WPF para renderizar Win/MFC. Aplicaciones
La DLL de WPF se puede utilizar para representar aplicaciones Win/MFC utilizando las capacidades gráficas avanzadas de WPF.
Aplicaciones /MFC
? Poner Win/MFC en WPF. Usando esta técnica, los desarrolladores pueden usar
controles Win/MFC existentes en WPF y usar algún tipo de mecanismo para pasar datos
En este artículo, usaremos el primer método.
Tres programas que integran Win/MFC y WPF
Introducido en la sección anterior Habiendo establecido las reglas básicas para En este ejemplo, esta sección explica cómo escribir el código de implementación. El propósito de este ejemplo es crear una herramienta de configuración para configurar la fecha y la hora, en la que WPF implementa la parte de animación y MFC aún implementa el resto del programa
El programa de demostración consta de dos partes, una parte es MFCHostMPF (consta de código VC/MFC) y la otra parte es WPFControls (consta de código XAML y C#). Strong> III Agregar código relacionado con WPF en una aplicación MFC
Primero, la palabra clave gcnew se usa para crear una instancia del tipo de control, en este caso una instancia de pila de recolección de basura. Todo el espacio de memoria asignado por gcnew será administrado automáticamente por el recolector de basura y los desarrolladores no necesitan preocuparse por liberar este espacio por ningún motivo.
Para usar un programa WPF, la clave es la clase System::Windows::Interop::HwndSource, que usará el programa WPF en una ventana Win. Por lo tanto, un programa WPF se puede colocar en la interfaz de usuario como una ventana secundaria de una ventana MFC, y la comunicación entre el objeto WPF y la ventana Win se realiza haciendo referencia a campos estáticos almacenados en el programa C. El código para estos campos estáticos es el siguiente
ref class Globals { public: static System:: Windows:: Interop:: HwndSource^ gHwndSource; static WPFControls::. Para crear HwndSource, primero necesita crear una estructura HwndSourceParameters que contenga los siguientes parámetros Categoría Ventana Tipo de ventana Posición inicial de la ventana Tamaño inicial de la ventana Clase principal Una vez que hayamos escrito la estructura HwndSourceParameters, podemos agregarla al método constructor HwndSource(HwndSourceParameters) de HwndSource. ) Finalmente, asignamos una referencia al reloj WPF a la propiedad RootVisual del objeto HwndSource y creamos HwndSource usando Handle To HwndSource llamando a Handle To HwndSource(HwndSource(HwndSource(HwndSource)).
Y devuelva el HWND de HwndSource llamando a Handle ToPointer(). El código es el siguiente
HWND GetHwnd(HWND parent int x int y int width int height) { System::Windows::Interop:.HwndSourceParameters. ^ sourceParams = gcnew System ::Windows::Interop::HwndSourceParameters(MFCWPFApp); sourceParams gt;PositionX = x; sourceParams gt;sourceParams gt;sourceParams gt;Ancho = ancho; = IntPtr(padre) ; sourceParams gt; WPFControls::AnimClock( ; gHwndSource gt; RootVisual = myPage; Globals: :gHwndSource gt; RootVisual = myPagegHwndSource gt; Handling ToPointer(); } Entonces, no importa cómo el usuario cambie el reloj, nuestro código MFC llamará a RefereshWPFControl() para actualizar el reloj WPF
void RefreshWPFControl() { FrameworkElement^ página; DateTime tm = DateTime::Now; gwcClock gt ChangeDateTime(tm año tm mes tm día tm hora tm minuto tm segundo); = Globales::gwcClock; Globales: :gHwndSource gt;RootVisual=página;return;}. Ahora que tenemos la mayor parte de la funcionalidad que necesitamos, la tarea final es encontrar el lugar en el código de diálogo MFC donde podamos llamar a HwndSource para implementar la funcionalidad de creación. Hay muchos lugares para hacer esto, pero OnCreate es probablemente el mejor.
El código para llamar a la función GetHwnd() en el identificador de eventos OnCreate es el siguiente
int CMFCHostWPFDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) ==) return; GetHwnd(este gt; GetSafeHwnd() ); retorno }