• Domingo 22 de Diciembre de 2024, 13:57

Autor Tema:  Listbox Degradado  (Leído 1625 veces)

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Listbox Degradado
« en: Sábado 14 de Enero de 2006, 15:49 »
0
Hola,
Participo por primera vez en el Foro, espero conocer mucha gente por aca y valorar vuestra experiencia en Delphi.

No hace mucho me preguntaba como obtener un color diferente de selección en un ListBox o ComboBox independientemente de aquel que viene por defecto en Windows-Apariencia, pero creo que debería de empezar a preguntar ¿Como puedo crear un rectángulo pequeño CON UN COLOR DEGRADADO y sin borde?, ya que obteniendo esta respuesta quizá lo pueda acomodar a la investigación de modificar la selección que presentan los componentes ListBox o ComboBox y convertirlo en degradado , no se si me estoy liando, pero la finalidad es obtener un ListBox, ComboBox o un Componente Menú tipo del Programa Super Utilities 6.0 con selecciones degradadas al mover el mouse.
Alguna sugerencia?
Un saludo.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Listbox Degradado
« Respuesta #1 en: Domingo 15 de Enero de 2006, 15:28 »
0
Primero habría que hacer una funcion que permita hacer degradados de colores sobre un Canvas ya uqe delphi solo tiene para pegar colores Solidos (Creo).
Y lo segundo, bastante más complicado, sería modificar el repintado de alguno de los componentes y crear uno nuevo tipo TDegradadoListBox.

Recien revise el codigo fuente de TListBox......
Este es el procedimiento uqe lo dibuja:
Código: Text
  1.  
  2. procedure PaintListBox;
  3.   var
  4.     DrawItemMsg: TWMDrawItem;
  5.     MeasureItemMsg: TWMMeasureItem;
  6.     DrawItemStruct: TDrawItemStruct;
  7.     MeasureItemStruct: TMeasureItemStruct;
  8.     R: TRect;
  9.     Y, I, H, W: Integer;
  10.   begin
  11.     { Initialize drawing records }
  12.     DrawItemMsg.Msg := CN_DRAWITEM;
  13.     DrawItemMsg.DrawItemStruct := @DrawItemStruct;
  14.     DrawItemMsg.Ctl := Handle;
  15.     DrawItemStruct.CtlType := ODT_LISTBOX;
  16.     DrawItemStruct.itemAction := ODA_DRAWENTIRE;
  17.     DrawItemStruct.itemState := 0;
  18.     DrawItemStruct.hDC := Message.DC;
  19.     DrawItemStruct.CtlID := Handle;
  20.     DrawItemStruct.hwndItem := Handle;
  21.  
  22.     { Intialize measure records }
  23.     MeasureItemMsg.Msg := CN_MEASUREITEM;
  24.     MeasureItemMsg.IDCtl := Handle;
  25.     MeasureItemMsg.MeasureItemStruct := @MeasureItemStruct;
  26.     MeasureItemStruct.CtlType := ODT_LISTBOX;
  27.     MeasureItemStruct.CtlID := Handle;
  28.  
  29.     { Draw the listbox }
  30.     Y := 0;
  31.     I := TopIndex;
  32.     GetClipBox(Message.DC, R);
  33.     H := Height;
  34.     W := Width;
  35.     while Y < H do
  36.     begin
  37.       MeasureItemStruct.itemID := I;
  38.       if I < Items.Count then
  39.         MeasureItemStruct.itemData := Longint(Pointer(Items.Objects[I]));
  40.       MeasureItemStruct.itemWidth := W;
  41.       MeasureItemStruct.itemHeight := FItemHeight;
  42.       DrawItemStruct.itemData := MeasureItemStruct.itemData;
  43.       DrawItemStruct.itemID := I;
  44.       Dispatch(MeasureItemMsg);
  45.       DrawItemStruct.rcItem := Rect(0, Y, MeasureItemStruct.itemWidth,
  46.         Y + Integer(MeasureItemStruct.itemHeight));
  47.       Dispatch(DrawItemMsg);
  48.       Inc(Y, MeasureItemStruct.itemHeight);
  49.       Inc(I);
  50.       if I >= Items.Count then break;
  51.     end;
  52.   end;
  53.  
  54.  

Bienvenido al Foro :hola: