Red de conocimiento informático - Material del sitio web - Cómo usar duilib en WTL y MFC y cómo usar la biblioteca duilib estáticamente

Cómo usar duilib en WTL y MFC y cómo usar la biblioteca duilib estáticamente

Ahora enumeraré los problemas y soluciones que encontré durante el proceso de implementación para que todos puedan tener una referencia cuando encuentren problemas en el futuro.

1. Me gusta usar bibliotecas estáticas, pero no me gusta usar bibliotecas dinámicas. Usar ropa y perchas es redundante y problemático.

Entonces, al usar esta biblioteca, lo primero es convertir la biblioteca dinámica en una biblioteca estática. También hay un cambio en el conjunto de caracteres Unicode

(1 Busque el archivo de encabezado uilib.h y comente la definición original: agregue una nueva macro #define UILIB_API

/). /#ifdef UILIB_EXPORTS

//#define UILIB_API __declspec(dllexport)

//#else

//#define UILIB_API __declspec(dllimport)

//#endif

(2) No se informará ningún error después de la compilación, y luego puede incluir directamente esta biblioteca estática cuando la use. Al mismo tiempo, tenga en cuenta que también la necesita. para incluir varias bibliotecas estáticas oledlg.lib dui.lib winmm.lib comctl32.lib

Aunque no es sencillo, permite generar el programa con un solo exe y sin otras cargas.

2. Después de incluirlo, al compilar el proyecto, se reportará un error diciendo que createtextserver no está definido o algo así. Esto se debe a que se agregó soporte para richedit a la nueva versión. Esta directiva necesita usar texthost y textserver. En este momento, es necesario hacer referencia a richedit.dll y richedit.lib. Por conveniencia, puse esta parte de la importación en el archivo. biblioteca duilib. En cuanto al código, no lo publicaré. Un programador puede entender el código para importar la biblioteca.

3. Si su archivo wtl ATL MFC ya contiene archivos de encabezado como atltypes, encontrará que habrá muchos crect cpoint csize, etc. que le indicarán que no sabe cuál usar. Debido a que duilib implementa estas tres funciones por sí mismo, entran en conflicto con las de ATL MFC WL. Entonces, ¿qué debemos hacer en este momento? .. Por supuesto, se utilizan macros. Podemos encontrar sus definiciones en uibase.h de duilib. Agregue #ifndef DUI_NOTYPES antes de la definición y agregue #endif después de la definición. De esta manera, cuando introducimos la biblioteca duilib en WTL. agregue #define DUI_NOTYPES antes de la referencia. Bloquee esos errores.

4. El siguiente problema casi me hace colapsar, pero finalmente lo resolví.

Después de resolver los problemas anteriores uno por uno, encontrará que muchos lugares del proyecto informan errores inexplicablemente. Incluso el CDC CmemeryDC Cpen más básico no reconoce e informa muchos errores.

La causa del error radica en el archivo de encabezado windowsx.h en duilib. Este es un archivo de encabezado que los programadores del SDK no deben conocer. Contiene algunas definiciones de macros, lo que facilita enormemente la programación del SDK.

Pero aquí se convierte en un obstáculo, entonces ¿qué debemos hacer? Miré dónde se informó el error y luego miré las macros en Windowsx y descubrí que la razón era en realidad muy simple. Algunas de las definiciones de macros entraban en conflicto con las definiciones de funciones WTL. Entonces, en este momento necesitamos utilizar el mecanismo de protección de funciones de Microsoft. Los conflictos en mi proyecto son las siguientes funciones SelectFont SelectPen De hecho, hay muchos selectbrush, etc. Simplemente agregue los errores que se informen. No es necesario agregarlos todos a la vez.

#ifdef _INC_WINDOWSX

#undef SelectFont

#undef SelectPen

#endif // _INC_WINDOWSX

5 Entonces, en este momento podrá utilizar la biblioteca duilib normalmente en WTL.

6. Entonces, hablemos de la implementación de ese árbol.

El árbol es sin duda la lista de su interior que se implementa mediante sangría. Los nodos que elegí se hicieron usando el siguiente patrón. De esta manera, al ordenar más tarde, solo necesito intercambiar CHorizontalLayoutUI sin cambiar el número de índice de CListContainerElementUI.

CListContainerElementUI

CHorizontalLayoutUI

Controles

Controles

CHorizontalLayoutUI

CListContainerElementUI

p>

7. Calcule automáticamente la barra de desplazamiento,

CListContainerElementUI no tiene la función de calcular automáticamente la barra de desplazamiento, tal vez porque la posición de las cosas en el contenedor no se puede determinado.

Para mi proyecto, inserté Ctextui en CHorizontalLayoutUI y agregué la lógica para calcular automáticamente el ancho de Ctextui y establecer el ancho de CListContainerElementUI en la biblioteca subyacente.

En este proceso. Siempre es necesario prestar atención al setfixwight de CListContainerElementUI. La actualización provocará un bucle infinito, por lo que se debe agregar un parámetro predeterminado.

8. Clasificación El principio de clasificación es relativamente simple. Simplemente invierta CHorizontalLayoutUI y etiquete. Mi clasificación rápida fue más problemática de escribir porque estaba desordenada cuando tenía prisa. función, pero actualmente solo es la clasificación de nodos hoja. Si desea implementar la clasificación de nodos que no son hojas, no es imposible, pero será más problemático porque no lo uso, así que no lo he escrito. Si está interesado, escríbalo usted mismo.

La demostración es realmente muy simple. Solo hay un árbol y nada más. Incluso la barra de título no tiene nada escrito. Puse la demostración en csdn. Descárgala si quieres verla. Reimpresión.