Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Alternativa a TEXTOUT que soporte Unicode (https://www.clubdelphi.com/foros/showthread.php?t=41481)

MDSato 16-03-2007 12:45:24

Alternativa a TEXTOUT que soporte Unicode
 
Buenos días,

Estoy modificando mi aplicación para que sea capaz de presentar textos UNICODE en pantalla. La aplicación en concreto debe generar un bitmap a partir del texto almacenado en un widestring. El problema que me encuentro es que hasta ahora utilizaba el método TEXTOUT del canvas para generar el texto en el bitmap, y por lo visto esta opción no soporta UNICODE, con lo cual se pierden los caracteres especiales.
¿Qué alternativa podría utilizar? Es que no estoy muy puesto en cuanto a representación gráfica y aunque he estado mirando la documentación, no me hago una idea... Pido disculpas...
Os dejo un ejemplo del código para que tengáis una idea más clara:

Código:

AuxBitmap := TBitmap.Create;
AuxBitmap.Canvas.Font.Name  := NombreFuente;
AuxBitmap.Canvas.Font.Size  := PuntosPant;
AuxBitmap.Canvas.Font.Style := EstiloFuente;
//Aquí asigno el Charset
libIncluirCharset(AuxBitmap.Canvas.Font,Charset);
//Aquí obtengo las dimensiones que tendrá el bitmap a partir de la fuente utilizada
dibTextWidthHeight(auxbitmap.canvas,texto,anchoF,altoF);
AuxBitmap.Width  := anchoF;
AuxBitmap.Height := altoF;
 
//Aquí es donde TEXTO, que es unicode, pierde los caracteres especiales en pantalla...
AuxBitmap.Canvas.TextOut(0,0,Texto);
////////////////////////////////////////////

Muchas gracias de antemano por vuestra ayuda.
Un saludo.

ArdiIIa 16-03-2007 12:51:26

Cita:

Empezado por MDSato
Buenos días,
y por lo visto esta opción no soporta UNICODE, con lo cual se pierden los caracteres especiales.

Yo no eso muy seguro de que eso sea así.
Pregunto: ¿No será que el tipo de Font que le asignas al Canvas no soporta los caracteres especiales que intentas meter?

Podrías hacer pruebas asignando distintos tipos de fonts y comprobar los resultados.
Saludos

MDSato 16-03-2007 13:04:16

Muchas gracias por tu apreciación, ArdiIIa.
La fuente que estaba utilizando era la Times New Roman. De todas formas, he probado con la Tahoma (que es la que por defecto utilizan los componentes TNT) y da el mismo resultado.
En todos los cambios de rutinas que he realizado me he dado cuenta que si en la función, el parámetro lo recibe una variable string en lugar de widestring, se pierden esos caracteres especiales. Y en el caso del TextOut la llamada sólo permite enviar string. De ahí que achacara ese comportamiento a eso... A que aunque yo le envío el widestring, TextOut lo toma como un string...

Código:

procedure TextOut(X: Integer; Y: Integer; const Text: string);
¿Se os ocurre alguna otra posibilidad?
Gracias de nuevo.

ArdiIIa 16-03-2007 13:45:20

Entonces la forma de operar tal vez tenga que ser diferente....
En vez de trabajando directamente con el Canvas del Bitmap seguramente obtengas otros resultados trabajando con otra llamada del gdi32...

Código Delphi [-]
TextOutW((DC, 0, 0, PWideChar(Texto), Length(Texto));

MDSato 16-03-2007 14:08:13

Perdona por mi absoluta ignoracia en el tema ArdiIIa, pero, ¿de qué forma podría "enlazar" ese DC con un bitmap?
Es la primera vez que veo eso del Device Context... :S

Muchas gracias.

ArdiIIa 16-03-2007 14:15:28

El DC (device context) se obtiene mediante la función GetDC y sirve para obtener el handle del objeto sobre el que queremos operar.
En tu caso ya lo tienes.... y no es necesario hacer nada mas..
Código Delphi [-]
TextOutW(AuxBitmap.Canvas.Handle, 0, 0, PWideChar(Texto), Length(Texto));
Perdona que anteriormente no te lo pusiera mas claro...

MDSato 16-03-2007 14:15:35

Me respondo a mí mismo... He utilizado tu llamada y en lugar del DC he puesto el Handle del canvas del bitmap de esta forma:

Código:

TextOutW(AuxBitmap.Canvas.Handle, 0, 0, PWideChar(Texto), Length(Texto));
Por lo visto en pantalla el resultado parece correcto :)
Muchísimas gracias.

MDSato 16-03-2007 14:16:59

MUCHISIMAS GRACIAS!!!!
TODO PERFECTO ENTONCES...

Mil gracias por tu respuesta... Veía el asunto muy negro (o en chino, para seguir con la temática unicode)... ;)

seoane 16-03-2007 14:23:57

:( Pues vaya, mientras estaba creando un ejemplo me pisaron la respuestaa

Código Delphi [-]
var
  Bitmap: TBitmap;
  Size: TSize;
  Texto: WideString;
begin
  Texto:= #$06E9 + #$06E9; // Caracteres arabes
  Bitmap:= TBitmap.Create;
  try
    Bitmap.Canvas.Font.Name:= 'Arial';
    Bitmap.Canvas.Font.Size:= 16;
    Bitmap.Canvas.Font.Style := [];
    // Version Unicode de GetTextExtentPoint32
    GetTextExtentPoint32W(Bitmap.Canvas.Handle,PWideChar(Texto),
      Length(Texto),Size);
    Bitmap.Width:= Size.cx;
    Bitmap.Height:= Size.cy;
    // Version Unicode de TextExtent
    ExtTextOutW(Bitmap.Canvas.Handle, 0, 0, 0, nil, PWideChar(Texto),
      Length(Texto), nil);
    // Aqui yo lo dibujo para ver el resultado
    Canvas.Draw(0,0,Bitmap);
  finally
    Bitmap.Free;
  end;
end;

Hasta tenia preparada una explicación:
Cita:

La mayoria de la funciones de la API que tienen que tratar con texto tienen dos versiones la ANSI y la Unicode. El metodo TextOut del Canvas utiliza la funcion ExtTextOut en su version ANSI (ExtTextOutA), si necesitas trabajar con Unicode tendras que usar la otra version (ExtTextOutW).
Tengo que ser mas rápido :D :p

ArdiIIa 16-03-2007 14:26:35

Cita:

Empezado por seoane
:
Tengo que ser mas rápido :D :p

Sabía que estabas tardando demasiado en aparecer... :D :D
Y pensaba... "verás cuando venga seoane.:p "

MDSato 20-03-2007 13:36:59

De todas formas, gracias a los dos... :)
Seguro que servirá a algún novato como yo en estos temas...


La franja horaria es GMT +2. Ahora son las 01:52:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi