Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
[gdi] Cambiar DrawFocusRectangle

la verdad q ya no se q mas intentar, quiero cambiar el rectangulo de foco a una linea solida, y tal vez cambiar el color (pero con la linea solida ya me alcanza)

las últimas 6 horas de google fueron bastardas, basicamente quiero cambiar:


a esto:


en principio no parece tan complejo, asignar un TPen al canvas del listbox y listo (tambien estoy cambiando el relleno, por eso asigno un TBrush también):

Código Delphi [-]
procedure TForm1.listaDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  pincel: TBrush;
  lapiz: TPen;
begin
  with Control as TListBox do
  begin
    pincel := TBrush.Create();
    pincel.Color := clGray;
    pincel.Style := bsSolid;
    Canvas.Brush := pincel;

    lapiz := TPen.Create;
    lapiz.Style := psSolid;
    lapiz.Mode := pmBlack;
    lapiz.Color := clRed;
    lapiz.Width := 1;
    Canvas.Pen := lapiz;

    Canvas.DrawFocusRect(Rect);
    Canvas.FillRect(Rect);

    Canvas.Font.Color := clBlack;
    Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]);
  end;
end;

por que me ignora entonces? no hay absolutamente nada que pueda cambiar el comportamiento, sin embargo el brush del mismo ejemplo va perfecto [cambia el azul tipico a gris]

DrawFocusRect solo pide un Trect por lo q _deberia_ tomar el pen q esta usando el canvas, que es lo que estoy errando ?

socorro

Última edición por Kimero fecha: 10-09-2006 a las 08:38:52.
Responder Con Cita
  #2  
Antiguo 10-09-2006
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
Si quieres dibujar un rectángulo debes de usar Rectangle, ya que DrawFocusRect siempre se dibuja igual independiente de los valores que asignes al canvas. Por otro lado no hace falta que crees un Pen y Canvas nuevos cada vez, sobre todo porque luego no los destruyes y quedan en memoria. Bueno yo lo haría así:

Código Delphi [-]
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with Control as TListBox do
  begin
    // Usamos el Brush y el Pen del propio canvas
    Canvas.Brush.Style := bsSolid;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color := clRed;
    Canvas.Pen.Width := 1;
    
    // Aqui compruebo si esta seleccionado
    if odSelected in State then
    begin
      // Si lo esta dibujo un rectangulo, el borde con el valor de Pen
      // y el interior con el valor de Brush
      Canvas.Brush.Color:= clGray;
      Canvas.Rectangle(Rect);
    end else
    begin
      // Si no lo esta solo dibujo el interior con el valor del Brush
      Canvas.Brush.Color:= clWhite;
      Canvas.FillRect(Rect);
    end;

    Canvas.Font.Color := clBlack;
    Canvas.TextOut(Rect.Left + 1, Rect.Top + 1, Items[Index]);
  end;
end;
Responder Con Cita
  #3  
Antiguo 10-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
Arrow closer

mas cerca pero todavia aparece el rectangulo 'dotted' del foco:
http://cablemodem.fibertel.com.ar/kimero/foco3.png

lo bizarro es q cuando el listbox pierde el foco [pasandoselo a un boton por ej], obtengo el resultado q queria desde el principio:

http://cablemodem.fibertel.com.ar/kimero/foco4.png

tengo el deseo desde lo mas profundo de mi alma de aniquilar las lineas punteadas

te dejo como tengo el codigo [un poco mas compacto y el brush.color fuera del if]

Código Delphi [-]
procedure TForm1.listaDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with Control as TListBox do
  begin
    // Usamos el Brush y el Pen del propio canvas
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color:= clGray;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color := clRed;
    Canvas.Pen.Width := 1;

    // Si esta selec. dibujo un rectangulo, el borde con el valor de Pen
    // y el interior con el valor de Brush
    if odSelected in State then Canvas.Rectangle(Rect)
    // Si no lo esta solo dibujo el interior con el valor del Brush
    else Canvas.FillRect(Rect);

    Canvas.Font.Color := clBlack;
    Canvas.TextOut(Rect.Left + 1, Rect.Top + 1, Items[Index]);
  end;
end;
Responder Con Cita
  #4  
Antiguo 10-09-2006
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
Seguro que hay alguna opción para que windows no dibuje el rectángulo del foco, pero como no tengo ganas de buscarla ahora , podemos hacer lo siguiente. El rectángulo del foco se dibuja invirtiendo el color del fondo, pues bien, si nosotros lo dibujamos primero una inversión anula a la otra:

Código Delphi [-]
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with Control as TListBox do
  begin
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color:= clGray;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color := clRed;
    Canvas.Pen.Width := 1;

    if odSelected in State then
      Canvas.Rectangle(Rect)
    else
      Canvas.FillRect(Rect);

    // Si tenemos el foco, lo dibujamos nostros primero
    if odFocused in State then
      Canvas.DrawFocusRect(Rect);

    Canvas.Font.Color := clBlack;
    Canvas.TextOut(Rect.Left + 1, Rect.Top + 1, Items[Index]);
  end;
