2010-11-02 22 views
20

https://stackoverflow.com/questions/149698/what-is-a-good-mfc-starting-bookAlternativa a MFC

Muchos de los comentarios votados afirman que hay alternativas mucho mejores. Me gustaría saber qué podrían ser.

Mi requisito principal es que la interfaz de usuario use los widgets nativos para que nuestro software de automatización pueda funcionar. Las ventanas dibujadas por el propietario son mucho más difíciles de manejar.

No me gusta especialmente el diseño de MFC por lo que una alternativa sería buena. El único que encontré es WX, que es el que ya hemos probado y estamos considerando abandonar. Necesitamos algo que no nos obligue a luchar con un montón de envoltorios multiplataforma que no nos importan. Estamos escribiendo una aplicación de Windows y el marketing no da ni una mierda sobre la orientación a Mac o Linux (sí, también me duele el trasero).

He mirado la opción .NET un poco. El problema es que no sé mucho al respecto, pero por lo que puedo decir, tendríamos que usar C# para obtener muchas de las opciones disponibles con MFC. El kit de herramientas de C++/CLI no parece tener ventanas de acoplamiento a primera vista, por ejemplo. De hecho, una opción WinFroms directa no parece tampoco. Parece que tendríamos que hacer un proyecto de WPF y eso no parece ser lo que realmente queremos (y tendríamos que aprender un montón de basura además de otro kit de herramientas). Salir de C++ también requeriría mucho envoltorio y no me gustan particularmente los resultados que he visto de los contenedores automáticos.

El otro problema que tengo con la opción .NET es que tenemos una aplicación de dibujo bastante intensa (además de requerir muchas formas). Sé que puede obtener resultados similares con lenguajes JIT como .NET, pero también sé que debe ser mucho más cuidadoso para hacerlo. Es un tema del que me gustaría evitar preocuparme en este momento.

El otro problema, y ​​probablemente el más importante con .NET (al menos el cambio de idiomas) es que tenemos un gran suministro de lógica de interfaz que, aunque debe ser independiente de la API, está escrito en C++.

¿Cuáles son las otras opciones? ¿Estas personas realmente tienen puntos o simplemente están gritando contra algo que no es su idioma o conjunto de herramientas favorito?

NOTA:
¿Cuál es el problema aquí? Dije específicamente que portar a otras plataformas NO es siquiera una consideración remota y que TENGO QUE tener algo que use el conjunto de widgets nativo para no tener que cambiar completamente todo lo que las pruebas usan para automatizar el producto. ¿Alguien realmente leyó mi pregunta?

+3

Personalmente no encuentro MFC tan malo. Está un poco desactualizado y su documentación no siempre es buena, pero me gusta el código fuente en comparación con Qt, que creo que es un desastre. Al tener que depurar, ser capaz de entender cómo funciona bajo el capó puede ser bueno (incluso si pierde algo de él cuando MFC llama a las funciones de Windows que no tienen fuentes). No tengo experiencia con otros frameworks pero solo quería decir que no desacreditéis a MFC demasiado rápido. No es tan genial, pero tampoco está mal. – n1ckp

+0

Principalmente estoy tratando de encontrar alternativas. Sin embargo, hay una cosa que me molesta mucho acerca de MFC y es el hecho de que parece que no puede adjuntar controladores externos. Los manejadores de "mensajes" no solo deben estar en mapas estáticos, sino que deben ser miembros de la clase visual que está creando. No puede crear firewalls de compilador haciendo que el comportamiento gobernado por objetos sea invisible fuera del archivo .cpp. La verdadera encapsulación no está disponible. Además, no soy fanático de que algunos objetos se eliminen automáticamente y otros no ... simplemente lo aprendí ayer. La falta de administradores de diseño tampoco es buena. –

+0

