Paso 2: Cómo funciona...
Selección de fuente
LaserCAD utiliza la biblioteca GDI + de Microsoft para la gestión de fuentes. Cuando se selecciona una fuente de la lista en el cuadro de texto editar desplegable se muestra una lista de fuentes disponibles. Después de introducir texto y haga clic en aceptar, LaserCAD copia el nombre de la familia de fuentes de la lista y pasa a GDI + utilizando el código que se ve algo como esto:
Aquí pwzFontFamily es la cadena de texto tirada de la lista desplegable Font. Fname es un flotador con el tamaño del fuente tamaño desplegable y iStyle tiene banderas para negrita, cursiva y subrayado (etc..)
Cuando se llama a este constructor, el código de Microsoft (fuente está disponible) llama GdipCreateFont() pasando información similar. Si no se puede encontrar una fuente coincidente y devuelve código de error y el código de Microsoft luego cambia a una fuente genérica de San Serif como se muestra a continuación:
Como se mencionó anteriormente, para obtener la fuente correcta de LaserCAD como-es, tienes que saber si la fuente seleccionada necesita subrayado negrita, cursiva o (rara vez) incluido en la lista estilo pasó a GdipCreateFont. Una fuente como Monotype Corsiva, por ejemplo, sólo existe como una cursiva. Si Gdiplus::FontStyle::FontStyleRegular se pasa a GdipCreateFont, como será el caso si uno de los botones de negrita, cursiva o subrayado no está marcada, GdipCreateFont no se encuentra el sólo cursiva Monotype Corsiva y se utilizará la tipografía San Serif genérica.
La solución de selección de fuente
Para solucionar este problema que utilizaremos el siguiente código a si la fuente seleccionada admite negrita, cursiva, subrayado o Normal:
Una vez que sabemos que el apoyo de fuentes que podemos desactivar los botones que no se aplican los estilos. Si la fuente no es compatible con FontStyle::FontStyleRegular pero es compatible con negrita o cursiva, uno de ellos se controlará. Si sólo uno es compatible se también se deshabilitará para que no se apague.
Para poder hacer esto, interceptan llamada DialogProc de la editar texto del cuadro de diálogo. Esto podría hacerse a través de la creación de subclases, pero una técnica diferente fue aquí que está fuera del alcance de este artículo. El código original podría fijarse alterando la DialogProc existente para hacer lo mismo.
Entrada de texto y la representación
El error con texto no ANSI (no inglés) se produce porque el DialogProc lee el texto desde el control de edición utilizando una función de ANSI, como GetDlgItemTextA. La ventana sí mismo (como con la mayoría editar controles) es capaz de sostener el texto Unicode pero la llamada a GetDlgItemTextA no serán capaces de representar los caracteres correctamente y reemplazarlos con signos de interrogación u otros caracteres de sustitución.
Para solucionar este problema, ya que no puedo cambiar fácilmente el código existente, he colocado un gancho en el API EndDialog de Windows. Mi función de gancho se muestra a continuación:
Funciona al leer el texto desde el control de edición antes de cerrar el cuadro de diálogo y guardar ese texto en una variable global: g_wstrLastKnownText.
El último paso es conectar la función GDI + que se utiliza para representar el texto: GdipAddPathString. Cuando se invoca, simplemente reemplazar el texto que se pasa a ella con la cadena que guarda desde el control de edición. Lamentablemente, el texto que se aprobó a GdipAddPathString por LaserCAD que pueden convertir en una cadena Unicode antes de que podría ser enviado a GdipAddPathString, pero el daño ya había sido hecho. Aquí está mi reemplazo para GdipAddPathString:
Con esto hecho, ahora es posible introducir texto no ANSI en el control de edición y renderizado correctamente para láser de corte / grabado!
La corrección necesaria
El código de LaserCAD podría fijarse simplemente usando Unicode (wchar_t) en lugar de búferes de caracteres ANSI (char) al leer la cadena en el control de edición. Como nunca se convierte en una cadena ANSI lo hará adecuadamente cuando se pasa a GdipAddPathString.