end;
Responder Con Cita
  #5  
Antiguo 10-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¿Puedes creerte Seoane, que a mí sí me entraron ganas de averiguar cómo quitar el rectángulo "del foco" y por mucho que busqué y busqué (y probé y probé) y no encontré nada aparente, y acaso, casualmente, di con la misma solución que la que has propuesto? ¡Pero exactamente la misma!

Y no por los mismos pasos... porque, aunque leí en el SDK de Windows que la función "DrawFocusRect" se anula a sí misma, ya digo, ha sido por una casualidad que se me ocurriera probar con lo mismo que tú... de hecho ha sido cuando iba a publicarlo aquí cuando he visto que ya habías tú respondido (como no podía ser de otro modo) de la misma manera.

¿Qué cosas, no? Esto lo cuentas y no se cree, como suele decirse, pero, te aseguro que es completamente así, como lo he dicho. Aunque, puesto que yo he dado por casualidad con el asunto, no hay caso... así no hay manera.

A mí me picó que el compañero Kimero se iniciara en estos Foros con este Tema y lo empezara así:

Cita:
(...) la verdad q ya no se q mas intentar, (...)
¡Lo que se hubiera ahorrado de haberlo sabido!

Pues nada. No podía dejar de decirlo. Por favor, por favor, por favor, un poquito de por favor, que nadie piense que me invento nada: juro solemnemente (siempre quise decir algo así) que llegé a la solución que se perseguía, y feo está que lo diga, pero más porque llegué por casualidad que por otra cosa...

PD. A ver si vamos a ser almas gemelas o algo de eso tú...
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 10-09-2006 a las 13:42:40.
Responder Con Cita
  #6  
Antiguo 10-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
aprobado

compacto y no afecta la velocidad en absoluto, con eso me alcanza.

Cita:
Seguro que hay alguna opción para que windows no dibuje el rectángulo del foco, pero...
pasé incontables horas entre hoy y ayer para encontrar algo en el api, ni te gastes, no vale la pena, la inversión alcanza y es una sola línea


EDIT: al margen, ya habia probado enviar dos DrawFocusRectangle, pero ya ni me acuerdo como tenia el codigo exactamente, no funcionaba como lo tenia yo.

EDIT2:
Cita:
¡Lo que se hubiera ahorrado de haberlo sabido!
por eso estoy guardando todo lo q aprendo en un foro con un amigo, muchos pasamos por los mismos problemas... si tuvieramos la solución antes de q aparezca el problema mismo....

y no me gusta tirarle mis problemas a los demas apenas aparecen, me molesto yo mismo horas [dias en este caso ] antes de salir a preguntar

Última edición por Kimero fecha: 10-09-2006 a las 13:50:57.
Responder Con Cita
  #7  
Antiguo 10-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Kimero
EDIT: al margen, ya habia probado enviar dos DrawFocusRectangle, pero ya ni me acuerdo como tenia el codigo exactamente, no funcionaba como lo tenia yo.
Yo sí me acuerdo: fue lo primero que se me vino a la cabeza tras leer que la función "DrawFocusRect" se anulaba a sí misma: simplemente puse dos llamadas a la función, una detrás de la otra. Obviamente, no funcionaba de ese modo, porque faltaba la condición: que el elemento estuviera "enfocado".

Cita:
Empezado por Kimero
por eso estoy guardando todo lo q aprendo en un foro con un amigo, muchos pasamos por los mismos problemas... si tuvieramos la solución antes de q aparezca el problema mismo....
Bueno. El ClubDelphi almacena más de 100.000 mensajes en más de 30.000 temas. Y esto que tratamos aquí acabo de agregarlo al apartado de Trucos, con el permiso de Seoane. Por eso, precisamente, porque seguro que puede servirle a alguien.

Cita:
Empezado por Kimero
y no me gusta tirarle mis problemas a los demas apenas aparecen, me molesto yo mismo horas [dias en este caso ] antes de salir a preguntar
Bueno. No soy quien para contradecirte, a mí me pasa algo parecido. Aunque, estarás conmigo en que esta vez al menos te hubieras ahorrado no poco tiempo y esfuerzo. Demos las gracias a Seoane, pues, que se lo ha merecido.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 10-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
Arrow

Vuelvo a molestar

Sigo encontrando delirios, el simple hecho de cambiar la fuente a otro color q no sea black hace q se anule 'la inversión'

*se sienta a pensar.
Responder Con Cita
  #9  
Antiguo 10-09-2006
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
Cita:
Empezado por Kimero
y no me gusta tirarle mis problemas a los demas apenas aparecen, me molesto yo mismo horas [dias en este caso ] antes de salir a preguntar
A veces solo es cuestión de que "multitud" de ojos ven mas que dos, y lo que en un momento determinado a ti te parece complicado otro lo ve claro. No esta mal cuando alguien se molesto en intentar una cosa, y no sabe que mas probar, en pedirle a los demás que le echen un vistazo. Incluso a veces una cuestión tan simple como esta se agradece mas que un código de 50 lineas.

