Ir al contenido



Foto

TBitmapButton

skin bitmap button componente

  • Por favor identifícate para responder
2 respuestas en este tema

#1 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 824 mensajes
  • LocationMisiones, Argentina

Escrito 08 junio 2015 - 04:34

Hace mucho que quiero compartir este componente. Pero lamentablemente por falta de tiempo no pude dejarlo en una forma aislada y depende en gran parte de una unidad llamada regiones.

Actualmente la pasé en el hilo iniciado por Escafandra, pero dado que sigue un camino algo diferente, creo correcto publicarlo aparte.

 

Este es el código del componente, al cual le quité de la lista de uses a la unidad regiones y lo modifiqué un poquito para que solo tome dos tipos de forma.

 

El componente desciende de TCustomControl y se trata de un botón con cuatro estados posible:

1. Normal

2. Enfocado (hover, cuando el puntero del ratón pasa por encima o se queda encima de él)

3. Pulsado (cuando el botón recibe el evento Click

4. Deshabilitado (grisado, cuando el botón omite los eventos del ratón).

 

El bitmap se arma siguiendo el sentido izquierda - derecha en el orden especificado en la lista y una imagen seguida de otra.

Se sobreentiende que el tamaño del coontrol en pantalla es la cuarta parte del ancho y la altura es la misma respecto de las dimensiones del bitmap.

 

Es probable que al quitarle, partes el componente no funcione a la primera así que si alguien está interesado, me avisa.

 

Espero les sirva

 

Ah... el nombre CRamButton, pueden cambiarlo fácilmente usando el editor, buscan CRaM y le reemplazan por cualquier otro nombre.

 

Saludos


delphi
  1. {
  2. ****************************************************************************************************
  3.  
  4. COMPONENTE CRAM BUTTON versión 1.4
  5.  
  6. Programador: Carlos Micolis
  7. Empresa: CRaM
  8. Fecha: Posadas, Misiones, RA; mayo 2003
  9.  
  10. CRaM Button es un botón que responde a tres acciones de ratón, no responde a teclado.
  11. Cambia la ubicación de la imagen principal a segundo estado, cuando el usuario mueve el puntero
  12. de ratón sobre el control y pasa al tercer estado, cuando el usuario mantiene pulsado el botón
  13. principal del ratón.
  14. Se puede asociar varios estados al mismo control y leerlo desde la propiedad estado, de acuerdo
  15. al estado se despliega el aspecto del botón.
  16. La imagen que constituye los estados del control se pueden ver como una matriz de 4 columnas por
  17. n filas, donde n es la cantidad de estados que se puede asignar al control.
  18.  
  19. ****************************************************************************************************
  20. }
  21. unit CRaMButton;
  22.  
  23. interface
  24.  
  25. uses
  26. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  27.  
  28. type
  29. TCRaMButton = class(TCustomControl)
  30. private
  31. FBitmap: TBitmap; // Bitmap que contiene la gráfica del botón
  32. FContorno: String; // Nombre del archivo de contorno del objeto *.msk
  33. FSoundHoverFile: String; // Nombre del archivo de sonido para MouseHover
  34. FSoundDownFile: String; // Nombre del archivo de sonido para MouseDown
  35. FForma: Byte; // FForma 0: Rectangular, 1: Rectangular redondeada,
  36. // 2: Elíptica, 3: Desde máscara
  37. FRoundH, FRoundV: Byte; // Redondeo Horizontal y Vertical
  38. RG: HRgn; // Región del botón
  39. FEstadosExtra: Byte; // Indica la cantidad de estados
  40. FEstado: Byte; // Indica el estado del botón
  41. // Variables auxiliares utilizadas para controlar el comportamiento del control
  42. Enfocado, AntEnfocado, Pulsado: Boolean;
  43.  
  44. protected
  45. procedure Paint; override;
  46. procedure CMMouseLeave(var Msg:TMessage); message CM_MouseLeave;
  47. procedure CMMouseEnter(var Msg:TMessage); message CM_MouseEnter;
  48. procedure MouseDown(Button:TMouseButton; Shift:TShiftState; X, Y:Integer); override;
  49. procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  50.  
  51. public
  52. constructor Create(AOwner: TComponent); override;
  53. procedure GetBitmap(Value:TBitmap);
  54. procedure GetForma(Value:byte);
  55. procedure GetRoundX(Value:byte);
  56. procedure GetRoundY(Value:byte);
  57. procedure GetContorno(Value: String);
  58. procedure GetEstadosExtra(value:byte);
  59. procedure GetEstado(Value:byte);
  60. destructor Destroy; override;
  61.  
  62. published
  63. property Bitmap: TBitmap read FBitmap write GetBitmap;
  64. property Mask: String read FContorno write GetContorno;
  65. property SoundHoverFile: string read FSoundHoverFile write FSoundHoverFile;
  66. property SoundDownFile: string read FSoundDownFile write FSoundDownFile;
  67. property TipoRegion: Byte read FForma write GetForma;
  68. property RoundX: Byte read FRoundH write GetRoundX;
  69. property RoundY: Byte read FRoundV write GetRoundY;
  70. property Enabled;
  71. property EstadosExtra: Byte read FEstadosExtra write GetEstadosExtra default 0;
  72. property Estado: Byte read FEstado write GetEstado;
  73. property OnClick;
  74. property OnMouseMove;
  75. property OnDblClick;
  76. property OnMouseDown;
  77. property OnMouseUp;
  78. property Visible;
  79. end;
  80.  
  81. procedure Register;
  82.  
  83. // ************************************************************************************************
  84. // Comienzo del área de implemetación
  85. // ************************************************************************************************
  86.  
  87. implementation
  88.  
  89. uses MMSystem;
  90.  
  91. // -------------------------------------------------------------------------------------------------
  92. // Constructor del objeto, los valores son inicializados
  93. constructor TCRaMButton.Create;
  94. begin
  95. inherited Create(AOwner);
  96. Width:=90;
  97. Height:=25;
  98. FBitmap:=TBitmap.Create;
  99. FForma:=0;
  100. FRoundH:=0;
  101. FRoundV:=0;
  102. Enfocado:=False;
  103. AntEnfocado:=True;
  104. Pulsado:=False;
  105. end;
  106.  
  107. // -------------------------------------------------------------------------------------------------
  108. procedure TCRaMButton.GetBitmap;
  109. begin
  110. FBitmap.Assign(Value);
  111. Repaint;
  112. end;
  113.  
  114. // -------------------------------------------------------------------------------------------------
  115. // Toma la región del control de acuerdo con el valor de FForma
  116. procedure TCRaMButton.GetForma;
  117. begin
  118. if Value <> FForma then
  119. begin
  120. FForma:=Value;
  121. case FForma of
  122. 0: RG:=CreateRectRgn(0, 0, Width, Height);
  123. 1: RG:=CreateRoundRectRgn(0, 0, Width, Height, FRoundH, FRoundV);
  124. 2: RG:=CreateEllipticRgn(0, 0, Width, Height);
  125. end;
  126. if FForma < 3 then SetWindowRgn(Handle, RG, True);
  127. Repaint;
  128. end;
  129. end;
  130.  
  131. // -------------------------------------------------------------------------------------------------
  132. // Redondez horizontal
  133. procedure TCRaMButton.GetRoundX;
  134. begin
  135. if Value <> FRoundH then
  136. begin
  137. FRoundH:=Value;
  138. if FForma = 1 then
  139. begin
  140. RG:=CreateRoundRectRgn(0, 0, Width, Height, FRoundH, FRoundV);
  141. SetWindowRgn(Handle, RG, True);
  142. Repaint;
  143. end;
  144. end;
  145. end;
  146.  
  147. // -------------------------------------------------------------------------------------------------
  148. // Redondez vertical
  149. procedure TCRaMButton.GetRoundY;
  150. begin
  151. if Value <> FRoundV then
  152. begin
  153. FRoundV:=Value;
  154. if FForma = 1 then
  155. begin
  156. RG:=CreateRoundRectRgn(0, 0, Width, Height, FRoundH, FRoundV);
  157. SetWindowRgn(Handle, RG, True);
  158. Repaint;
  159. end;
  160. end;
  161. end;
  162.  
  163. // -------------------------------------------------------------------------------------------------
  164. procedure TCRaMButton.GetEstadosExtra;
  165. begin
  166. if Value <> FEstadosExtra then
  167. begin
  168. FEstadosExtra:=Value;
  169. Repaint;
  170. end;
  171. end;
  172.  
  173. // -------------------------------------------------------------------------------------------------
  174. procedure TCRaMButton.GetEstado;
  175. begin
  176. if (Value <> FEstado) then
  177. begin
  178. FEstado:=Value;
  179. Repaint;
  180. end;
  181. end;
  182.  
  183. // -------------------------------------------------------------------------------------------------
  184. // El método Paint es llamado cada vez que uno de los métodos llama a Repaint o bien cuando Windows
  185. // lo haga. Este método es responsable de mostrar los estados de la imagen pricipal asociada al
  186. // control de acuerdo con el estado del ratón sobre el mismo.
  187. // La imagen principal está dividida en tres partes.
  188. // 1. Estado neutro. 2. Estado Enfocado y 3. Estado Pulsado.
  189. // Este corrimiento de la imagen se realiza mediante el uso de la instrucción CopyRect.
  190. procedure TCRaMButton.Paint;
  191. begin
  192. inherited Paint; // Llama al método Paint del ancestro.
  193. if Enabled then // Si habilitado
  194. begin
  195. if Enfocado then // Si Enfocado
  196. if Pulsado // Si pulsado
  197. then Canvas.CopyRect(Rect(0, 0, Width, Height),FBitmap.Canvas,
  198. Rect(Width*2, Height * FEstado, Width*3, Height * (FEstado + 1)))
  199. else Canvas.CopyRect(Rect(0, 0, Width, Height),FBitmap.Canvas,
  200. Rect(Width, Height * FEstado, Width*2, Height * (FEstado + 1)))
  201. else Canvas.CopyRect(Rect(0, 0, Width, Height),FBitmap.Canvas,
  202. Rect(0, Height * FEstado, Width, Height * (FEstado + 1)));
  203. end else Canvas.CopyRect(Rect(0, 0, Width, Height),FBitmap.Canvas,
  204. Rect(Width*3, Height * FEstado, Width*4, Height * (FEstado + 1)));
  205. end;
  206.  
  207. // -------------------------------------------------------------------------------------------------
  208. // Se ejecuta el sonido de presión de botón
  209. procedure TCRaMButton.MouseDown;
  210. begin
  211. if Button=mbLeft then
  212. begin
  213. Pulsado:=True;
  214. sndPlaySound(pchar(FSoundDownFile), snd_Async or snd_NoDefault);
  215. Repaint;
  216. end;
  217. end;
  218.  
  219. // -------------------------------------------------------------------------------------------------
  220. // Si el botón pulsado es el principal (izquierdo) entonces se procede al cambio de estado
  221. // consistente en un valor entre 0 y FEstadosExtra.
  222. procedure TCRaMButton.MouseUp;
  223. begin
  224. if Button=mbLeft then
  225. begin
  226. if FEstado < FEstadosExtra then Inc(FEstado) else FEstado:= 0;
  227. Pulsado:= False;
  228. Repaint;
  229. end;
  230. end;
  231.  
  232. // -------------------------------------------------------------------------------------------------
  233. procedure TCRaMButton.CMMouseLeave;
  234. begin
  235. Enfocado:=False;
  236. Repaint;
  237. Cursor:= crDefault;
  238. end;
  239.  
  240. // -------------------------------------------------------------------------------------------------
  241. procedure TCRaMButton.CMMouseEnter;
  242. begin
  243. Enfocado:=True;
  244. Cursor:= crHandPoint;
  245. sndPlaySound(pchar(FSoundHoverFile), snd_Async or snd_NoDefault);
  246. Repaint;
  247. end;
  248.  
  249. // -------------------------------------------------------------------------------------------------
  250. destructor TCRaMButton.Destroy;
  251. begin
  252. inherited Destroy;
  253. FBitmap.Free;
  254. end;
  255.  
  256. // -------------------------------------------------------------------------------------------------
  257. procedure Register;
  258. begin
  259. RegisterComponents('CRaM', [TCRaMButton]);
  260. end;
  261.  
  262. end.

 
 
 
Imágenes de ejemplo:
f_Ayudante.jpg
btReservado.jpg
4567_90193538783d1a36d2050d7d6354167ebbbe27e5.jpg
4569_ecc38675efb8f3c172153055ad162756eafcebf6.jpg

 

Este es un programa de ejemplo con regiones en la ventana. El error deben omitir, pues se trata de que no encuentra el alias de la base de datos.
Archivo adjunto  muestra.7z   1,33MB   10 descargas

 

 


  • 2

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.042 mensajes
  • LocationMéxico

Escrito 08 junio 2015 - 09:03

Hola

Me gusta mucho el desarrollo de componentes, ahora mismo estoy intentando hacer uno para firemonkey, pero me parece que es una empresa un poco compleja y aún estoy en pañales, ya veremos si logro sacarlo  :smiley:.

 

Lo que normalmente hago son objetos de proposito particular y me siento cómodo haciendolos.

 

 

Saludos


  • 0

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 824 mensajes
  • LocationMisiones, Argentina

Escrito 09 junio 2015 - 10:30

Hola

Me gusta mucho el desarrollo de componentes, ahora mismo estoy intentando hacer uno para firemonkey, pero me parece que es una empresa un poco compleja y aún estoy en pañales, ya veremos si logro sacarlo  :smiley:.

 

Lo que normalmente hago son objetos de proposito particular y me siento cómodo haciendolos.

 

 

Saludos

 

Me parece excelente idea.

Te cuento que pasé este componente y la unidad regiones, que menciono, a Lazarus. Tuve un problema con los arreglos dinámicos y pude solucionarlo ggracias a la ayuda de un colega (en un foro que no recuerdo).

Pero, me arriesgo a asegurarte que en Firemonkey con todo lo bueno que tiene para control de la imagen, será superior. Sobre todo teniendo en cuenta los efectos sobre la imagen y las animaciones, que de por sí solas ya superan a un componente como éste.

 

Saludos


  • 0





Etiquetado también con una o más de estas palabras: skin, bitmap, button, componente