Roberts: Bueno, no estoy totalmente seguro de su objeción, pero creo que puede eludir el uso de un mapa estático con el exceso de alguna función MFC (eche un vistazo a http://stackoverflow.com/questions/978071/how-to-redirect -mfc-messages-to-another-object). También para el objeto de eliminación automática, creo que Qt es peor en ese aspecto. Aunque no estoy tratando de venderle MFC, también me alegraría tener una buena alternativa. Mi experiencia con Qt fue de reemplazar a los programadores pobres que la usaban, así que tengo un poco de parcialidad pero realmente no me convenció de que fuera mejor (¿Diría que es equivalente?). – n1ckp

Respuesta

11

Qt es la única respuesta real para un conjunto de herramientas gui basado en C++ en este momento (al menos para aplicaciones de escritorio completas). Incluso para aplicaciones puramente Windows lo vale, también tiene una excelente integración con Visual Studio (obtenga el vs-addin) y está muy bien documentado

wx tiene algunos puntos agradables, uno de ellos es muy similar al MFC en uso, pero con Qt yendo LGPL, la verdadera ventaja de wx se ha perdido.

Editar componentes Qt no son nativos sin embargo, hacen uso de las API nativas de estilo para que sean indistinguibles de los widgets nativos - si utiliza los estilos predeterminados.

+0

¿Utiliza QT el conjunto de widgets nativo? –

+0

@Noah: no, Qt tiene su propio conjunto de widgets, es uno muy bueno. –

+0

@Noah, Qt no utiliza widgets nativos, pero muestra los widgets como Windows de forma predeterminada en Windows. –

1

He visto Qt usado bastante extensamente. Personalmente no he usado Qt, pero veo muchas preguntas al respecto, mucho más que wXwidgets o MFC. Yo comenzaría con eso.

3

MFC no estaba nada mal en su día, pero se está poniendo viejo. Un buen ejemplo serían las colecciones que han sido reemplazadas con las mejores colecciones de STL. Sin embargo, estabas preguntando sobre cosas de GUI. Está el WTL (Biblioteca de plantillas de Windows) que creo que ahora ha sido de origen abierto. Mucho más ligero que el MFC, pero está diseñado para funcionar de la misma manera, por ejemplo. La mayoría de las clases tienen los mismos nombres y nombres de métodos.

En el lado negativo, he encontrado documentación relativamente escasa y no parece funcionar bien con los asistentes de Visual Studio. Sin embargo, este podría ser mi problema: conseguir que funcione con los asistentes de SV sería bastante importante en mi humilde opinión.

+3

Tengo entendido que WTL es en realidad un envoltorio para ATL, que está hecho principalmente para facilitar la escritura de cosas COM. Tendremos que conversar con los objetos COM en algunas áreas muy localizadas, pero no en conjunto. La falta de soporte y documentación me preocupa. También me preocupa que no incluya soporte para los elementos del "paquete de características 2008", que definitivamente vamos a usar mucho. ¿Estoy equivocado sobre alguna de estas cosas? –

+1

+1 por responder la pregunta. –

+0

Re. Soporte para nuevas características: muy posiblemente, no he usado WTL con enojo durante algunos años, así que no podría decir de ninguna manera. Para el nuevo desarrollador, cambié al lado oscuro (C#) que tiene algunos buenos elementos de GUI. – winwaed

4

Las formas de Windows funcionarán bien con C++/CLI. Los formularios de Windows también son una envoltura alrededor de los identificadores WIN32.

No hay diferencia en las capacidades de C#/Windows Forms en comparación con C++/Windows Forms. (Simplemente compilan de forma diferente) Al igual que usted puede hacer las mismas cosas con C# y VB.NET ...

Si está buscando ventanas de acoplamiento, hay una serie de bibliotecas de terceros que hacen esto. (Algunos son de código abierto, otros pueden comprarse). Debido a la CLR, puede incluir ensamblajes escritos en un idioma diferente.

+0

Bueno, ¿qué son ... enum por favor –

2

Estoy más o menos en la misma posición: aplicación grande, código nativo, que usa MFC para el front-end. No veo ninguna alternativa realmente convincente ni razones para cambiar a otra cosa.

Dicho esto, permítame ofrecer una opinión. Si estuviera haciendo un nuevo proyecto, que necesitaba preservar/heredar una gran cantidad de código nativo, consideraría tratar de hacer un front-end WPF con una aplicación principal en gran parte nativa (C++/CLI). Esto se hizo con Visual Studio 2010, y es en su mayoría rendimiento, por lo que es al menos posible. WPF tiene algunos beneficios de UI, y puede ser más fácil trabajar y probar (desde una perspectiva de automatización), ya que es un código CLR. No estoy seguro de que valga la pena la inversión y la curva de aprendizaje, pero es la alternativa que consideraría para una aplicación moderna pura de Windows con muchos códigos nativos.

Espero que ayude.

2

ofrecer algo que no vi mencionado en las otras respuestas:

Desde el sonido de la misma, su única razón para necesitar controles nativos es que el software de automatización. Y la única razón para necesitar que el software de automatización funcione es para realizar pruebas. Asumiría que se están utilizando algunas series de pruebas automatizadas para garantizar que el software funcione según lo previsto.

Si ese es el caso, entonces hay algo que considerar: hay un patrón de diseño razonablemente popular en el reino C#/WPF llamado Model-View-ViewModel. Sin entrar en detalles excesivos aquí, la idea básica es que puede separar los controles de GUI reales (la Vista) del código que maneja cómo esos controles interactúan con el resto de la lógica de negocios en la aplicación. Ese código es el llamado ViewModel. Entre otras cosas, esto se presta a diseños donde ese ViewModel (y toda la lógica restante de la aplicación) puede probarse a través de métodos típicos de pruebas de unidades sin necesitar realmente controles GUI.

Por lo tanto, cualquiera que sea la prueba para la que se utiliza el software de automatización, podría reemplazarse por un código de prueba unitaria directo.

Sin embargo, mi propia experiencia en este ámbito no es tan extensa como me gustaría. Entonces, si consideras esto, te sugiero que realices más investigaciones. Para empezar, los términos de Google como "Model-View-ViewModel" y "MVVM" finalmente deberían arrojar algunas discusiones más detalladas sobre esa parte.

+0

MVC es un método muy común y viejo y lo usamos un poco. Sería una prueba unitaria si no me hubieran dicho que cortara las esquinas: \ Pero incluso con todas las pruebas unitarias en el mundo, hay dos problemas: 1) El código de vista no puede ser probado por unidades. 2) todavía necesita pruebas de aceptación e integración. Al igual que las pruebas unitarias, deberían automatizarse y ejecutarse al menos en cada lanzamiento potencial (que es cada noche más o menos en un método ágil). Incluso con todo lo que aparentemente funciona perfectamente cuando está separado, puede perder cosas que solo aparecen en uso y aún desea los rápidos comentarios que ofrece la automatización. –

+0

Gracias por la idea, aunque, +1 –