Cita:
Empezado por dec
PD. A ver si vamos a ser almas gemelas o algo de eso tú...
Si me dices que tu también eres un ingeniero industrial de 27 años en paro, me caigo de la silla ...
Responder Con Cita
  #10  
Antiguo 10-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
Arrow

Lo unico q se me ocurre, es q el textout genera un rectangulo tambien, y éste interfiere con la doble llamada al focusrec, inviertiendo lo q habias invertido.

edit: experimentando con TextRect
Responder Con Cita
  #11  
Antiguo 10-09-2006
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
Cita:
Empezado por Kimero
Sigo encontrando delirios, el simple hecho de cambiar la fuente a otro color q no sea black hace q se anule 'la inversión'
La instrucción DrawFocusRect debe ser la ultima:
Código Delphi [-]
  with Control as TListBox do
  begin
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color:= clGray;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color := clRed;
    Canvas.Pen.Width := 1;

    if odSelected in State then
      Canvas.Rectangle(Rect)
    else
      Canvas.FillRect(Rect);

    Canvas.Font.Color := clRed;
    Canvas.TextOut(Rect.Left + 1, Rect.Top + 1, Items[Index]);
    // Esto al final
    if odFocused in State then
      Canvas.DrawFocusRect(Rect);
  end;
Responder Con Cita
  #12  
Antiguo 10-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Seoane
Si me dices que tu también eres un ingeniero industrial de 27 años en paro, me caigo de la silla ...
Esto,... pues va a ser que no. Tengo algunos meses más (je, je, je) y, aunque no trabajo actualmente para nadie, lo cierto es que no sé qué será estar parado... bueno, sí lo sé, es el antónimo de no ganar dinero. Cosas del idioma. Yo no te veo muy parado Seoane, pero, en todo caso, deseo que lo que te propongas salga adelante.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 10-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
Lightbulb

Cita:
Empezado por seoane
La instrucción DrawFocusRect debe ser la ultima:
Listo ahora si, para sacarme la duda puse odSelected tambien al final y se rompe todo también , o sea tiene sus caprichos de orden, en fin...

MIL GRACIAS, te debo una.

[pd: por q funcionaria el black entonces... ]
Responder Con Cita
  #14  
Antiguo 10-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Bueno. El ClubDelphi almacena más de 100.000 mensajes en más de 30.000 temas.
Y alguno de ellos trata este tema

// Saludos
Responder Con Cita
  #15  
Antiguo 10-09-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
Y alguno de ellos trata este tema
Y se trata de la misma solución... vamos a tener que ir llamando a Iker Jiménez...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #16  
Antiguo 10-09-2006
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
Cita:
Empezado por roman
Y alguno de ellos trata este tema

// Saludos
Pues no la había visto, pero eso demuestra que los genios pensamos igual
Responder Con Cita
  #17  
Antiguo 10-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Je, je. La verdad creo que estaba difícil encontrar ese hilo pues el título no ayuda. Sin embargo Kimero ya sabía de la función DrawFocusRect, así que esas seis horas de Google se hubieran reducido buscando en estos foros

// Saludos
Responder Con Cita
  #18  
Antiguo 11-09-2006
Avatar de Kimero
Kimero Kimero is offline
Miembro
 
Registrado: sep 2006
Ubicación: el país de nestor
Posts: 12
Poder: 0
Kimero Va por buen camino
Cita:
Empezado por roman
Je, je. La verdad creo que estaba difícil encontrar ese hilo pues el título no ayuda. Sin embargo Kimero ya sabía de la función DrawFocusRect, así que esas seis horas de Google se hubieran reducido buscando en estos foros

// Saludos
Es que me imagine q iba a pasar por el api directamente la solucion [me imaginé rodeado de Tmessages ], por eso pase mucho tiempo mirando msdn

Y no encontre ese hilo por el titulo, como bien decis [pregunta por el foco a la mitad del hilo].

Apenas vi q era un Xor le mandé un Draw.. pero la clave como dijo dec estaba en mandarlo solo cuando esta odFocused.

Pero bueno todo solucionado, gracias.
Responder Con Cita
Respuesta



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
cambiar nombres Cosgaya Varios 1 22-11-2005 16:13:42
Cambiar una constante D@byt Varios 3 24-05-2005 16:03:11
cambiar registro JoseQ Varios 6 22-07-2004 20:00:00
Cambiar el wallpaper soul6301 Varios 1 30-05-2004 16:40:23
Cambiar el directorio de la BD marys Conexión con bases de datos 1 18-06-2003 12:29:17


La franja horaria es GMT +2. Ahora son las 09:24:47.


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