Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-03-2007
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 16-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 16-03-2007
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
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.

Última edición por MDSato fecha: 16-03-2007 a las 14:14:50.
Responder Con Cita
  #4  
Antiguo 16-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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));
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 16-03-2007
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 16-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #7  
Antiguo 16-03-2007
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 16-03-2007
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
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)...
Responder Con Cita
  #9  
Antiguo 16-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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

Última edición por seoane fecha: 16-03-2007 a las 16:34:08.
Responder Con Cita
  #10  
Antiguo 16-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por seoane
:
Tengo que ser mas rápido
Sabía que estabas tardando demasiado en aparecer...
Y pensaba... "verás cuando venga seoane. "
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #11  
Antiguo 20-03-2007
Avatar de MDSato
MDSato MDSato is offline
Miembro
 
Registrado: nov 2005
Posts: 17
Poder: 0
MDSato Va por buen camino
De todas formas, gracias a los dos...
Seguro que servirá a algún novato como yo en estos temas...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Unicode Vs Delphi PTW Varios 0 23-01-2006 16:01:29
Unicode PTW Varios 0 22-01-2006 13:30:31
Unicode arantzal Varios 2 19-09-2005 18:44:07
Unicode Sworied MySQL 1 12-08-2004 08:27:38
Unicode pacogp Varios 2 17-02-2004 15:02:35


La franja horaria es GMT +2. Ahora son las 11:14:49.


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
Copyright 1996-2007 Club Delphi