home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / cButtonBar2169251232009.psc / cButtonBar / cButtonbar.cls < prev   
Text File  |  2009-12-03  |  111KB  |  3,045 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cButtonBar"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'Clase:       cButtonBar
  15. 'Autor:       Esteban Gonzalez
  16. 'Fecha:       05 de diciembre de 2007
  17. 'Modificado:  03 de diciembre de 2009
  18. 'Descripcion: Clase que emula una barra de botones
  19. '             horizontales.
  20. '             Permite el uso de skins para los botones.
  21.  
  22. Option Explicit
  23.  
  24. Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
  25. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal Bytelen As Long)
  26. Private Declare Sub FillMemory Lib "kernel32.dll" Alias "RtlFillMemory" (ByRef Destination As Any, ByVal Length As Long, ByVal Fill As Byte)
  27. Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  28. Private Const VK_TAB = &H9
  29. Private Const VK_RETURN As Long = &HD
  30. Private Const VK_SPACE As Long = &H20
  31.  
  32. 'Funciones para averiguar si el mouse esta sobre el picturebox.
  33. Private Declare Function GetFocusAPI Lib "user32.dll" Alias "GetFocus" () As Long
  34. Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
  35. Private Declare Function ReleaseCapture Lib "user32" () As Long
  36. Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  37.  
  38.  
  39. Private Declare Function GetStockObject Lib "gdi32.dll" (ByVal nIndex As Long) As Long
  40. Private Const BLACK_BRUSH As Long = 4
  41. Private Const DKGRAY_BRUSH As Long = 3
  42. Private Const WHITE_BRUSH As Long = 0
  43. Private Declare Function GetSysColor Lib "user32.dll" (ByVal nIndex As Long) As Long
  44. Private Declare Function GetSysColorBrush Lib "user32.dll" (ByVal nIndex As Long) As Long
  45. Private Const COLOR_BTNFACE As Long = 15
  46. Private Const COLOR_3DFACE As Long = COLOR_BTNFACE
  47. Private Const COLOR_BTNHIGHLIGHT As Long = 20
  48. Private Const COLOR_3DHILIGHT As Long = COLOR_BTNHIGHLIGHT
  49. Private Const COLOR_3DHIGHLIGHT As Long = COLOR_BTNHIGHLIGHT
  50. Private Const COLOR_BTNSHADOW As Long = 16
  51. Private Const COLOR_3DSHADOW As Long = COLOR_BTNSHADOW
  52.  
  53. Private Declare Function GetCurrentObject Lib "gdi32.dll" (ByVal hDC As Long, ByVal uObjectType As Long) As Long
  54. Private Const OBJ_BITMAP As Long = 7
  55. Private Const OBJ_BRUSH As Long = 2
  56. Private Const OBJ_FONT As Long = 6
  57. Private Const OBJ_PEN As Long = 1
  58.  
  59. Private Declare Function SetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal x1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  60. Private Declare Function OffsetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
  61. Private Declare Function PtInRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
  62.  
  63. Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hDC As Long) As Long
  64. Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hDC As Long, ByVal hObject As Long) As Long
  65. Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
  66. Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hDC As Long) As Long
  67.  
  68. Private Declare Function BeginPath Lib "gdi32.dll" (ByVal hDC As Long) As Long
  69. Private Declare Function EndPath Lib "gdi32.dll" (ByVal hDC As Long) As Long
  70. Private Declare Function SelectClipPath Lib "gdi32.dll" (ByVal hDC As Long, ByVal iMode As Long) As Long
  71. Private Declare Function SelectClipRgn Lib "gdi32.dll" (ByVal hDC As Long, ByVal hRgn As Long) As Long
  72. Private Const RGN_AND As Long = 1
  73. Private Const RGN_COPY As Long = 5
  74.  
  75.  
  76. 'FUNCIONES SOBRE EL MODO Y OBJETOS DEL DC
  77. Private Declare Function GetBkMode Lib "gdi32.dll" (ByVal hDC As Long) As Long
  78. Private Declare Function SetBkMode Lib "gdi32.dll" (ByVal hDC As Long, ByVal nBkMode As Long) As Long
  79. Private Declare Function SetBkColor Lib "gdi32.dll" (ByVal hDC As Long, ByVal crColor As Long) As Long
  80. Private Declare Function SetTextColor Lib "gdi32.dll" (ByVal hDC As Long, ByVal crColor As Long) As Long
  81. Private Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Long) As Long
  82. Private Declare Function CreatePen Lib "gdi32.dll" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  83. Private Declare Function GetBkColor Lib "gdi32.dll" (ByVal hDC As Long) As Long
  84. Private Declare Function GetTextColor Lib "gdi32.dll" (ByVal hDC As Long) As Long
  85.  
  86. Private Const OPAQUE As Long = 2
  87. Private Const TRANSPARENT As Long = 1
  88. Private Const PS_SOLID As Long = 0
  89. Private Const PS_DASH As Long = 1
  90. Private Const PS_DOT As Long = 2
  91.  
  92.  
  93. 'FUNCIONES DE TEXTO
  94. Private Declare Function DrawText Lib "user32.dll" Alias "DrawTextA" (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, ByRef lpRect As RECT, ByVal wFormat As Long) As Long
  95. Private Declare Function DrawTextEx Lib "user32.dll" Alias "DrawTextExA" (ByVal hDC As Long, ByVal lpsz As String, ByVal n As Long, ByRef lpRect As RECT, ByVal un As Long, ByRef lpDrawTextParams As Any) As Long
  96.  
  97. Private Const DT_LEFT As Long = &H0&
  98. Private Const DT_RIGHT As Long = &H2&
  99. Private Const DT_TOP As Long = &H0&
  100. Private Const DT_VCENTER As Long = &H4&
  101. Private Const DT_CENTER As Long = &H1&
  102. Private Const DT_BOTTOM As Long = &H8&
  103. Private Const DT_CALCRECT As Long = &H400&
  104. Private Const DT_EXPANDTABS As Long = &H40&
  105. Private Const DT_SINGLELINE As Long = &H20&
  106. Private Const DT_MULTILINE As Long = (&H1&)
  107. Private Const DT_END_ELLIPSIS As Long = &H8000&
  108. Private Const DT_NOPREFIX As Long = &H800&
  109. Private Const DT_WORD_ELLIPSIS As Long = &H40000
  110.  
  111. 'FUNCIONES PARA DIBUJAR LOS BOTONES COMUNES
  112. Private Declare Function DrawFocusRectAPI Lib "user32.dll" Alias "DrawFocusRect" (ByVal hDC As Long, ByRef lpRect As RECT) As Long
  113. Private Declare Function DrawFrameControl Lib "user32.dll" (ByVal hDC As Long, ByRef lpRect As RECT, ByVal un1 As Long, ByVal un2 As Long) As Long
  114. Private Const DFC_BUTTON As Long = 4
  115. Private Const DFCS_BUTTONPUSH As Long = &H10
  116. Private Const DFCS_FLAT As Long = &H4000
  117. Private Const DFCS_HOT As Long = &H1000
  118. Private Const DFCS_INACTIVE As Long = &H100
  119. Private Const DFCS_PUSHED As Long = &H200
  120. Private Const DFCS_CHECKED As Long = &H400
  121. Private Const DFCS_ADJUSTRECT As Long = &H2000
  122.  
  123. Private Declare Function DrawEdge Lib "user32.dll" (ByVal hDC As Long, ByRef qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long
  124. Private Const BDR_INNER As Long = &HC
  125. Private Const BDR_OUTER As Long = &H3
  126. Private Const BDR_RAISED As Long = &H5
  127. Private Const BDR_RAISEDINNER As Long = &H4
  128. Private Const BDR_RAISEDOUTER As Long = &H1
  129. Private Const BDR_SUNKEN As Long = &HA
  130. Private Const BDR_SUNKENINNER As Long = &H8
  131. Private Const BDR_SUNKENOUTER As Long = &H2
  132. Private Const EDGE_BUMP As Long = (BDR_RAISEDOUTER Or BDR_SUNKENINNER)
  133. Private Const EDGE_ETCHED As Long = (BDR_SUNKENOUTER Or BDR_RAISEDINNER)
  134. Private Const EDGE_RAISED As Long = (BDR_RAISEDOUTER Or BDR_RAISEDINNER)
  135. Private Const EDGE_SUNKEN As Long = (BDR_SUNKENOUTER Or BDR_SUNKENINNER)
  136. Private Const EDGE_FLAT As Long = BDR_RAISEDINNER
  137. Private Const EDGE_FLAT_DOWN As Long = BDR_SUNKENOUTER
  138. Private Const BF_ADJUST As Long = &H2000
  139. Private Const BF_BOTTOM As Long = &H8
  140. Private Const BF_FLAT As Long = &H4000
  141. Private Const BF_LEFT As Long = &H1
  142. Private Const BF_RIGHT As Long = &H4
  143. Private Const BF_TOP As Long = &H2
  144. Private Const BF_SOFT As Long = &H1000
  145. Private Const BF_RECT As Long = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
  146.  
  147.  
  148. 'FUNCIONES DEL BITMAP
  149. Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  150. Private Declare Function CreateBitmap Lib "gdi32.dll" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, ByRef lpBits As Any) As Long
  151. 'Nota: Cambiar el valor Byval de LpVoid as ByRef en CreateDibSection
  152. Private Declare Function CreateDIBSection Lib "gdi32.dll" (ByVal hDC As Long, ByRef pBitmapInfo As BITMAPINFO, ByVal un As Long, ByRef lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
  153. Private Declare Function DrawState Lib "user32.dll" Alias "DrawStateA" (ByVal hDC As Long, ByVal HBrush As Long, ByVal lpDrawStateProc As Long, ByVal lParam As Long, ByVal wParam As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal un As Long) As Long
  154. Private Declare Function CreateDIBPatternBrushPt Lib "gdi32.dll" (ByRef lpPackedDIB As Any, ByVal iUsage As Long) As Long
  155. Private Declare Function GetObjectAPI Lib "gdi32.dll" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, ByRef lpObject As Any) As Long
  156.  
  157. Private Const DST_BITMAP As Long = &H4
  158. Private Const DST_ICON As Long = &H3
  159. Private Const DST_TEXT As Long = &H1
  160. Private Const DSS_DISABLED As Long = &H20
  161. Private Const DSS_NORMAL As Long = &H0
  162. Private Const DSS_MONO As Long = &H80
  163.  
  164.  
  165. Private Type BITMAP
  166.     bmType As Long
  167.     bmWidth As Long
  168.     bmHeight As Long
  169.     bmWidthBytes As Long
  170.     bmPlanes As Integer
  171.     bmBitsPixel As Integer
  172.     bmBits As Long
  173. End Type
  174.  
  175. Private Const BI_RGB As Long = 0&
  176. Private Const DIB_RGB_COLORS As Long = 0
  177.  
  178. Private Type RGBQUAD
  179.     rgbBlue As Byte
  180.     rgbGreen As Byte
  181.     rgbRed As Byte
  182.     rgbReserved As Byte
  183. End Type
  184.  
  185. Private Type RGBStruct
  186.  Red As Byte
  187.  Green As Byte
  188.  Blue As Byte
  189.  AlphaChannel As Byte
  190. End Type
  191.  
  192. Private Type BITMAPINFOHEADER
  193.     biSize As Long
  194.     biWidth As Long
  195.     biHeight As Long
  196.     biPlanes As Integer
  197.     biBitCount As Integer
  198.     biCompression As Long
  199.     biSizeImage As Long
  200.     biXPelsPerMeter As Long
  201.     biYPelsPerMeter As Long
  202.     biClrUsed As Long
  203.     biClrImportant As Long
  204. End Type
  205.  
  206. Private Type BITMAPINFO
  207.     bmiHeader As BITMAPINFOHEADER
  208.     bmiColors(4) As Long
  209. End Type
  210.  
  211. 'FUNCIONES PARA DIBUJAR SOBRE EL DC O BITMAP
  212. Private Declare Function StretchBlt Lib "gdi32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
  213. Private Declare Function StretchDIBits Lib "gdi32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, ByRef lpBits As Any, ByRef lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long
  214. Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  215. Private Declare Function FrameRect Lib "user32.dll" (ByVal hDC As Long, ByRef lpRect As RECT, ByVal HBrush As Long) As Long
  216. Private Declare Function FillRect Lib "user32.dll" (ByVal hDC As Long, ByRef lpRect As RECT, ByVal HBrush As Long) As Long
  217. Private Declare Function Rectangle Lib "gdi32.dll" (ByVal hDC As Long, ByVal x1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  218. Private Declare Function Ellipse Lib "gdi32.dll" (ByVal hDC As Long, ByVal x1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  219. Private Declare Function Polygon Lib "gdi32.dll" (ByVal hDC As Long, ByVal lpPoint As Long, ByVal nCount As Long) As Long
  220. Private Declare Function Polyline Lib "gdi32.dll" (ByVal hDC As Long, ByRef lpPoint As POINTAPI, ByVal nCount As Long) As Long
  221. Private Declare Function APIGetPixel Lib "gdi32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long) As Long
  222. Private Declare Function SetPixel Lib "gdi32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
  223.  
  224. Private Declare Function ExtFloodFill Lib "gdi32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long, ByVal wFillType As Long) As Long
  225. Private Const FLOODFILLBORDER As Long = 0
  226. Private Const FLOODFILLSURFACE As Long = 1
  227.  
  228. Private Type RECT
  229.     Left As Long
  230.     Top As Long
  231.     Right As Long
  232.     Bottom As Long
  233. End Type
  234.  
  235. Private Type POINTAPI
  236.  X As Long
  237.  Y As Long
  238. End Type
  239.  
  240. Private Type SafeArrayBound
  241.     cElements As Long
  242.     lLbound As Long
  243. End Type
  244.  
  245. Private Type SAFEARRAY1D
  246.     cDims As Integer
  247.     fFeatures As Integer
  248.     cbElements As Long
  249.     cLocks As Long
  250.     pvData As Long
  251.     Bounds(0 To 0) As SafeArrayBound
  252. End Type
  253.  
  254. Private Type SAFEARRAY2D
  255.     cDims As Integer
  256.     fFeatures As Integer
  257.     cbElements As Long
  258.     cLocks As Long
  259.     pvData As Long
  260.     Bounds(0 To 1) As SafeArrayBound
  261. End Type
  262.  
  263. 'FUNCIONES PARA TRABAJAR CON CODIGO ASSEMBLER
  264. 'Nota: Para compilar este Programa en VB6, cambiar las
  265. 'referencias Lib "msvbvm50.dll" por "msvbvm60.dll"
  266. Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long
  267. Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  268.  
  269.  
  270. 'Constantes que definen el estado de la barra.
  271. Private Const fMASKCOLOR = 1
  272. Private Const fAUTOSIZE = 2
  273. Private Const fDRAWFOCUSRECT = 4
  274.  
  275. 'Constantes para identificar los botones.
  276. Private Const BUTTON_PREVIOUS = -2
  277. Private Const BUTTON_NEXT = -1
  278. Private Const NO_BUTTON = -3
  279.  
  280. 'Constante que define el margen entre el texto o icono
  281. 'y los bordes.
  282. Private Const MARGINSIZE = 3
  283.  
  284. 'Constantes que definen estados internos de los botones.
  285. Private Const BTN_VISIBLE = 1
  286. Private Const BTN_SHOWABLE = 2
  287. Private Const BTN_FULLVISIBLE = BTN_VISIBLE Or BTN_SHOWABLE
  288.  
  289. 'Constante que define el color de la sombra del icono.
  290. Private Const SHADOW_COLOR = &HC0C0C0
  291.  
  292. 'Constantes de enumeracion que representan las posibles
  293. 'alineaciones de texto o imagen.
  294. Public Enum eAlignment
  295.  eLeft = 1
  296.  eRight = 2
  297.  eHCenter = 4
  298.  eTop = 8
  299.  eBottom = 16
  300.  eVCenter = 32
  301. End Enum
  302.  
  303. 'Constantes de enumeracion que representan los tipos de
  304. 'botones de la barra.
  305. Public Enum eButtonTypes
  306.  eSeparator = 1
  307.  eButton = 2
  308.  eCheck = 4
  309.  'eCheck = 0100 en binario
  310.  'eOption = 1100 en binario
  311.  'Implica que el tipo eOption comparte un bit con el
  312.  'tipo eCheck, pero no con eSeparator o eButton.
  313.  eOption = 12
  314. End Enum
  315.  
  316. 'Constantes de enumeracion que representan los estilos
  317. 'de un boton.
  318. Public Enum eButtonStyles
  319.  eFlat = 1
  320.  eHot = 2
  321.  e3D = 3
  322.  eOwnerDrawn = 4
  323.  eSkinned = 5
  324. End Enum
  325.  
  326.  
  327. 'Constantes de enumeracion que reprensentan los estados
  328. 'de un boton.
  329. Public Enum eButtonStates
  330.  eNormal = 0
  331.  eFocused = 2
  332.  eOver = 1
  333.  eDown = 4
  334.  eDisabled = 8
  335. End Enum
  336.  
  337. 'Constantes para los offset de la skin de acuerdo al
  338. 'estado del boton.
  339. Private Const BTN_SKN_NORMAL  As Long = 0
  340. Private Const BTN_SKN_FOCUSED  As Long = 1
  341. Private Const BTN_SKN_OVER  As Long = 2
  342. Private Const BTN_SKN_DOWN  As Long = 3
  343. Private Const BTN_SKN_DISABLED  As Long = 4
  344.  
  345. 'Constantes de enumeracion para los tipo de relleno del
  346. 'boton.
  347. Public Enum eFillMode
  348.  eVerticalGradient
  349.  eHorizontalGradient
  350.  eTransparent
  351.  eSolid
  352.  ePatternFill
  353.  eBlit
  354.  eStretchBlit
  355. End Enum
  356.  
  357. 'Tipo de datos que almacena la informacion de cada boton.
  358. Private Type tButton
  359.  Text As String
  360.  Icon As StdPicture
  361.  Style As eButtonStyles
  362.  State As eButtonStates
  363.  ButtonType As eButtonTypes
  364.  TextAlign As eAlignment
  365.  IconAlign As eAlignment
  366.  Tooltip As String
  367.  Left As Long
  368.  Top As Long
  369.  Width As Long
  370.  Height As Long
  371.  'Funciona como la skin gral., tiene los 5 estados en
  372.  'la imagen.
  373.  Skin As StdPicture
  374.  'Maskcolor de la skin y del Icon.
  375.  MaskColor As Long
  376.  Flags As Long
  377. End Type
  378.  
  379. Private Type tDCData
  380.  DC As Long
  381.  OldBmp As Long
  382.  OldPen As Long
  383.  oldBrush As Long
  384.  OldFont As Long
  385.  CurBmp As Long
  386.  CurPen As Long
  387.  CurBrush As Long
  388.  CurFont As Long
  389.  HasBmp As Boolean
  390. End Type
  391.  
  392. Private WithEvents m_Container As PictureBox
  393. Attribute m_Container.VB_VarHelpID = -1
  394. Private WithEvents m_Font As StdFont
  395. Attribute m_Font.VB_VarHelpID = -1
  396. 'Indica el DC que contiene a la skin.
  397. Private m_SkinDC As tDCData
  398. 'Contiene el DC del picturebox (solo por simplicidad)
  399. Private m_DC As tDCData
  400. 'Contiene el DC de la mascara de la skin.
  401. Private m_SkinMaskDC As tDCData
  402. 'Contiene el DC de BackBuffer
  403. Private m_BackBuffer As tDCData
  404. 'Contiene un DC del tama±o del picturebox para dibujar
  405. 'las skins particulares de los botones.
  406. Private m_ButtonSkinDC As tDCData
  407. 'Indica la imagen original del Canvas.
  408. Private m_Skin As StdPicture
  409. 'Indica el Ancho de la Skin.
  410. Private m_SkinWidth As Long
  411. 'Indica el Alto de la Skin.
  412. Private m_SkinHeight As Long
  413. 'Indican el ancho y alto del borde de la skin.
  414. Private m_SkinBorderWidth(5) As Long
  415. Private m_SkinBorderHeight(5) As Long
  416. 'Array que contiene los datos de los botones y separadores
  417. Private m_Buttons() As tButton
  418. 'Cant. de botones y separadores que hay en la barra
  419. Private m_nButtons As Long
  420. 'Indica el color de fondo de la barra.
  421. Private m_BackColor As Long
  422. 'Indica el color primario de fondo de los botones para los estados
  423. 'Normal, Focused, Disabled, Over y Down.
  424. Private m_BackColor1(5) As Long
  425. 'Indica el color secundario de fondo de los botones para los estados
  426. 'Normal, Focused, Disabled, Over y Down.
  427. Private m_BackColor2(5) As Long
  428. 'Indica el color primario de texto de los botones para los estados
  429. 'Normal, Disabled, Over y Down.
  430. Private m_TextColor1(5) As Long
  431. 'Indica el color secundario de texto de los botones para los estados
  432. 'Normal, Focused, Disabled, Over y Down.
  433. Private m_TextColor2(5) As Long
  434. 'Indica el color de borde de los botones para los estados
  435. 'Normal, Focused, Disabled, Over y Down.
  436. Private m_BorderColor(5) As Long
  437. 'Indica el ancho del borde.
  438. Private m_BorderWidth As Long
  439. 'Indica las banderas que estan activadas.
  440. Private m_BarFlags As Long
  441. 'Indica el color de transparencia de la skin.
  442. Private m_MaskColor As Long
  443. 'Indica cual es el boton que esta presionado por el mouse.
  444. Private m_ButtonDown As Long
  445. 'Indica el boton sobre el cual se encuentra el mouse.
  446. Private m_ButtonOver As Long
  447. 'Indica el boton sobre el cual se encuentra el foco.
  448. Private m_ButtonFocus As Long
  449. 'Variables que contienen los botones Anterior y Siguiente
  450. Private m_ButtonPrevious As tButton
  451. Private m_ButtonNext As tButton
  452. 'Indica el modo en que se dibuja la skin del boton
  453. Private m_FillMode As Long
  454. 'Indica el efecto que tendra el texto del boton
  455. Private m_FontEffect As Long
  456. 'Indican el alto y ancho por defecto de los botones.
  457. Private m_DefaultButtonWidth As Long
  458. Private m_DefaultButtonHeight As Long
  459. 'Indica el espacio horizontal que hay entre cada bot≤n.
  460. Private m_HorizontalButtonGap As Long
  461. 'Indica el espacio horizontal que hay entre el bot≤n y la barra.
  462. Private m_VerticalButtonGap As Long
  463. 'Contiene el patron con el que pintamos el fondo de un
  464. 'boton Check que no usa Skin.
  465. Private m_CheckPatternBrush As Long
  466. 'Indica si la llamada para dibujar los botones proviene
  467. 'del procedimiento RedrawBar (es para evitar el flickering).
  468. Private m_RedrawAllButtons As Boolean
  469. 'Indica si realmente actualizamos la barra o no en el
  470. 'picturebox.
  471. Private m_LockUpdate As Boolean
  472. 'Indica el primer boton visible.
  473. Private m_FirstVisibleButton As Long
  474. 'Indica la cantidad de botones visibles.
  475. Private m_nVisibleButtons As Long
  476.  
  477. Public Event Click(Index As Long)
  478. Public Event MouseDown(Index As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
  479. Public Event MouseMove(Index As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
  480. Public Event MouseUp(Index As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
  481. Public Event MouseEnter(Index As Long)
  482. Public Event MouseLeave(Index As Long)
  483. Public Event GotFocus(Index As Long)
  484. Public Event LostFocus(Index As Long, Desc As String)
  485. Public Event Paint() '(Index As Long)
  486. Public Event Resize() '(Index As Long)
  487. Public Event KeyDown(Index As Long, KeyCode As Integer, Shift As Integer)
  488. Public Event KeyUp(Index As Long, KeyCode As Integer, Shift As Integer)
  489. Public Event KeyPressed(Index As Long, KeyAscii As Integer)
  490.  
  491.  
  492. '=============================================
  493. 'DEFINICION DE METODOS PUBLICOS
  494. '=============================================
  495.  
  496. 'Crea un nuevo boton para la barra.
  497. 'Devuelve el indice del boton.
  498. Public Function AddButton(BtnType As eButtonTypes, Text As String, Optional Style As eButtonStyles = eFlat, Optional Tooltip As String = "", Optional Img As StdPicture, Optional TextAlignment As eAlignment = eRight Or eVCenter, Optional ImgAlignment As eAlignment = eLeft Or eVCenter, Optional State As eButtonStates = eNormal) As Long
  499.  Dim dx As Long, dy As Long
  500.  
  501.  'Si la barra no fue creada o fue destruida, no agregamos
  502.  'ningun boton.
  503.  If (m_Container Is Nothing) Then
  504.   AddButton = -1
  505.   Exit Function
  506.  End If
  507.  ReDim Preserve m_Buttons(m_nButtons) As tButton
  508.  With m_Buttons(m_nButtons)
  509.   .Text = Text
  510.   .Tooltip = Tooltip
  511.   .TextAlign = TextAlignment
  512.   .IconAlign = ImgAlignment
  513.   .State = State
  514.   .Style = Style
  515.   .ButtonType = BtnType
  516.   If (m_BarFlags And fAUTOSIZE) <> fAUTOSIZE Then
  517.    .Height = m_DefaultButtonHeight
  518.    .Width = m_DefaultButtonWidth
  519.   Else
  520.    If Not (Img Is Nothing) Then
  521.     dx = m_Container.ScaleX(Img.Width)
  522.     dy = m_Container.ScaleY(Img.Height)
  523.    End If
  524.    dx = dx + m_Container.TextWidth(.Text) + MARGINSIZE * 2
  525.    dy = dy + m_Container.TextHeight(.Text) + MARGINSIZE * 2
  526.    If Style = eSkinned Then
  527.     dx = dx + m_SkinBorderWidth(0) * 2
  528.     dy = dy + m_SkinBorderHeight(0) * 2
  529.    Else
  530.     dx = dx + m_BorderWidth * 2
  531.     dy = dy + m_BorderWidth * 2
  532.    End If
  533.    .Width = dx
  534.    .Height = dy
  535.   End If
  536.   .Top = m_VerticalButtonGap
  537.   .Left = m_HorizontalButtonGap
  538.   If m_nButtons > 0 Then
  539.    .Left = .Left + m_Buttons(m_nButtons - 1).Left + m_Buttons(m_nButtons - 1).Width
  540.   End If
  541.   .Flags = BTN_FULLVISIBLE
  542.   If BtnType = eSeparator Then
  543.    Set .Skin = Img
  544.    .Width = m_Container.ScaleX(.Skin.Width)
  545.    .Height = m_Container.ScaleY(.Skin.Height)
  546.   Else
  547.    Set .Icon = Img
  548.   End If
  549.  End With
  550.  AddButton = m_nButtons
  551. ' Debug.Print "AddButton " & m_nButtons & " - m_FirstVisibleButton = " & m_FirstVisibleButton
  552.  m_nButtons = m_nButtons + 1
  553. '' Debug.Print "RedrawBar de AddButton"
  554. '' RedrawBar
  555. ''No es necesario redibujar toda la barra, ya que el
  556. ''boton se agrega ultimo en la barra, asi que los botones
  557. ''anteriores ya han sido dibujados.
  558. ' DrawButton m_nButtons - 1
  559.  CheckVisibleButtons
  560. End Function
  561.  
  562. 'Elimina un boton o un separador de la barra.
  563. 'Devuelve la cantidad de botones y separadores.
  564. Public Function RemoveButton(Indice As Long) As Long
  565.  Dim i As Long
  566.  
  567.  If Indice >= 0 And Indice < m_nButtons Then
  568.   If Indice < m_nButtons Then
  569.    'Reordenamos el array.
  570. '   CopyMemory m_Buttons(Indice), m_Buttons(Indice + 1), (m_nButtons - Indice) * Len(m_Buttons(Indice))
  571.    For i = Indice To m_nButtons - 2
  572.     m_Buttons(i) = m_Buttons(i + 1)
  573.    Next i
  574.   End If
  575.   m_nButtons = m_nButtons - 1
  576.   If m_nButtons > 1 Then
  577.    ReDim Preserve m_Buttons(m_nButtons) As tButton
  578.   End If
  579.   RemoveButton = m_nButtons
  580. '  Debug.Print "RedrawBar de RemoveButton"
  581.   Debug.Print "RemoveButton - M_FIRSTVISIBLEBUTTON = " & m_FirstVisibleButton
  582.   Debug.Print "RemoveButton - Indice = " & Indice
  583.   If Indice < m_FirstVisibleButton Then
  584.    m_FirstVisibleButton = m_FirstVisibleButton - 1
  585.    UpdateButtonPos Indice, 0, False
  586.   Else
  587.    If Indice = m_FirstVisibleButton Then
  588.     m_Buttons(Indice).Left = m_HorizontalButtonGap
  589.     UpdateButtonPos Indice + 1, m_nButtons - 1, True
  590.    Else
  591.     UpdateButtonPos Indice, m_nButtons - 1, True
  592.    End If
  593.   End If
  594.   CheckVisibleButtons
  595.   RedrawBar
  596.  End If
  597. End Function
  598.  
  599. 'Cambia de posicion el boton dado.
  600. 'Devuelve la cant. de botones en la barra.
  601. Public Function MoveButton(Index As Long, Position As Long) As Long
  602.  Dim Temp As tButton, i As Long
  603.  
  604.  'Si el indice del boton es valido.
  605.  If Index >= 0 And Index < m_nButtons Then
  606.   'Si la nueva posicion es valida.
  607.   If Position >= 0 And Position < m_nButtons Then
  608.    MoveButton = m_nButtons
  609.    'Si es la misma posicion, no hacemos nada, salimos.
  610.    If Index = Position Then
  611.     Exit Function
  612.    'Sino si la posicion es hacia la derecha
  613.    ElseIf Index < Position And Index < (m_nButtons - 1) Then
  614.     'Movemos el boton hacia la derecha
  615.     Temp = m_Buttons(Index)
  616.     For i = Index + 1 To Position
  617.      m_Buttons(i - 1) = m_Buttons(i)
  618.     Next i
  619.     m_Buttons(Position) = Temp
  620.     If Position >= m_FirstVisibleButton And Index < m_FirstVisibleButton Then
  621.      m_Buttons(m_FirstVisibleButton).Left = m_HorizontalButtonGap
  622.      If m_FirstVisibleButton > 0 Then UpdateButtonPos m_FirstVisibleButton - 1, 0, False
  623.      If Position >= m_FirstVisibleButton Then UpdateButtonPos m_FirstVisibleButton + 1, m_nButtons - 1, True
  624.     Else
  625.      m_Buttons(Index).Left = m_Buttons(Position).Left
  626.     UpdateButtonPos Index + 1, Position, (Position > Index)
  627.     End If
  628.    'Sino si la posicion es hacia la izquierda
  629.    ElseIf Index > Position Then
  630. '    Debug.Print "MoveButton - Boton " & Index & " a la posicion " & Position
  631.     'Movemos el boton hacia la izquierda
  632.     Temp = m_Buttons(Index)
  633.     For i = (Index - 1) To Position Step -1
  634.      m_Buttons(i + 1) = m_Buttons(i)
  635.     Next i
  636.     m_Buttons(Position) = Temp
  637. '    Debug.Print "FirstVisibleButton = " & m_Buttons(m_FirstVisibleButton).Text
  638.     If Position < m_FirstVisibleButton And Index >= m_FirstVisibleButton Then
  639.     'Este If es lo mismo que decir: Si al cambiar el orden
  640.     'de los botones, el primer boton visible no sigue siendo
  641.     'el mismo, entonces:
  642.      m_Buttons(m_FirstVisibleButton).Left = m_HorizontalButtonGap
  643.      If m_FirstVisibleButton <= Index Then UpdateButtonPos m_FirstVisibleButton + 1, m_nButtons - 1, True
  644.      If m_FirstVisibleButton > 0 Then UpdateButtonPos m_FirstVisibleButton - 1, 0, False
  645.     Else
  646.     'Si la posicion y el indice son ambos anteriores
  647.     'o posteriores al primer boton visible, entonces:
  648.      m_Buttons(Position).Left = m_Buttons(Position + 1).Left
  649.      UpdateButtonPos Position + 1, Index, True '(Position < Index)
  650.     End If
  651.    End If
  652. '   Debug.Print "RedrawBar de MoveButton"
  653. '   Debug.Print "MoveButtons New Coords. (" & Index & ", " & Position & ") - FirstVisible = " & m_FirstVisibleButton
  654.    For i = 0 To m_nButtons - 1
  655.     Debug.Print m_Buttons(i).Text & " - m_Buttons(" & i & ").Left = " & m_Buttons(i).Left
  656.    Next i
  657.    Debug.Print
  658.    CheckVisibleButtons
  659.    RedrawBar
  660.   End If
  661.  End If
  662. End Function
  663.  
  664. 'Asocia el picturebox a la clase, creando la barra.
  665. Public Function Create(ContainerControl As PictureBox) As Long
  666.  Dim i As Long, SysColor As Long
  667.  Dim Result As Boolean
  668.  Dim mbi As BITMAPINFO
  669.  Dim Color As RGBQUAD
  670.  
  671.  Set m_Container = ContainerControl
  672.  m_Container.ScaleMode = vbPixels
  673.  Create = m_Container.hwnd
  674.  'Creamos un DC que vamos a utilizar como BackBuffer.
  675.  Result = CloneDC(m_Container.hDC, m_Container.ScaleWidth, m_Container.ScaleHeight, m_BackBuffer)
  676.  'Creamos un DC que vamos a utilizar para trabajar con
  677.  'la skin.
  678.  Result = CloneDC(0, 0, 0, m_SkinDC)
  679.  'Creamos un DC que vamos a utilizar para trabajar con
  680.  'la mascara de la skin.
  681.  Result = CloneDC(0, 0, 0, m_SkinMaskDC)
  682.  'Creamos un DC del tama±o del picturebox para trabajar
  683.  'con las skins particulares de los botones.
  684.  Result = CloneDC(m_Container.hDC, m_Container.ScaleWidth, m_Container.ScaleHeight, m_ButtonSkinDC)
  685.  
  686.  m_DC.DC = m_Container.hDC
  687.  If (m_Container.BackColor And &H80000000) = &H80000000 Then
  688.  'Es un color del sistema
  689.   SysColor = (m_Container.BackColor And &H7FFFFFFF)
  690.   m_BackColor = GetSysColor(SysColor)
  691.  Else
  692.   m_BackColor = m_Container.BackColor
  693.  End If
  694.  For i = 0 To 5
  695.   m_BackColor1(i) = m_BackColor
  696.   m_TextColor1(i) = 0&
  697.   m_TextColor2(i) = &HFFFFFF
  698.  Next i
  699.  'Creamos el patron del brush para los botones Check sin Skin.
  700.  With mbi
  701.   .bmiHeader.biSize = LenB(.bmiHeader)
  702.   .bmiHeader.biBitCount = 32
  703.   .bmiHeader.biHeight = 2
  704.   .bmiHeader.biWidth = 2
  705.   .bmiHeader.biPlanes = 1
  706.   .bmiHeader.biCompression = BI_RGB
  707.   .bmiColors(0) = m_BackColor
  708.   .bmiColors(1) = RGB(255, 255, 255)
  709.   .bmiColors(2) = RGB(255, 255, 255)
  710.   .bmiColors(3) = m_BackColor
  711.  End With
  712.  m_CheckPatternBrush = CreateDIBPatternBrushPt(mbi, DIB_RGB_COLORS)
  713. ' Debug.Print "HBrush = " & HBrush
  714.  
  715. 'Establecemos las coordenadas de los botones de navegacion.
  716.  m_ButtonNext.Width = m_Container.TextWidth("<<") + (m_BorderWidth * 2) + (MARGINSIZE * 2)
  717.  m_ButtonNext.Left = m_Container.ScaleWidth - m_HorizontalButtonGap - m_ButtonNext.Width
  718.  m_ButtonNext.Top = m_VerticalButtonGap
  719.  m_ButtonNext.Height = m_Container.ScaleHeight - (m_VerticalButtonGap * 2)
  720. ' With m_ButtonNext
  721. '  Debug.Print "Button Next = (" & .Left & ", " & .Top & ") - (" & .Width & ", " & .Height & ")"
  722. ' End With
  723.  'Establecemos el texto y su alineacion.
  724.  m_ButtonNext.TextAlign = eLeft Or eVCenter
  725.  m_ButtonNext.Text = ">>"
  726.  'Establecemos el tipo de boton.
  727.  m_ButtonNext.ButtonType = eButton
  728.  m_ButtonNext.Style = e3D
  729.  m_ButtonNext.State = eNormal
  730.  
  731.  m_ButtonPrevious.Left = m_ButtonNext.Left - m_HorizontalButtonGap - m_ButtonNext.Width
  732.  m_ButtonPrevious.Width = m_ButtonNext.Width
  733.  m_ButtonPrevious.Top = m_VerticalButtonGap
  734.  m_ButtonPrevious.Height = m_Container.ScaleHeight - (m_VerticalButtonGap * 2)
  735. ' With m_ButtonPrevious
  736. '  Debug.Print "Button Previous = (" & .Left & ", " & .Top & ") - (" & .Width & ", " & .Height & ")"
  737. ' End With
  738.  
  739.  'Establecemos el texto y su alineacion.
  740.  m_ButtonPrevious.TextAlign = eLeft Or eVCenter
  741.  m_ButtonPrevious.Text = "<<"
  742.  'Establecemos el tipo de boton.
  743.  m_ButtonPrevious.ButtonType = eButton
  744.  m_ButtonPrevious.Style = e3D
  745.  m_ButtonPrevious.State = eNormal
  746. End Function
  747.  
  748. 'Libera todos los objetos asociados a la clase.
  749. Public Sub Destroy()
  750.  Dim i As Long
  751.  
  752.  'Si no existe la barra, evitamos el error.
  753.  If m_Container Is Nothing Then Exit Sub
  754.  
  755.  DestroyDC m_SkinDC
  756.  DestroyDC m_SkinMaskDC
  757.  DestroyDC m_BackBuffer
  758.  DestroyDC m_ButtonSkinDC
  759.  DeleteObject m_CheckPatternBrush
  760.  Set m_Skin = Nothing
  761.  Set m_Font = Nothing
  762.  For i = 0 To m_nButtons - 1
  763.   Set m_Buttons(i).Skin = Nothing
  764.   Set m_Buttons(i).Icon = Nothing
  765.  Next i
  766.  m_nButtons = 0
  767.  Erase m_Buttons
  768.  Set m_Container = Nothing
  769. End Sub
  770.  
  771. 'Redibuja todo el control o el boton dado.
  772. Public Sub Refresh(Optional ByVal BtnIndex As Long = NO_BUTTON)
  773.  If BtnIndex = NO_BUTTON Then
  774. '  Debug.Print "RedrawBar de Refresh"
  775.   RedrawBar
  776.  ElseIf BtnIndex >= 0 And BtnIndex < m_nButtons Then
  777.   DrawButton BtnIndex
  778.  End If
  779. End Sub
  780.  
  781. 'Mueve o redimensiona el control.
  782. Public Sub Move(Left As Long, Top As Long, Width As Long, Height As Long)
  783.  'Si no existe la barra, evitamos el error.
  784.  If m_Container Is Nothing Then Exit Sub
  785.  m_Container.Move Left, Top, Width, Height
  786. End Sub
  787.  
  788. 'Asigna la skin de los botones a la barra.
  789. Public Function SetSkin(ByVal Img As StdPicture) As Boolean
  790.  Dim Result As Long
  791.  
  792.  'Si no existe la barra, evitamos el error.
  793.  If m_Container Is Nothing Then Exit Function
  794.  
  795.  With m_SkinDC
  796.   If .DC = 0 Then
  797.    SetSkin = False
  798.   Else
  799.    If Not (Img Is Nothing) Then
  800.     Result = SelectObject(.DC, Img.handle)
  801.     If .OldBmp = 0 Then .OldBmp = Result
  802.     .CurBmp = Img.handle
  803.     m_SkinWidth = m_Container.ScaleX(Img.Width)
  804.     m_SkinHeight = m_Container.ScaleY(Img.Height)
  805.     If CreateMaskImage(m_SkinDC, m_SkinMaskDC, m_SkinWidth, m_SkinHeight, m_MaskColor) Then
  806. '     Debug.Print "La mascara fue creada satisfactoriamente."
  807.     Else
  808. '     Debug.Print "La mascara no pudo ser creada."
  809.      SetSkin = False
  810.      Exit Function
  811.     End If
  812. '    Debug.Print "RedrawBar de SetSkin"
  813.     RedrawBar
  814.    End If
  815.    Set m_Skin = Img
  816.    SetSkin = True
  817.   End If
  818.  End With
  819. End Function
  820.  
  821. Public Function GetButtonBackColor(ByRef FirstColor As Long, ByRef SecondColor As Long, BtnState As eButtonStates) As Long
  822.  FirstColor = m_BackColor1(BtnState)
  823.  SecondColor = m_BackColor2(BtnState)
  824. End Function
  825.  
  826. Public Function SetButtonBackColor(ByRef FirstColor As Long, ByRef SecondColor As Long, BtnState As eButtonStates) As Long
  827.  Dim SysColor As Long
  828.  Dim State As Long
  829.  
  830.  State = GetButtonStateSkin(BtnState)
  831.  
  832.  If (FirstColor And &H80000000) = &H80000000 Then
  833.  'Es un color del sistema
  834.   SysColor = (FirstColor And &H7FFFFFFF)
  835.   FirstColor = GetSysColor(SysColor)
  836.  End If
  837.  m_BackColor1(State) = FirstColor
  838.  
  839.  If (SecondColor And &H80000000) = &H80000000 Then
  840.  'Es un color del sistema
  841.   SysColor = (SecondColor And &H7FFFFFFF)
  842.   SecondColor = GetSysColor(SysColor)
  843.  End If
  844.  m_BackColor2(State) = SecondColor
  845. ' Debug.Print "RedrawBar de SetButtonBackColor"
  846.  RedrawBar
  847. End Function
  848.  
  849. Public Function GetButtonTextColor(ByRef FirstColor As Long, ByRef SecondColor As Long, BtnState As eButtonStates) As Long
  850.  FirstColor = m_TextColor1(BtnState)
  851.  SecondColor = m_TextColor2(BtnState)
  852. End Function
  853.  
  854. Public Function SetButtonTextColor(ByRef FirstColor As Long, ByRef SecondColor As Long, BtnState As eButtonStates) As Long
  855.  Dim SysColor As Long
  856.  Dim State As Long
  857.  
  858.  State = GetButtonStateSkin(BtnState)
  859.  If (FirstColor And &H80000000) = &H80000000 Then
  860.  'Es un color del sistema
  861.   SysColor = (FirstColor And &H7FFFFFFF)
  862.   FirstColor = GetSysColor(SysColor)
  863.  End If
  864.  m_TextColor1(State) = FirstColor
  865.  
  866.  If (SecondColor And &H80000000) = &H80000000 Then
  867.  'Es un color del sistema
  868.   SysColor = (SecondColor And &H7FFFFFFF)
  869.   SecondColor = GetSysColor(SysColor)
  870.  End If
  871.  m_TextColor2(State) = SecondColor
  872. ' Debug.Print "RedrawBar de SetButtonTextColor"
  873.  RedrawBar
  874. End Function
  875.  
  876. Public Function GetButtonBorderColor(ByRef Color As Long, BtnState As eButtonStates) As Long
  877.  Color = m_BorderColor(BtnState)
  878.  GetButtonBorderColor = m_BorderColor(BtnState)
  879. End Function
  880.  
  881. Public Function SetButtonBorderColor(ByRef Color As Long, BtnState As eButtonStates) As Long
  882.  Dim SysColor As Long
  883.  Dim State As Long
  884.  
  885.  State = GetButtonStateSkin(BtnState)
  886.  
  887.  If (Color And &H80000000) = &H80000000 Then
  888.  'Es un color del sistema
  889.   SysColor = (Color And &H7FFFFFFF)
  890.   Color = GetSysColor(SysColor)
  891.  End If
  892.  m_BorderColor(State) = Color
  893. ' Debug.Print "RedrawBar de SetButtonBorderColor"
  894.  RedrawBar
  895. End Function
  896.  
  897. 'Modifica el estado de los botones.
  898. Friend Function SetButtonState(ByVal Index As Long, State As eButtonStates, SetState As Boolean) As eButtonStates
  899.  Dim i As Long
  900.  
  901.  If Index >= 0 And Index < m_nButtons Then
  902.   'Si a un boton tipo Option se le esta estableciendo
  903.   'el estado eDown a True, buscamos el boton del grupo
  904.   'que actualmente tiene el estado eDown a True y se lo
  905.   'ponemos en False.
  906.   If (m_Buttons(Index).ButtonType = eOption) And (State = eDown) Then
  907.    If SetState Then
  908.     'Chequeamos hacia la izquierda del boton
  909.     For i = Index To 0 Step -1
  910.      With m_Buttons(i)
  911.       If .ButtonType = eOption Then
  912.        If (.State And eDown) Then
  913.         .State = .State And (Not eDown)
  914.         DrawButton i
  915.         GoTo SetCurState
  916.        End If
  917.       Else
  918.        Exit For
  919.       End If
  920.      End With
  921.     Next i
  922.     'Chequeamos hacia la derecha del boton
  923.     For i = Index To m_nButtons - 1
  924.      With m_Buttons(i)
  925.       If .ButtonType = eOption Then
  926.        'Modificamos el estado si el boton option esta
  927.        'siendo establecido a presionado.
  928.        If (.State And eDown) Then
  929.         .State = .State And (Not eDown)
  930.         DrawButton i
  931.         GoTo SetCurState
  932.        End If
  933.       Else
  934.        Exit For
  935.       End If
  936.      End With
  937.     Next i
  938.    Else
  939.     Exit Function
  940.    End If
  941.   End If
  942.   
  943. SetCurState:
  944.  
  945.   If SetState Then
  946.    m_Buttons(Index).State = m_Buttons(Index).State Or State
  947.   Else
  948.    m_Buttons(Index).State = m_Buttons(Index).State And (Not State)
  949.   End If
  950. '  Debug.Print "SetButtonState (&H" & Hex(State) & ") = &H" & Hex(m_Buttons(Index).State)
  951.   SetButtonState = m_Buttons(Index).State
  952.  ElseIf Index = BUTTON_PREVIOUS Then
  953.   If SetState Then
  954.    m_ButtonPrevious.State = m_ButtonPrevious.State Or State
  955.   Else
  956.    m_ButtonPrevious.State = m_ButtonPrevious.State And (Not State)
  957.   End If
  958. '  Debug.Print "SetButtonState (&H" & Hex(State) & ") = &H" & Hex(m_ButtonPrevious.State)
  959.   SetButtonState = m_ButtonPrevious.State
  960.  ElseIf Index = BUTTON_NEXT Then
  961.   If SetState Then
  962.    m_ButtonNext.State = m_ButtonNext.State Or State
  963.   Else
  964.    m_ButtonNext.State = m_ButtonNext.State And (Not State)
  965.   End If
  966. '  Debug.Print "SetButtonState (&H" & Hex(State) & ") = &H" & Hex(m_ButtonNext.State)
  967.   SetButtonState = m_ButtonNext.State
  968.  Else
  969.   SetButtonState = -1
  970.   Exit Function
  971.  End If
  972. End Function
  973.  
  974. 'Establece el tama±o del boton.
  975. 'Devuelve si es visible o no.
  976. Public Function SetButtonSize(ByVal Index As Long, Optional ByVal W As Long = 0, Optional ByVal H As Long = 0) As Boolean
  977.  If Index >= 0 And Index < m_nButtons Then
  978.   If W > 0 Then m_Buttons(Index).Width = W
  979.   If H > 0 Then m_Buttons(Index).Height = H
  980.   UpdateButtonPos Index, m_nButtons - 1, True
  981.   CheckVisibleButtons
  982.   SetButtonSize = (m_Buttons(Index).Flags And BTN_FULLVISIBLE)
  983. '  Debug.Print "RedrawBar en SetButtonSize"
  984. '  RedrawBar
  985.  End If
  986. End Function
  987.  
  988. 'Establece la skin particular del boton dado.
  989. Public Function SetButtonSkin(ByVal Index As Long, ByVal BtnSkin As StdPicture, Optional ByVal SkinMaskColor As Long = -1) As Boolean
  990.  If Index >= 0 And Index < m_nButtons Then
  991.   Set m_Buttons(Index).Skin = BtnSkin
  992.   If SkinMaskColor = -1 Then SkinMaskColor = m_MaskColor
  993.   m_Buttons(Index).MaskColor = SkinMaskColor
  994.   DrawButton Index
  995.  End If
  996. End Function
  997.  
  998. Public Sub SetFocus(Optional ByVal Index As Long = NO_BUTTON)
  999.  m_Container.SetFocus
  1000.  If Index > NO_BUTTON Then
  1001.   Me.SetButtonState m_ButtonFocus, eFocused, False
  1002.   DrawButton m_ButtonFocus
  1003.   m_ButtonFocus = Index
  1004.   Me.SetButtonState m_ButtonFocus, eFocused, True
  1005.  End If
  1006.  DrawButton m_ButtonFocus
  1007. End Sub
  1008.  
  1009. '=============================================
  1010. 'DEFINICION DE EVENTOS PRIVADOS
  1011. '=============================================
  1012.  
  1013. Private Sub Class_Initialize()
  1014.  m_BarFlags = fMASKCOLOR Or fDRAWFOCUSRECT
  1015.  m_FillMode = eSolid
  1016.  m_BorderWidth = 1
  1017.  m_ButtonOver = NO_BUTTON
  1018.  m_ButtonDown = NO_BUTTON
  1019.  m_ButtonFocus = NO_BUTTON
  1020.  m_DefaultButtonWidth = 80
  1021.  m_DefaultButtonHeight = 40
  1022.  m_VerticalButtonGap = 3
  1023.  m_HorizontalButtonGap = 3
  1024.  m_MaskColor = -1
  1025. End Sub
  1026.  
  1027. Private Sub Class_Terminate()
  1028.  Me.Destroy
  1029. End Sub
  1030.  
  1031. Private Sub m_Container_GotFocus()
  1032. ' Debug.Print "m_ButtonFocus en Got_Focus = " & m_ButtonFocus & " Has the Focus? = " & CBool(Me.ButtonState(m_ButtonFocus) And eFocused)
  1033.  If (Me.ButtonState(m_ButtonFocus) And eDisabled) Then Exit Sub
  1034.  If m_ButtonFocus >= 0 And m_ButtonFocus < m_nButtons Then
  1035.   'Dibujamos el Focus Rect
  1036.   DrawButton m_ButtonFocus
  1037. '  RaiseEvent GotFocus(m_ButtonFocus)
  1038.  End If
  1039. End Sub
  1040.  
  1041. Private Sub m_Container_KeyDown(KeyCode As Integer, Shift As Integer)
  1042.  Dim NextButton As Long
  1043. 'EXISTE UN PROBLEMA CUANDO UN COMMAND BUTTON TIENE LA
  1044. 'PROPIEDAD DEFAULT A TRUE, EL PICTUREBOX NO RECIBE EL
  1045. 'EVENTO KEYDOWN CON VBKEYRETURN, SI ES FALSE NO HAY
  1046. 'NINGUN PROBLEMA.
  1047. ' Debug.Print "Enter KeyDown"
  1048. ' Debug.Print "m_ButtonFocus = " & m_ButtonFocus
  1049.  If KeyCode = vbKeyReturn Or KeyCode = vbKeySpace Then
  1050.   If (Me.ButtonState(m_ButtonFocus) And eDisabled) Then Exit Sub
  1051.    'Si ya hay un boton presionado, no hacemos nada.
  1052.   If m_ButtonDown > NO_BUTTON Then Exit Sub
  1053.   If m_ButtonFocus > NO_BUTTON Then
  1054.    m_ButtonDown = m_ButtonFocus
  1055. '   Debug.Print "Key Down con Space, m_ButtonDown = " & m_ButtonDown
  1056.    If (Me.ButtonType(m_ButtonDown) And eCheck) <> eCheck Then
  1057.     Me.SetButtonState m_ButtonDown, eDown, True
  1058.    Else
  1059.     'Al boton tipo Check le invertimos el estado
  1060.     Me.SetButtonState m_ButtonDown, eDown, Not CBool(Me.ButtonState(m_ButtonDown) And eDown)
  1061.    End If
  1062.    DrawButton m_ButtonDown
  1063.    'Evento con el teclado.
  1064.    RaiseEvent KeyDown(m_ButtonDown, KeyCode, Shift)
  1065.   End If
  1066.  ElseIf KeyCode = vbKeyLeft Then
  1067.   If m_ButtonFocus < 0 Then Exit Sub
  1068.   NextButton = NextAvailableButton(m_ButtonFocus - 1, 0)
  1069.   If NextButton = NO_BUTTON Then Exit Sub
  1070. '  Debug.Print "Se presiono la flecha izq."
  1071.   'Quitamos el foco del boton actual.
  1072.   Me.SetButtonState m_ButtonFocus, eFocused, False
  1073.   DrawButton m_ButtonFocus
  1074.   RaiseEvent KeyDown(m_ButtonFocus, KeyCode, Shift)
  1075.   RaiseEvent LostFocus(m_ButtonFocus, "KeyDown")
  1076.   m_ButtonFocus = NextButton
  1077.   Me.SetButtonState m_ButtonFocus, eFocused, True
  1078.   DrawButton m_ButtonFocus
  1079.   RaiseEvent GotFocus(m_ButtonFocus)
  1080.  ElseIf KeyCode = vbKeyRight Then
  1081.   If m_ButtonFocus < 0 Then Exit Sub
  1082.   NextButton = NextAvailableButton(m_ButtonFocus + 1, m_nButtons - 1)
  1083.   If NextButton = NO_BUTTON Then Exit Sub
  1084. '  Debug.Print "Se presiono la flecha der."
  1085.   'Quitamos el foco del boton actual.
  1086.   Me.SetButtonState m_ButtonFocus, eFocused, False
  1087.   DrawButton m_ButtonFocus
  1088.   RaiseEvent KeyDown(m_ButtonFocus, KeyCode, Shift)
  1089.   RaiseEvent LostFocus(m_ButtonFocus, "KeyDown")
  1090.   m_ButtonFocus = NextButton
  1091.   Me.SetButtonState m_ButtonFocus, eFocused, True
  1092.   DrawButton m_ButtonFocus
  1093.   RaiseEvent GotFocus(m_ButtonFocus)
  1094.  End If
  1095.  
  1096. End Sub
  1097.  
  1098. Private Sub m_Container_KeyPress(KeyAscii As Integer)
  1099.  If m_ButtonFocus >= 0 Then
  1100.   RaiseEvent KeyPressed(m_ButtonFocus, KeyAscii)
  1101.  End If
  1102. End Sub
  1103.  
  1104. Private Sub m_Container_KeyUp(KeyCode As Integer, Shift As Integer)
  1105.  If (Me.ButtonState(m_ButtonFocus) And eDisabled) Then Exit Sub
  1106.  If KeyCode = vbKeyReturn Or KeyCode = vbKeySpace Then
  1107.   If m_ButtonDown > NO_BUTTON Then
  1108. '   Debug.Print "Key Up con Space, m_ButtonDown = " & m_ButtonDown
  1109.    If (Me.ButtonType(m_ButtonDown) And eCheck) <> eCheck Then
  1110.     Me.SetButtonState m_ButtonDown, eDown, False
  1111.    End If
  1112.    m_ButtonFocus = m_ButtonDown
  1113.    DrawButton m_ButtonDown
  1114.    RaiseEvent Click(m_ButtonDown)
  1115.    'Agregamos la funcionalidad de los botones de navegacion.
  1116.    If m_ButtonDown = BUTTON_PREVIOUS Then
  1117.     m_FirstVisibleButton = m_FirstVisibleButton - 1
  1118.     m_Buttons(m_FirstVisibleButton).Left = m_HorizontalButtonGap 'm_Buttons(m_FirstVisibleButton).Left + m_Buttons(m_FirstVisibleButton).Width
  1119.     UpdateButtonPos m_FirstVisibleButton + 1, m_nButtons - 1, True
  1120.     UpdateButtonPos m_FirstVisibleButton, 0, False
  1121.     CheckVisibleButtons
  1122.    ElseIf m_ButtonDown = BUTTON_NEXT Then
  1123. '    m_Buttons(m_FirstVisibleButton).Left = m_Buttons(m_FirstVisibleButton).Left - m_Buttons(m_FirstVisibleButton).Width
  1124.     m_FirstVisibleButton = m_FirstVisibleButton + 1
  1125.     m_Buttons(m_FirstVisibleButton).Left = m_HorizontalButtonGap
  1126.     UpdateButtonPos m_FirstVisibleButton - 1, 0, False
  1127.     UpdateButtonPos m_FirstVisibleButton, m_nButtons - 1, True
  1128.     CheckVisibleButtons
  1129.    End If
  1130.   'Evento con el teclado.
  1131.    RaiseEvent KeyUp(m_ButtonDown, KeyCode, Shift)
  1132.    m_ButtonDown = NO_BUTTON
  1133.   End If
  1134.  End If
  1135.  
  1136. End Sub
  1137.  
  1138. Private Sub m_Container_LostFocus()
  1139.  Dim NextBtnFocus As Long
  1140.  Dim i As Long, Result As Long
  1141.  
  1142.  If IsKeyDown(vbKeyTab) Then
  1143.   If m_ButtonFocus < 0 Then Exit Sub
  1144.   NextBtnFocus = NextAvailableButton(m_ButtonFocus + 1, m_nButtons - 1)
  1145.   If NextBtnFocus <> NO_BUTTON Then
  1146.    'Borramos el Focus Rect del boton actual.
  1147.    Me.SetButtonState m_ButtonFocus, eFocused, False
  1148.    DrawButton m_ButtonFocus
  1149.    RaiseEvent LostFocus(m_ButtonFocus, "LostFocus")
  1150. '   Debug.Print "m_ButtonFocus en Lost_Focus = " & m_ButtonFocus & " Has the Focus? = " & CBool(Me.ButtonState(m_ButtonFocus) And eFocused)
  1151.    m_ButtonFocus = NextBtnFocus
  1152.    Me.SetButtonState m_ButtonFocus, eFocused, True
  1153.    m_Container.SetFocus
  1154.    RaiseEvent GotFocus(m_ButtonFocus)
  1155.   Else
  1156.    'Si m_Container no tiene el foco, dibujamos el boton
  1157.    'sin foco.
  1158.    DrawButton m_ButtonFocus
  1159. '   RaiseEvent LostFocus(m_ButtonFocus, "LostFocus")
  1160.   End If
  1161. ' Else
  1162. '  RaiseEvent LostFocus
  1163.  End If
  1164. End Sub
  1165.  
  1166. Private Sub m_Container_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  1167.  Dim TempBtn As Long
  1168.  
  1169. ' Debug.Print "mOUSE DOWN"
  1170.  TempBtn = GetButtonCapture(CLng(X), CLng(Y))
  1171.  If Button = vbLeftButton Then
  1172.   If TempBtn > NO_BUTTON Then
  1173. '    If TempBtn = BUTTON_PREVIOUS Then
  1174. '     Debug.Print "m_ButtonDown = BUTTON_PREVIOUS is disabled? " & CBool(Me.ButtonState(TempBtn) And eDisabled)
  1175. '    ElseIf TempBtn = BUTTON_NEXT Then
  1176. '     Debug.Print "m_ButtonDown = BUTTON_NEXT is disabled? " & CBool(Me.ButtonState(TempBtn) And eDisabled)
  1177. '    End If
  1178.    
  1179.    If (Me.ButtonState(TempBtn) And eDisabled) Then Exit Sub
  1180.     m_ButtonDown = TempBtn
  1181. '   Debug.Print "Button Pressed = " & m_ButtonDown
  1182.    If (Me.ButtonType(m_ButtonDown) And eCheck) <> eCheck Then
  1183.     Me.SetButtonState m_ButtonDown, eDown, True
  1184.    Else
  1185.     'Al boton tipo Check le invertimos el estado
  1186. '    Debug.Print "Before changing, Check Button State is Down? = " & CBool(Me.ButtonState(m_ButtonDown) And eDown)
  1187.     Me.SetButtonState m_ButtonDown, eDown, Not CBool(Me.ButtonState(m_ButtonDown) And eDown)
  1188. '    Debug.Print "After changing, Check Button State is Down? = " & CBool(Me.ButtonState(m_ButtonDown) And eDown)
  1189.    End If
  1190.     'Quitamos el foco al boton anterior
  1191.     If m_ButtonFocus > NO_BUTTON Then
  1192.      Me.SetButtonState m_ButtonFocus, eFocused, False
  1193.      DrawButton m_ButtonFocus
  1194.      RaiseEvent LostFocus(m_ButtonFocus, "MouseDown")
  1195.     End If
  1196.     'Agregamos el foco al boton actual
  1197.     Me.SetButtonState m_ButtonDown, eFocused, True
  1198.     m_ButtonFocus = m_ButtonDown
  1199. '    Debug.Print "m_ButtonFocus en Mouse_Down = " & m_ButtonFocus
  1200.     DrawButton m_ButtonDown
  1201.     RaiseEvent GotFocus(m_ButtonFocus)
  1202. '   Debug.Print "MouseDown in x = " & x & ", y = " & y
  1203.    'Evento con el boton izquierdo del mouse.
  1204.    RaiseEvent MouseDown(m_ButtonDown, Button, Shift, X, Y)
  1205.   End If
  1206.  Else
  1207.   If (Me.ButtonState(TempBtn) And eDisabled) Then Exit Sub
  1208.   'Evento con el boton derecho o medio del mouse.
  1209.   RaiseEvent MouseDown(m_ButtonDown, Button, Shift, X, Y)
  1210.  End If
  1211. End Sub
  1212.  
  1213. Private Sub m_Container_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  1214.  Dim ButtonIndex As Long
  1215.  
  1216.  
  1217.  'Obtenemos el indice del boton sobre el cual esta el
  1218.  'puntero del mouse.
  1219.  ButtonIndex = GetButtonCapture(CLng(X), CLng(Y))
  1220.  'Chequeamos el suceso Over
  1221.  If m_ButtonOver = ButtonIndex Then
  1222.   Exit Sub
  1223.  End If
  1224.  
  1225. ' If ButtonIndex = BUTTON_PREVIOUS Then
  1226. '  Debug.Print "Mouse Over Button Previous"
  1227. ' ElseIf ButtonIndex = BUTTON_NEXT Then
  1228. '  Debug.Print "Mouse Over Button Next"
  1229. ' End If
  1230.  If (Me.ButtonState(ButtonIndex) And eDisabled) Then Exit Sub
  1231.  
  1232. ' Debug.Print "m_ButtonDown = " & m_ButtonDown
  1233. ' Debug.Print "Button with Capture = " & ButtonIndex
  1234. ' Debug.Print "Button with Focus = " & m_ButtonFocus
  1235.  'Si estamos presionado el boton del mouse
  1236.  If Button = vbLeftButton Then
  1237.   'Si hay algun boton presionado
  1238.   If m_ButtonDown > NO_BUTTON Then
  1239.    'Si el boton presionado es distinto del que tiene
  1240.    'la captura del mouse, quitamos su estado Down.
  1241.    If m_ButtonDown <> ButtonIndex Then
  1242.     'Supuestamente es el mismo boton que m_ButtonOver.
  1243.     Me.SetButtonState m_ButtonDown, eDown, False
  1244.     m_ButtonDown = NO_BUTTON
  1245.    Else
  1246.    'sino si el boton con la captura es el mismo que el
  1247.    'que tiene el foco, ponemos su estado en Down.
  1248.     If m_ButtonFocus = ButtonIndex Then
  1249.      Me.SetButtonState m_ButtonDown, eDown, True
  1250.      m_ButtonDown = m_ButtonFocus
  1251.     End If
  1252.    End If
  1253.   End If
  1254.  End If
  1255.  
  1256.  'Si algun boton tiene el Over, se lo quitamos
  1257.  If m_ButtonOver > NO_BUTTON Then
  1258.   Me.SetButtonState m_ButtonOver, eOver, False
  1259.   DrawButton m_ButtonOver
  1260.   'Solo generamos estos eventos para los botones que
  1261.   'agrega el usuario.
  1262.   If m_ButtonOver >= 0 Then
  1263. '   Debug.Print "MouseLeave " & m_ButtonOver & " in x = " & x & ", y = " & y
  1264.    RaiseEvent MouseLeave(m_ButtonOver)
  1265.   End If
  1266.  End If
  1267.  'Si algun boton consiguio el Over, se lo agregamos
  1268.  If ButtonIndex > NO_BUTTON Then
  1269.   Me.SetButtonState ButtonIndex, eOver, True
  1270.   DrawButton ButtonIndex
  1271.   'En MouseEnter le agregamos el tooltip
  1272.   If ButtonIndex >= 0 Then
  1273.    m_Container.ToolTipText = m_Buttons(ButtonIndex).Tooltip
  1274.   End If
  1275. '  Debug.Print "MouseOver Boton " & ButtonIndex
  1276.   'Solo generamos estos eventos para los botones que
  1277.   'agrega el usuario.
  1278.   If ButtonIndex >= 0 Then
  1279.    RaiseEvent MouseEnter(ButtonIndex)
  1280. '  Debug.Print "MouseEnter " & ButtonIndex & " in x = " & x & ", y = " & y
  1281.   End If
  1282.  Else
  1283.   'Si no hay ningun boton con la captura, quitamos el
  1284.   'texto del tooltip.
  1285.   m_Container.ToolTipText = ""
  1286.  End If
  1287.  m_ButtonOver = ButtonIndex
  1288. End Sub
  1289.  
  1290. Private Sub m_Container_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  1291.  Dim ButtonIndex As Long
  1292.  
  1293.  ButtonIndex = GetButtonCapture(CLng(X), CLng(Y))
  1294.  If Button = vbLeftButton Then
  1295.  'Si es un boton agregado de la barra.
  1296.   If ButtonIndex > NO_BUTTON Then
  1297.    If (Me.ButtonState(ButtonIndex) And eDisabled) Then Exit Sub
  1298.    'Si el boton del Mouse_Down es el mismo del Mouse_Up
  1299.    If m_ButtonDown = ButtonIndex Then
  1300.     If (Me.ButtonType(m_ButtonDown) And eCheck) <> eCheck Then
  1301.      Me.SetButtonState m_ButtonDown, eDown, False
  1302.     End If
  1303.     DrawButton m_ButtonDown
  1304.     RaiseEvent Click(ButtonIndex)
  1305.    End If
  1306.    'Agregamos la funcionalidad de los botones de navegacion.
  1307.    If m_ButtonDown = BUTTON_PREVIOUS Then
  1308.     m_FirstVisibleButton = m_FirstVisibleButton - 1
  1309.     m_Buttons(m_FirstVisibleButton).Left = m_HorizontalButtonGap 'm_Buttons(m_FirstVisibleButton).Left + m_Buttons(m_FirstVisibleButton).Width
  1310.     UpdateButtonPos m_FirstVisibleButton + 1, m_nButtons - 1, True
  1311.     UpdateButtonPos m_FirstVisibleButton, 0, False
  1312.     CheckVisibleButtons
  1313.    ElseIf m_ButtonDown = BUTTON_NEXT Then
  1314. '    m_Buttons(m_FirstVisibleButton).Left = m_Buttons(m_FirstVisibleButton).Left - m_Buttons(m_FirstVisibleButton).Width
  1315.     m_FirstVisibleButton = m_FirstVisibleButton + 1
  1316.     m_Buttons(m_FirstVisibleButton).Left = m_HorizontalButtonGap
  1317.     UpdateButtonPos m_FirstVisibleButton - 1, 0, False
  1318.     UpdateButtonPos m_FirstVisibleButton, m_nButtons - 1, True
  1319.     Debug.Print "M_FIRSTVISIBLEBUTTON = " & m_FirstVisibleButton
  1320.     CheckVisibleButtons
  1321.    End If
  1322.    'Evento con el boton izquierdo del mouse.
  1323.    RaiseEvent MouseUp(ButtonIndex, Button, Shift, X, Y)
  1324.    m_ButtonDown = NO_BUTTON
  1325.   End If
  1326.  Else
  1327.   If (Me.ButtonState(ButtonIndex) And eDisabled) Then Exit Sub
  1328.   'Evento con el boton derecho o medio del mouse.
  1329.   RaiseEvent MouseUp(ButtonIndex, Button, Shift, X, Y)
  1330.  End If
  1331. End Sub
  1332.  
  1333. Private Sub m_Container_Paint()
  1334. ' Debug.Print "m_Container_Paint event"
  1335. ' Debug.Print "RedrawBar de Paint"
  1336.  RedrawBar
  1337.  RaiseEvent Paint
  1338. End Sub
  1339.  
  1340. Private Sub m_Container_Resize()
  1341.  ResizeDC m_BackBuffer, m_Container.ScaleWidth, m_Container.ScaleHeight
  1342.  ResizeDC m_ButtonSkinDC, m_Container.ScaleWidth, m_Container.ScaleHeight
  1343. 'Establecemos las coordenadas de los botones de navegacion.
  1344.  m_ButtonNext.Left = m_Container.ScaleWidth - m_HorizontalButtonGap - m_ButtonNext.Width
  1345.  m_ButtonNext.Top = m_VerticalButtonGap
  1346.  m_ButtonNext.Height = m_Container.ScaleHeight - (m_VerticalButtonGap * 2)
  1347.  
  1348.  m_ButtonPrevious.Left = m_ButtonNext.Left - m_HorizontalButtonGap - m_ButtonNext.Width
  1349.  m_ButtonPrevious.Top = m_VerticalButtonGap
  1350.  m_ButtonPrevious.Height = m_Container.ScaleHeight - (m_VerticalButtonGap * 2)
  1351.  
  1352. ' RedrawBar
  1353.  RaiseEvent Resize
  1354. End Sub
  1355.  
  1356. Private Sub m_Font_FontChanged(ByVal PropertyName As String)
  1357.  Set m_Container.Font = m_Font
  1358. ' Debug.Print "RedrawBar de FontChanged"
  1359.  RedrawBar
  1360. End Sub
  1361.  
  1362. '=============================================
  1363. 'DEFINICION DE PROPIEDADES PUBLICAS
  1364. '=============================================
  1365.  
  1366. 'Indica si actualizamos la barra o no.
  1367. Public Property Get LockUpdate() As Boolean
  1368.  LockUpdate = m_LockUpdate
  1369. End Property
  1370.  
  1371. 'Indica si actualizamos la barra o no.
  1372. Public Property Let LockUpdate(ByVal NuevoValor As Boolean)
  1373.  m_LockUpdate = NuevoValor
  1374.  If Not NuevoValor Then
  1375. '  Debug.Print "RedrawBar de LockUpdate"
  1376.   RedrawBar
  1377.  End If
  1378. End Property
  1379.  
  1380.  
  1381. 'Indica el espacio entre cada boton (en pixeles).
  1382. Public Property Get HorizontalButtonGap() As Long
  1383.  HorizontalButtonGap = m_HorizontalButtonGap
  1384. End Property
  1385.  
  1386. 'Indica el espacio entre cada boton (en pixeles).
  1387. Public Property Let HorizontalButtonGap(ByVal NuevoValor As Long)
  1388.  m_HorizontalButtonGap = NuevoValor
  1389. ' Debug.Print "RedrawBar de HorizontalButtonGap"
  1390.  RedrawBar
  1391. End Property
  1392.  
  1393. 'Indica el espacio entre cada boton (en pixeles).
  1394. Public Property edraxeles).
  1395. Public c End If  CheckVisibleButtonstonIndex = GetButtonCapture(CLng(X)ttonGap * 2)
  1396. XstonIndex =own.
  1397.  X)ttonGap * 2)
  1398. XstonIndex =own.
  1399.  X)ttonGap * 2)
  1400. XstonInde(m_ButtonDButto2mcus >= 0 Thep * 2)
  1401. XstapturebrY))
  1402.  If Button eDowntre cadaNdthibleButtonstonIndex = GeturebrY))
  1403.  sropertA cada bot
  1404.  
  1405. 'onGaer_Paint event"
  1406. ' Debug.Print "RedrawBar de Paint"
  1407.  Rtate) & "0 Thep * 2)t
  1408.  
  1409. 'onGaer_Pain_tonNext.Left = a e o no.
  1410. Public Function SetButtonSize(ByVal Index As Long, Optional ByVal W As Long = 0, Optional ByVal H As Long = 0) As Boolean
  1411.  If Index >= 0 And Index < m_nButtons Then
  1412.   If W > 0 Then m_Buttons(Index).Width = W
  1413.   If H > 0 Then m_Buttons(IndeHlean
  1414.  If Index >= 0 And Ina_nButns ThenseEvent Moui=.Width nt"
  1415.  RedrawBar
  1416.  RaiseEvent Paint
  1417. End Sub
  1418.  
  1419. Private utto2mcus e(m_ButtonFocus) And eFocused)t FunonOver, eOTRedrawBar de Paint As IntegelUis*,Gpz eOTRedrawBar de Paint e utto2mcus e(m_ButtonFocus) And eFocusev,nNext.l Sub
  1420.    'Si uttonDxltegelIndex).Tooltip
  1421.   tate) nDxlteger.ScaleX(Ionsiguio el Over, se lo agregamos
  1422.  If ButtonTa barra o no.
  1423. Public Propertyn - 1
  1424.     m_Buttons(m_FirstVii_ButtstonIndun boton
  1425.    'mt = d).Tooltip
  1426.   tate) nDxlt Img.h= d) If
  1427. b.
  1428. Public Propertynf Index >= 0 And Index < m_nButtons Then
  1429.   If W > 0 The).
  1430. Public Property LsizeDC 
  1431. Public Propertynf Indeef FirstetButtonCapture(r de Paint"
  1432.  Rtate) & deButtons
  1433.    End If
  1434.  
  1435. Private CTRUE, ght
  1436.  ResizeDC m_ButtonSkinDC, m_Container.ScaleWidth, m_Container.ScaleHeight
  1437. 'Establecemos las coordenadas de_FirstVisibleB>ev,nNeir.ScaleHeign = m_nButtons
  1438. 'rtical(CIndex,ittonDx Ref Index m_TextCon = m_IB_RGB_Cah, beHeight
  1439. 'EY))
  1440.  rtyn - 1
  1441.     m_yn - 1
  1442.  
  1443.     m_yn  Y))
  1444.  If Button = vbLeftButight
  1445. MHedrawBar
  1446. End Sub
  1447.  
  1448. '===== m_ynnnnnByVmos las coordennButtons - ate)snt"
  1449.  Rteign = m_nButFm_Horizons - ate)snt"
  1450.  Rteign = m_nButFmropertynf Ilos n(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_Bu
  1451.  
  1452. 'IndicaButtonD(m_BuEnd Sub
  1453.  
  1454. '===== _RGB_C_ButtonD(m_ButtonD(m_ButtonD=== m_ynnnnnByVmos ligjnD(m_ButtonDnFocus uttonDX
  1455.  
  1456. 'onGaer_Pain_tonNext.Left = a e o no.
  1457. Public Function SetButtonSize(ByVal Index As Long, Optional ByVal Color As Long, BtnStIndex < m_n) As Ls(m_ButtonD(m_ uttonDX
  1458.  
  1459. 'L,h_ynnnnnByVmolL      If .ButtonType = enByty LsizeDC 
  1460. Public Propn   Debug.Print True
  1461.     Else
  1462.      m_Buttons(Index).Left sS)nFocus uttonDX
  1463.  
  1464. 'onGaer_Pain_tonNext.LefILefILByVal Index As Long, Optional ByVal Color nH,:mZed, False
  1465.   DrawButton m_ButtonFocus
  1466.   RaiseEvent KeyDown(m_ButtonFocus, KeyCodeXlse
  1467.   'Si algun botonalgunonF0nalgunonF0lse
  1468.   'Si algun  colmZed,odeXlsea.l estado
  1469.   ate = mvoValor
  1470. ' Dhacia la izquie) 'Si algun que el
  1471. lgun que elionNexs(ContainerContai onNexs(Cot
  1472.  RedrawBar
  1473.  RaiseEvent Paint
  1474. End Sub
  1475.  
  1476. Priv_FirstVisi vbLeftButton Then
  1477.   If TempBtn >nNexs(Cot
  1478.  Rtons
  1479. 'rtical(C& deButtons
  1480.    E(_Buttonocus
  1481.   Ra PrAs Boolean
  1482.  If Index >= 0  _ButtonD(m_BHi)utton   'Si algnm_ynnnie) 'Si algunal ByVaem_nButFmropertynf Ilos n(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonD(m_ButtonkButtonDbot(m_ButtonkButtonDbot(m_ButtonkButm_ButtonD(m_ButtonD(m_Bu= m_nButFmropn(m_ButtonFocus, KeyCodewn(m_6uttoBtnStIn   Es
  1483.    xs(Coxs(Con wn(m_6"
  1484.  RtadonIndutFmropertynf Ilos n(m_BUTTON Then
  1485.    'a Fal& Indice
  1486.   PREVIOUSd0nf Ilos us
  1487.   Raise_NEXT Then
  1488.  > Index)
  1489.     End If
  1490.  s(m_Bice
  1491.   PREVIOUtoneButtonD(m_Button > , se lo agregamos
  1492.  If ButtonTa barra o no m_BuickUpda2o agregamos
  1493.  If ButtonTa barra o no m_BuickUpenButFmropn(m_BuD(m_ButtonD(m_ButtonD=== m_ynnnnnByVmos ligjnD(m_ButtonDnFocus uttonDX
  1494.  
  1495. 'onGaer_Pain_tonNext.Left = a e o no.
  1496. Public Function SetButtonSize(ByVal Index As Long, Optional ByVal Color As Long, BtnStIndex < m_n) As Ls(m_ButtonD(m_ uttonDX
  1497.  
  1498. 'L,h_ynnnnnByVmol=Ple)
  1499.  DgDowntre anD(h_ynnDx Ref InR p,, KeyCode, Shift)
  1500.   RaionnDxButtonTa NdthibleButtonstonIndex = GeturebrY))
  1501.  sropertA cada botRhByVal ColoorizontalButtonGap = NuevBs        GoT GoT GoT GoT GobleBe*S PUBLICAS
  1502. '=======si vbLeftBu >nNexmlgunaSyVal Coloorndex = Geturh nt"
  1503.  Red Ilos n( = NuevBs   s prttonIndc
  1504.   If m_ButIndc
  1505.   e.ButDD2ngle)
  1506. nIndex) And eDisabl_BuEnd Sub
  1507.  
  1508. '===== _RGB_C_ButtonD(c
  1509.   If m_ButIndc
  1510.   e.ButDD2ngle)
  1511. nIndex) And eDisabl_BuEnd Sub
  1512.  
  1513. '===== _RGB_C  
  1514.  DgDowntre anD( Then
  1515. uttonOve 
  1516.    ElseIf li > NO_BUTTON Then
  1517. li > NO_BUTal ByVpertLeft, Top, Width, Height
  1518. End Sub
  1519.  
  1520. 'Asigna la skin de losidth, HeGe HoreAsabl_BuEnd Sub
  1521.  
  1522. '===iado
  1523.   ate = AS
  1524.  Then
  1525. reAttonD(m_Bu Button, Shift, X, Y)
  1526.    m_Buttone losidthLntegelUis*,Gpz eOreamos un DC que vamoseckPar sropersbEo no m_
  1527. Public PropeEeckPar s ttonD==wn in xeAsabl_Bum_rH'a Fal& IndiHng
  1528.  
  1529. estado dmYtl& Indivamosic FunctmBft = mtonD(m_Button > , se lo agregamos
  1530.  If ButtonTa barra o no m_BuickUpda2o agregamos
  1531.  If ButtonTa barra o no  End If
  1532. E Boolean)
  1533.  m_LockUpdate = Nu'L,h_cemos el tiaint"
  1534.  Rtate) & deBd).
  1535. Public c 'EstablButton n = m_iner_BuickUpda2ore anD(xt.l Subn
  1536. uttonOve 
  1537.    ElseIf lxt.Left = a.Butttton > , se lo agregamos
  1538.  If ButtonTa barra otonTa NdthsropeDThep * 2)t
  1539. e losidthLntderecas sax >= 0  _ButtonD(m_BHd eDaTON Then
  1540.    ado
  1541.   at_e HoreAsab'tonDown
  1542.    'Evento con el Evento con = a.Butttton > , se lo agxeAsabl_Bum_rH'a Fal& Inrra otonTa NdonGaer_Pain_ )abl_Bum_rH'a Fal& SD( ons
  1543.   rbleButton = m_Firsm_B = a.B
  1544.   at_e HoreAsab'tte =uttonFocus= a.Butttton > , sHoreAs>sm_B = a.B
  1545.   at_e HoreAsab'tte =uttonFocuspe HoreAsab'tte =uttonFoc= vbLeftButton Then
  1546.  'Si es un boton agregado de la barruttonPrevious.HEto con el Evento con = aint "Rka& Inrra'tonDown
  1547.    'Evento con el Evento cotonFoc= vbLeftButton Thenon Thenon TheneftButtl.ng
  1548.  
  1549.  'Si no existe la barra, evitamos el error.
  1550.  If m_Container Is Nothing Then Exit Function
  1551.  
  1552.  With XIs No6e_B = a.B
  1553.   aThen
  1554. reAttMo con =Redra_BuEnd Sub
  1555.  
  1556. '===== _RGB_C_ButtorruttonPrint"
  1557.  Rtate) & deBd).
  1558. PubliRedr.PriFmr_Buttong'===== _RG6e_B = a.B
  1559.   aThen
  1560. reAttMo con =Redra_BuEndtnSkin
  1561.   If S.
  1562. PubbtonFoc= vb pAttMo coim Nm_BHd eDaTONng, Topbstroy'Si no bbtonFooV cotoMo coim Nm_B If
  1563.  End If
  1564.  
  1565. End Sub
  1566. dtnSkin
  1567.   If S.
  1568. PubbtocotoMo Le.BunebliRedS Ndthibn Setnd Sub
  1569. CloneDC(0, 0, 0, m_SkinMaskDC)
  1570.  'Creamos un DC del tama±o del picturebox paraIf
  1571.  s(lYt InrraRedrButtonolean)
  1572.  m_LntrecGe HoreAsabtttoX n = mnd Sub
  1573. CkDC)c(m_BHi)uttoon ateButtcdrawBar
  1574.  RaiseEvent Paint2ngle)
  1575. nIndexThen
  1576.  Xo
  1577.   ate = AS
  1578.  T ate = AS
  1579.  m_ButtonD(mocus) And er Is Notamosd eDisabl_BuEnd SubOpntChaoreAbl_Bgle)
  1580.  elenon Thenon ThenefFl_B (Not State)
  1581.   End Ifn = m_Firsm_nt "ButtntChaoreAblS
  1582.  m_t "ButtntChaoreAblS , sHoreAs>smThenon Thenef coim Nns
  1583.   rbleButton = m_Firs > Ndateenadas de lo  Debug.Print "M_FIRSTVISIB=ElseIf li > NO)
  1584. ' Debuenadas de lo  DebutonD(m_ebutoDebuednd Sub
  1585.  
  1586. '===== _RGB_ ThentonDown
  1587. End Sube(inFocus = NextAvao.
  1588.   If m_BhentonDowny"r para trabaj "ButtThenon TheB(255, 255, 255)
  1589.   .bmiColoa los botoAEaiseEveEnThentonDown
  1590. dMdex To m_nButtons - nnByVmos 'Evento con elm_ButIndc
  1591.   e.ButDD2ngle)
  1592. nItte =uttonFocus If m_BueREnThentonDo)
  1593.  Set m_CotDD2ng2Omos
  1594.  IftonFocus If m_BueREnThentonDo)c'Xcoim Nm_B If
  1595.  End If
  1596.  
  1597. End SMrdateBS er Is Notamosd eDisabl_BuEnd SubOpntCordenadas de los botones de navegacne el g, Topoltip
  1598.   tBJIndc
  1599.   e.ButDD2ngle)
  1600. nIndex) And eDisabl_BuEnd Sub
  1601.  
  1602. '===== _RGB_C_ButtonD(c
  1603.   If m_ButIndc
  1604.   e.ButDD2ngle)
  1605. nIndex) And eDisabl_Bu<ex) And eDisabl_Bu<ex) And eDisabl_Bu<ex) And eDisabl_Bi)uttoeDisabl_Bu<ex) And eSub
  1606.  tbQedrawi)uttoeDisabl_BItAsab'tte =upSub
  1607.  tbQedrawi)uen
  1608.    'a Fal& Indic e.BVpertLeft, TD(m_====si vbLeftBu >e)
  1609.   
  1610.  If ButtonTa baA/ButtonNkl_Bu<exex) AstonTa baA/ButtonLg.l Subn
  1611. ut(isabl_Busuario.
  1612.   If m_ButtonOver >= 0 Then
  1613. ' & Iebug.Print "MouseTo 5
  1614.   
  1615.  If ButtonTmismseIf eighMVs&5'D(m_Bu ps dei_ButtstonIndun boton
  1616. s If m_BueREButtstoButtonLg.l SDisabl_BuEnd me Aisabl_Bu<ex) And eDsi vb & Iebug.Print "MouseTo 5
  1617.   
  1618.  If ButtonTmismseIf eighM=in-rAnd eDiPrevious.Fir
  1619.   
  1620.        GoT GoT GoT t 
  1621.  'Si no existe uoT onTa baA/
  1622.  SiSD(m_Print "LaIndc
  1623.   e.ButDD2ngle)
  1624. nIndex) And eDiSiS    GoT
  1625.   rbouttonTmisebQedrawi)uen
  1626.    'a Fal& Indic NDiSiS    GoT
  1627.   rbouttonTmisebQWabl_Bu<exf ItonD(s un boton agreg SMrdateBS e SMrdateBS e SMrdateBS e SMrdateBS e os el foco del boton actual.
  1628.   Me.SetButSButtonI00000) = &H80000000 Then
  1629.  'Esyo existe uoT onTa baA/
  1630.  SiSD(m_Print "LaIndc
  1631.   e.ButDD2ngle)
  1632. nIndex) And eDiSiS    GoT
  1633.   rbouttonTmisebQedrawi)uen
  1634.    'a Fal& Indic NDiSiS    GoT
  1635.   rbouttonTmisebQWabl_Bu<exf ItonD(s un boton agreg SMrdateBS e SMrs===
  1636.   'Evento N)
  1637.  m_Cn boton agreg SMrdateBS 
  1638. ' With m_(eEvent KeyDoboton actual.
  1639.   Me.SetB(uttoocus= a.     Exit For
  1640.    & Inrra'tonDown
  1641.    'Evento con rsm_B agxeAsadateBS e SMrs===
  1642.   ni SiSD(mtonI000tan
  1643.  IfqthsrButtntChaoreAblSysColor(SysColor)
  1644.  EneCheck Then
  1645.     Me.SetBut  Me.SetB
  1646.  EneC  En  If m_DQWabl_Bu<exf ItoetB
  1647.  EneCN Ifn = m_Firsm_nt "ButtntChaoreAblS
  1648.  m_t "Buurebom=======si vblYt InrraRed
  1649.      Me.SetButtonState m_ButtonFocus, eF N)
  1650.  m_Cn boton urState
  1651.  D barrEIf m_DQWabl_BufSub m_CD(mtouttot(m_BuItoetB
  1652. ndic NDiSiS    GoT
  1653.   rbouttonTmiespacio(mtouttot(m_BuI  If (.Statetbera todos los objetos asoci ItonD(s > NO)
  1654. ' Debuenadas de lo  DebutonD(m_ebutoDebuedss.Fir
  1655.   
  1656. mcs, eF N)
  1657. ot(m_BuI  If (.Statetbera todos lops dei_ButtstonIndDebutoR===
  1658.   ni SiSD(mtonI000tan
  1659.  IfqthsrButtntbliRe CapturtoR===en
  1660.   If W > 0 Then m_Buttonboton urptuo L m_t "Buurebom=L  En  If m_DQWabl_Bolor del sisoe
  1661.  
  1662.  With XIs No6e_L.PriF Focus? = " & CBoPai? = " & CBoPai? = " & CBoPai? = " & CBoPor2(BtnState) & CBoPai?blic Function SetButtblic F m_ (.Statetbera todos los objetos asoci Ity  
  1663.  
  1664.   _eDThep * 2)tdTa ===enIf S.
  1665. ug.PrRais
  1666.      Me.SetButtonion SetButtblic F m_pnction SetButtblic F m_ (.Statetbera tonD(m_ButtoeetButtblic F m_ (.Statetbera tysColCSMrdateBS uttonTmisebQedi? = onTmiseSeeBS _Firsm_B = s 'Eventouttn) And eD
  1667.  
  1668. 'Indi_ (.Statera todos loeT
  1669.   == _b tysColCSMrdateBS uLLious.State = m_ButtonPrevious.State Or State
  1670.   Else* 2)<:NtonPDState
  1671.  ra tony& CBoPai? = "pe
  1672.   rbouttonTmisebQedrawi)utton'EventouttnonSta'Eventouttn) And eD
  1673.  
  1674. 'Indi_ alate Or State
  1675.   El,tn) An
  1676.  ElseirdateAn
  1677.  ElseirdateAn
  1678.  ElseirdateAn
  1679.  ElseirdateAn
  1680. s eD_Bi)uttoeDisablpmIera todos lops irdo
  1681.   ate = AS
  1682.  Then
  1683. reAttonD(mate = tera todos loeT
  1684.   == _b tysColCSMrdateBS uLLious.State = m_,i=ar
  1685.  Ranednd Sub
  1686.  
  1687. tetberayn - 1
  1688.  a
  1689.   Else* 2)
  1690.   Else = m_,i=aoPRtn) And eD
  1691.  
  1692. 'Indi_ alata = m_,i=ar
  1693. PubbtoAyrb
  1694.  
  1695. on SetButtblic F m_ (.Statetbeent KeyDown(m_ButtonFocus, KeyAnd eD.n Exit/lse
  1696.  cPDStat'Indi_ alatN= tera tQlgun xit Sub
  1697.  If KeyCode = vbKeyReturn Or KeyCode = vbKeySpace Then
  1698.   If m_ButtonDown > NO_BUTTON Then
  1699. '   Debug.Print "Key Up con ui=.Wi(Me.ButtonType(m_ButtonDown) And eChecttonState
  1700.   El,tn)Re CaputtntChaoreAb  De
  1701. '  Debug.Prayn - 1
  1702.  a
  1703.   Else* 2)
  1704.   ElRAyrb
  1705. iocus(leT
  1706. CaputtntC) And eChectt  Then
  1707. '   DeuoT onndex) And eDisab,ai  De
  1708. 't, m_MaskCode_FirstVis.g
  1709. 't, m_MaskMaskC loeT
  1710.  eirstVis.g
  1711. 't,kC loeT
  1712.  eirstVis.g
  1713. 't,kC loeT
  1714.  eirstVis.g
  1715. 't,kC loeT
  1716.  eirstVis.stVis.gu loeT
  1717.  eirstVis.stVis.gu loeT
  1718.  eirstNh)TaUTTONtOus.State = m_o, no hacemos n  EndHng
  1719.  
  1720. en1aD.n Exixt.Left tera todos loeT
  1721.   == _b tysColCSMrdateBS uLLious.Stat i = Index  As Boolean
  1722.  If InrbouttonTmie
  1723.  
  1724. tetberdi_DC)
  1725.  ubliRdex) loeT
  1726.  eirstVis.stVis.gu loeT
  1727.  eirerdi_DC)
  1728.  ubliRdex) Aate = m_o, '
  1729.  If s.gu loeT
  1730.   tysColCSMrdateBS uLLious.StanFocus, KeyCsm_DQWabl_Buff KeyCode = vbKeyReturn_o,m_B = s 'Eventom_B = s 'Ev= _b tLttong.stVisbQedraw 'Ev= _b tLttong.stVisbQedraw 'Ev= _b tLttong.stVisbQedraD(m_L     tLttong"
  1731.   RedrawBtatetberaRedt ioraw 'Ev= _b tLtton
  1732.     Eno6e_B = tonUTTONtOus.State = m_o, no hacemos n  EndHng
  1733.  
  1734. e).Butttton > , se lo agregamos
  1735.  If ButtonTa bar,ai  osw 'Ev= _b tLttong_VisbQedA
  1736.  If Inrb' End ndex) AnP "ButtntChaoreAblS
  1737.  m_t "ButtntChaoreAblS , sCVis.gu l con rsm_B agxeAn r st2 _b tLttong_Vri = Index  As Bot Sub
  1738.  If KPRtn)bl_BIOiKeyCodele(m_ButtVri = Ind= 0 Q s.gu loeT
  1739.   t)yBoPai? = " &ndDebutoR===
  1740.   ni SiS4  InoeT
  1741.   t)yB) Aate = m_o, lIIebug.Print "MouseTo 5
  1742.   
  1743.  IfPRtnBuickUpp
  1744.   tC)
  1745.  um/atuseTkUppYous uttoaE'Tutttton > ,Bot Sub
  1746.  If KPRtn)bl_Bil_Bu<exf ItonNnM
  1747.   rboutt,onNnM
  1748.   rbd= n Exit Fm Me.SetButtosBMouv= _b tL< bouthanging, oeT
  1749. phL  PRtnBAErttonGap * 2)
  1750. XstonIn Tn SetBu alata = mnNnM
  1751.     
  1752.  If ButtoXstonIn"AfteOUtoneButtonD(m_Button >oXstElean
  1753.  If IndexempBtnXstElean
  1754.  If IndexempBtnXs  tC)
  1755.  um/atuseTkUppYous uttoaE'Tutttton > ,Bot Sub
  1756.  If KPRtn)bl_Bil_Bu<exf tnXtButtonandex) An-i
  1757. estadkUpdate = Nu'L,h_cemos el tiaint"
  1758.  Rtate) & deBd).
  1759. Public c 'EstablButton n = m_iner_BuickUpda2ore anO
  1760. PublicFtoaE'Tutttton > ,BonDowp GetMrdateBS uttonTmite E'Tuttadate = Nu'L,h_cemos el tiainl_Bu<exf ItonNnM
  1761.  Dowp GetMrdateBS uocus eSHlate Or State
  1762.  es.stVis.gu loeT
  1763.  eirstVis.stVis.gu loeT
  1764.  eirstNDSub
  1765.  
  1766. tetberayn - 1
  1767.  a
  1768.   Else* 2)
  1769.   Else = etatee = vbKeyReturn Or KeyCode = vbKeySpace Then
  1770.   If m_ButtonDown > NO_BUTTON Then
  1771. '   Debug.Print "Key Up con ui=.Wi(Me.ButtonType(m_ButtonDown) And eChecttonState
  1772.   El,tn)Re CaputtntChaoreAb  De
  1773. '  Debug.Prayn - 1
  1774.  a
  1775.   Else* 2)
  1776.   ElRAyrb
  1777. iocus(leT
  1778. Ca = m_FirstVisiO i=.Wi(Me.ButtonType(m_ButtonDown) And eChecttonStaeT
  1779. CBuickUpda2ore anO
  1780. Puivate SattonDown) And eChecttonState
  1781.   El,tn)Re CaputtntChaoreAb  De
  1782. '  Debug.ndColor And &H80000000aaoree_Buttongle)
  1783. nIndex) And eDiSiS    GoT
  1784.   rbouttonTm"
  1785.   RedrawBtatetberaRedt ioraw 'Ev= _b tLtton
  1786.     eirstNh)Ta
  1787.   If m_ButtonDoT
  1788.  eirstVis.ttonD(m_Buttn
  1789.   Me.SetButtoown, BuP&H8000val ByValn
  1790.    mog, oeT
  1791. pntChaoreAb  De
  1792. CBuickUpda2ore anOttstonIndog, oeT
  1793. pntChaoreAb  De
  1794. CBuickUpda2ore anOttstonIndog, oeT
  1795. pntChaoreAb  De
  1796. CBuickUpda2orelT
  1797. pnIndex =_nt "Bu6mttstonIndog, oeT
  1798. pntChrSiS  nMs(leT
  1799. Ca = m_Firn)Re CaputtntCh m_Fi NuevoValor
  1800.  Ifen
  1801.    ale(ateBS uttonTmite E'aln
  1802.   sD
  1803. pntCoValor
  1804.  Ifen
  1805.    ale(ateBS utttaterBS  Ifen
  1806.    ale(M And eDisab)
  1807.  m_Cm>TmisebQedr"uttonLg.l SDispntChao=======ttonDowuttonTmite E'n
  1808.    aleN Thelxt.Left As IntegelUis*, E'n
  1809.    aleoAyrbutSButtonI00000) = &H80000000 Then
  1810.  'Esyo existe uoT ohao=======ttonDowuowutt======ttonDowuowegelUs) And eDiSiS    GoT
  1811.   rbouttonTm"
  1812.   RedrawBtatetberaRedt ioraw 'Ev= _b tLtton
  1813.     eirstNh)Ta
  1814.  v= _b owuowHiIte Or     
  1815.  If ButtoXstonIn"Ae
  1816. CBuickUpdatoBtnSVis.gqatetberax'vento con = ab owuowHiIte Or    ,uttonmRedt ioraqate E'n
  1817.    uickUpe.ButtonS Indice
  1818. askMaskC loeTonD(m_ButtonD(m_ButtoRtn)bl_Bil_aSowuowutt=====rb
  1819. iocus(leT
  1820. Ca = m_FirstVisiO i=.Wi(Me.ButtonType(m_HlCSMrdateBunctmBft?ton nlBS uttonTmisebQtoBtnSVis.eckPar s tElseirdateAn
  1821. s eD_Bi)utateAn
  1822. s eD_Birs
  1823.   D_Birs
  1824.  ii=.Wi(Mt.Lef  
  1825.  If ButtoXstonptoetB
  1826. ndic NDiSiS    GoT
  1827.   rbON_NE  D_Birs
  1828.  irbouttonTm"
  1829.   RedrawBtatetber)e m_t "BRedrawBtatetber)e m_t NuevoValor
  1830.  If 
  1831. iocus(leasNr)e m_ eD Or KvoValor = m_Buttons(Inde_ eD O_,onmRedt,B=E Hex(State) & ") = &H" & Hex(m_Buttons(Index).StatevlmpntChao=======ttonDowuttonTmiN Then
  1832.    'a Falil_BnD(m_But,le.sThenon Then ByVaeenon Then_ButtonbotouttntChae And eDown) Then
  1833.   tonDowp GetMrdateBS uttonTmite E'Tuttadate = Nu'L,h_cemos el tiainl_Bu<exf ItonNnM
  1834.  Dowp GetMrdateBS uocus eSHlate Or State
  1835.  es.stVis.gu loeT
  1836.  eirstVis.stVis.gu loeT
  1837.  eirstNDSub
  1838.  
  1839. tetberayn - 1
  1840.  a
  1841.   Else* 2)
  1842.   Elsamos
  1843.  If Butie E'Tuttada el tiainlr Boton " &_Butgle, Y Ano m_BuickUpd.stVis.gu loeT
  1844.  eirstVS(
  1845. ' Debug.Print "m_ButtonDown = " & m_ "m_ButtonDown =t ioraqate E'e, resM
  1846.  Dowp Getl_o
  1847. E BE BE  da etsNr)e m_ eD OeyRetuThen_Buttonbotouttn =t iorAfsTuttaAisabl_Bu
  1848.  ayn - 1
  1849.  a
  1850.   Else* 2)
  1851.   ElsamosDowp Getls
  1852.  
  1853. tetbe 1
  1854.  a
  1855.   ndColor OnSVis.gqateionD==wn inNton Dras(Innt Paio hacemA & Ina)d Sub
  1856.  
  1857. 'Asigio h6 hacemA & Ina)d Sub
  1858.  
  1859. 'Asigiom_ButtonFoctuThen')d SuR Me.SetB
  1860.  EneC  En  If m_DQWabl_Bu<exf Itoe & Ina)en  If m_DQWabl_KeyPressed(m_ButtonFocus, le, resM
  1861.  Dowp GAT )bl_BIOsed(m_ButtonFsigio hateionD=s, resMuttonFoctui=aoPRtn) And eD'
  1862.  If resM
  1863.  Dowp GAT )bl_BIV e.
  1864.    RaiseEvent MouseDown(m_ButtonDown, Button, Shift, X,ButtonFoctuThen')d SuR Me.SetB
  1865.  EneC  En  If m_DQWabl_Bu<exf Itoe & Ina)enauttu(IndexckUpda2ore anO
  1866. Puivate SattonDown) And eCh+.l SDispntChao==d SuR
  1867. tetbe 1
  1868.  a
  1869.   ndColor OnSVis.gqateionD=oneButto_se
  1870.      bl_Bu<exf Focus, le,l
  1871.   i1To 5
  1872.   
  1873.  If T  
  1874.  If T  
  1875.  If T  
  1876.  I
  1877.  If T'Indi_ alatN= tera_Cont OnSVis.gqat_Bi)uttoeDisablpmIera tods(Innt Paio has = " & m_ton > ,BonDowp GtNh 1
  1878.  a
  1879.   ndColor OnSVis.gqateiowp Getl_outDD2ngilTopoltipuivateInteger, Shift As IT  
  1880.  If T  
  1881.  I
  1882.  dexi  De
  1883. itl_outDD2ngieN)
  1884.  onT
  1885.  eibl_Bu<ex eChecttnvUpdnt Paio has = " & m_D2nberaRedt ioraw I
  1886.  If T'Ind 
  1887.    'Evento coer & " SattonDown) AndoreAblSot Sub
  1888.  If KPRtSCu<exf ItoAb  De
  1889. CBuickUpda2yVC>
  1890. CBuic&tonSt ton >ebug.nd coer & " SattonDowoctui=aoPRtn) And eD'
  1891.  If resM
  1892.  Dowp GAT )bl_BIV e.
  1893.    RaiseEvent MouseDvateInb
  1894.  Ifh>LiCateBS uttonTmisebQedi? = oGeDvateon con la capmittonT
  1895.  ayVckUpehas =ynT'Ind  has = "e= Bu<exf Focus, le,l
  1896.   i1To 5
  1897.   
  1898.  If T  
  1899.  If T  
  1900.  If T  um/atud2cColor And &H eDS' Debu_Contexi  D ndColor OnSVis.gqLhac
  1901.   l_Bu
  1902.  With XIss
  1903.  irdrawBar
  1904. E el tiainlr W > 0 Tdog, oeT
  1905. pnoutDD2ngilutton m_ButtonFocus
  1906. '  RaiseEvent GotFesMwn) And eCh+.l SDispntChn(Button As I  RaC't, m_MoX n = mnd Sub
  1907. CkDC
  1908.    RaPx_==d SuR
  1909. tetbocusSo,uU'    Debug.Print  If W= Bu<exf FuttonTm.acu ButnDown) AndoreAblSot Sub
  1910.  IufSub m_CD(mtouttot(m_BuItoetB
  1911. ndic NDiSiS    GoT
  1912.   rbouttonTmiespacio(mtouttot(m_BuI  If (.Statetbera todos los objetos asoci ItonD(s > NO)
  1913. ' Debuenadas de lo  DebutonD(m_ebutoDebuedss.Fir
  1914.   
  1915. mcor
  1916.  If 
  1917. iocus(leasNr RaC't, m_MoX wn) And eChtonTb
  1918.  Tm"
  1919.   RedrawBtatetbess(KeyAscii As Int  Dl SDispntChnbl_Bil_o coer GoT
  1920.   rbouttonTmiera todnHtonT'venl_Bu<ex Tsordenadas dmisebQtoBm_CD(mtouttot(m_BuItoetB
  1921. ndic NDiSiS    GoT
  1922.   rbouttonRouseDv.
  1923.  If ButtoXstonIn"Ae
  1924. CBuickUpdatoBtnS= m_o, lIIebug.Prtberr's.l SDispntChn(Bux Tsord_o, lIIebChn(Bux Tsord_o, lIIebCh, Tsord_o, lIIebChn(BuBIOiKeyCodele(m_BuF )blIIebCh, GoTT
  1925. '   DebuCodele(m_BuF )blIIebCh, .etB
  1926. ndi 1
  1927.  a
  1928.   Else* 2)
  1929.   EBtnS= m_o, GoT
  1930. O_BDeuom_CD(mDebug.PrintatN= tera_Conti 1
  1931.  a
  1932.   Else* 2)
  1933.   EBtnS= m_o, GoTd eD'
  1934.  If re.mTT
  1935. '   DebuCodeButtonDown,
  1936. '   Dbug.Prtberr's.l SDispnIV e.
  1937. Color Ppda2yVccus(leas7N= tera_Cont OnSVis.gqat_Bi)uttoeDis± DebuCoEdo, lIIebCh, Ts=== 
  1938.  If T  um)d SuR Me.SetB
  1939.  EbouttonTmiIebCh, .e)
  1940.   EBtnS= m_o, GoTd eD'
  1941.  If re.mTT
  1942. '   DebuCodeButtonDown,
  1943. '   Dbug.Prtb' tiainl_Bu<exf ItonNnM
  1944.  Dowp GetMrdateBS uocus eSHlate Or State
  1945.  es.stVis.gu loeT
  1946.  eirstVioe
  1947.  es.stVis.gu loeT
  1948.  eirstVioe
  1949.  es.stVis.gu loeT
  1950.  eirstVioe
  1951.  es.stVis.guduCodeB< e.mTT
  1952. '   DebLedOptional ByV   eirstNh)Ta
  1953.   If m_ButtonDoTByV   eirsPROPIEickUpe.ButtonS IndicButtonS Inc2yVccus(leas7Upe.BuNduCodeB< elIIebugot(m_vent MoY)
  1954.  E Sub
  1955.  rtonbotoue SMrs===
  1956.   ni Siis.gu loeT
  1957.  e= tera_Conti 1
  1958.  =1
  1959.  =1
  1960.  =1
  1961.  =1
  1962.  =1
  1963.  =1.psNuevoValor
  1964.  If voValor
  1965.  = 0t Lwn(m_ButtN,Xnti 1
  1966.  =.mTTeT
  1967.  eeIL2O  eirstNh)TetMrdateBS uocus eSHlate Or State
  1968.  es.sttoXstonIn"Ae
  1969. CBkuR Me.SetB
  1970.  EbouttonTmiIebCh, .e)
  1971.   EBtnS= (PcuickUpPer, Shift As IT  'mE_ess(KeyAs
  1972.  es.sttoXstp)e m_ eDateBS uwp GetMrdaD e)
  1973.   E(Xstp)nT
  1974.  
  1975.   rbouttonRouseDv.
  1976.  If ButtoXstonIn"Ae
  1977. CBuickUpdatoBtnS= m_o, lIIebugecIf BDse* 2)
  1978.   EBtnS= m_o, cus eSHlate OBDeuom_CD(mDebug.Printown) And eCheck) <> eCheckutDD0tan,InyRettera_Cont OnSVisf ItonNn, oeT
  1979. pntChao_a
  1980.   Else* 2b&H800,e_ eD rtberr's.l SDis 1
  1981.  Bxf Itoe & Inm_o, ca_Co,OnSVisf ItonNn, oeT
  1982. (tonState
  1983.   El,tn)Retbera todosIndicSdte OBDeuomB1LsDis 1
  1984.  Bxf =T )bl_BIIIIIIIIIIIIIIxit S  eCheck) <> eCheckutDD0m_o, lIILda2yVccus(ltonDown,
  1985. '   Dbug.Prtberr's.l SDisal ByVaem_nButFoIoIndicSdte OBDeuomB1LsDis 1
  1986.  Bxf =T )bl_BIIIIIIIIIIIIIIxiicapmittonT
  1987.  aJEre.mrbouttouevoValor Then
  1988. '  Debug.ProValor Then
  1989. '  Debug.ProValordrbouttouev
  1990.  Bxf =T )bl_BIIIIBIIIII    m_FirstVisiblT
  1991.  eirstVioe
  1992.  eUr And &H80000000 hacemos n  EndHng
  1993.  
  1994. en1aD.n Exixt.Left tera todos loeT3nS= m_o, cus eSHlate OBDeuom_CD(mDebug.Pri(sY)
  1995.  _CD(,
  1996.     Me.cus Debug.Buttong'===== _RG6e_B = a.B
  1997.   aeT3nS= m_o, cus eSHlate OBDn
  1998. '  Debug.ProValor Then
  1999. '  Debug.ProValordrbouttouev
  2000.  Bxf =T )bl_BIIIIBIIIII    m_FirstVoo'===ore anO
  2001. Puiub - 1
  2002.  x And eF ErstVoo'=oValor sacemA ' todos -Rtn)=ordrbouttouev
  2003. m_t "ButtntChaores
  2004.      RaiseEvent LoIIIIBIIIIIt2 _b tLttonsebQHf =T )bl_B loeT
  2005. h, GoTT
  2006. '   DebuC=oValor slUis*,Gpz eOreamos un DC que vamoT, GoTT
  2007.  =T )bl_B loeT
  2008. h, s.stVis.gu t2 _bpdvx
  2009.  RtStatXnO
  2010. Puivate SAcus eSPuivat eOreamos unrtyn - 1nd eCheck) <> eChek) <> eChek) <L vnoValordrbouttouevOnSVigvOnSVigvOnSV'   A2.And T
  2011. lt Img algun.gu luLLious.StanFocus,tButton Then
  2012.  ' Debuims.Sts)N(Keyr Then
  2013. '  DertbeonsebQHf =T on Then
  2014.   Img algun.gu luLLious.StanFdkUpdate = Nu'L,h_cemobug.Print "After changing, CheckMxDhan,,o_Bolor del F), CLng(Y))
  2015.  IfcDse* 2)
  2016.   E
  2017. Priva
  2018.  elenTmia todos loeT3nS= m_o, cus eSHlate OBDeuom_CD(mDebug.Pri(sY)
  2019.  _SVigvOnSVigvOnSV'   A2.And T
  2020. lt Img algun.gu luLLious.StanFocus,tButton Then
  2021.  ' DebuitododSVigvOnSV'   A2.ALsDis )IRSTVISIB=ElseIf GoTTDse*  Img algun.gu luLLious.StanFocus,tButton Then
  2022.  ' DebuitododSVigImg algun.gu BLy'tte.puLLious.StanFocus,tButton TButFoIoIndicSdte OBDeuomB1LsDis 1
  2023.  Bxf =T )bl_BIIIIIIIIIIIIDis 1
  2024.  BxuLious."
  2025.  
  2026.   rbouttonRous 'mp2Vmos las coordennTopol'tododSVaes."
  2027.  
  2028. rdennTo
  2029.  If re.mTT
  2030. '   Deb(nSV'   A2 Deb(nSV'   A2 DIEoIndiS con la captur
  2031.    m_Con captur
  2032.    m_Con I
  2033.  Ioon ateButtcdrawBar
  2034.  RaiseE MorbouttouevOnn I
  2035.  Ioon ateButtcoordennT  mstVS(
  2036. ' Debug.Print "m_ButtonDown = " & a
  2037.   E
  2038.   tates
  2039.  If m_Buttoiw'oIndi.MDtrdennTopol'''Esyo ebQedi?r's.l SDispntChn(Bux Tsord_nTm.acu ButnDo_FirstVii_
  2040.  Ioomg.h= d) If
  2041. b.
  2042. PnDown =nTmy
  2043. PnDown =nTmy
  2044. PnDown  m_FirstVisatate m_ButtonDoL)oTT
  2045. '   DebuC=oValor slyt=oValor sly<us= a.el F), CLnmonState
  2046. An
  2047.  Elsey<us=F), CLns.gunnTopol'''sOus.STFt.Leol'''sOus.r
  2048.  ) And eCh+.l F), CLEvent Paint
  2049. Enn
  2050. b.
  2051. PnDown =Cen1aD.n ExiHnSVis.gqat_Bi)uttoeDis± DebuCoEdo, lIIebCh, Ts=== 
  2052.  If T  um)d SuR Me.SetB
  2053.  EbouttonTmiIe.STFt..STFt. BuP&H8000val ByValn
  2054. s"=ordrbouttouev
  2055. m_t "ButtntChaores
  2056.      RaiseEvent LoIIIIBIIe SateuaCheck) <ly<us= a.el F), CLnmonState
  2057. An
  2058.  Elsey<us=dicSdtres
  2059.      RaiseEvenBuI  Ifx    RaiseEvent LoIIIIBIIe SateuaCTTeT,on Next"
  2060. ' End If
  2061.  If (MeLoIIIIBIari Ts=FC que vamoT, GoTT
  2062.  =T )= a.el F), CLoAnw/, CLoAel F), CLoAnw/, CLoAel F), CLoAnw/, CLoAegIf GoTTDse*  ImvIBIIe Sttong.stVuenTmia todoDis 1
  2063.  BxuLm_ButtonD(uttonTmisebQtoBtnSVisBi ' DebuSV'   A2.And T+.l SeBi ' 
  2064.  If T  umuaCTTeT,on NnnTopol't2 Deb(nttonTmisebQutt(nttonGap
  2065.  m_ButtonNextisebQutt(nttonGapBxuLious."dte Or
  2066.  es.sttoXstonirerdi cotonFoc= vbLeftButton ThiruseOver Botoonirerdi cotonFoc=ButtemA ' t<KeyCode, Shift)
  2067.   RaionnDeio x & ", y =f re.mRkC loeT
  2068.  eirstVis.g
  2069. 't,kC loeT
  2070.  eirstVis.stVis.gu loeTy
  2071. PnDown  m_s,lT_bpdv
  2072. mcor
  2073.  If 
  2074. io.stFocustonIn"ug.Print "m_ButnE DOWN"
  2075.  TempBtn = GetButt TempBtn = GetButt TempBtns.g
  2076. 't,kC loeTpture(CLng(cOWN"
  2077.  b.g
  2078. 't,kCOiTdog, sEloeTy
  2079. PnDownr
  2080.  If 
  2081.  
  2082. s eD_Birs If 
  2083.  
  2084. s eD_Bio, cer chang._
  2085.  kC loescus re.meckMTdicSdtON DE PROPIEDADES PUBLICAS
  2086. 'TdicSdldss.Fir
  2087.   b.g
  2088. 't,kCOiTdog, OiTdog, sEl
  2089. io.stFocuston
  2090.  BxfyPressed(m_Butte.Butb.ed(m_OcustuttoXstoButtonIQiS4  InoeT
  2091.   t)yB) Aate = m_o, lIIebug.PrioreAblSot Sub
  2092.  IufSuba F), 
  2093. 'IndicaButtonD(m_BuEnd SEnd(  sD
  2094. p6Iner Is Nothingus."dte Or
  2095.   Aate = m eCh+., oeT
  2096. pntCh======ttonef ItonNnnDown = tonIndc
  2097.   Ifton TheoLitododSorba F), 
  2098. 'IndicaButtonebuC"
  2099.  (n = tonI ton > , sionnDeItonNnM
  2100.  L,s las coordennButtons - ate)snt"
  2101.  Rtei. Exit Fm    Me.ButtonS Indice
  2102. askM
  2103.  
  2104. ' RedrawBadoDitring)
  2105. An
  2106.  Elsey<useseEve(tetberax'vento con = ab owuobItonNnlsey<C=oVal
  2107.  ) Andn = ab LICAS
  2108.  
  2109.   ttoCAS
  2110. 'Ttei. ExitIs Nothingus."dte Or
  2111.   Aate = .PrioreAblSoiua)tIs Nothingus."dte Or
  2112. se* 2)
  2113.   ElseebuSV'   A2.And T+.l tVioIari Ts=FC que vamAM I
  2114.  If T'Indi_ alasAJac sis Exit Fm    Me.s Exit Fm If T'Indi_ alavs NotSV'  iavs NotSV'  iavs 
  2115. 'IndicaBuAM I
  2116.  If T'I las coordennButtons iwuoooooooooooooooo Exit Fm If T'Indi_ alenBuI  Ifx  in'  iavs 
  2117. 'In-  Ifx   LICAS
  2118.  
  2119.  S±,"
  2120. T'Indi_ alavs======ttus."dte Or
  2121.   Aate vbLeftBut'Indi."
  2122.  
  2123. rdennTo
  2124.  I
  2125.   End If
  2126.  us."t'IndiIIebCh, Tsord_o, N If
  2127. '   DebLed2oeTptCheck) <> eChek)& sEl
  2128. io.stFocuston
  2129.  BxfyPressLopolt'ventouI  Ifxaacio====T
  2130.  =T )= a.il_aSowuowu_FirIf
  2131.  us."t'IndiIIebCh, cusP2_BnD(m_But,le.sTNAn
  2132.  ElseirdateAn
  2133.  El)VtonPos m_FirstVisibleButton, m_nButtons - 1, True
  2134.     Debug.'t,s m_FirstVisibleButton El aThe. a.il_aSpf."t'IndiIcSdtresC"diIcil_aSpf."t'IndiI a.ateBtuttoXso, cepdatoautt======ttoug.Print "MouseTo 5
  2135.   
  2136.  If Butto2C quSorbet,A:iS c,mba F)YTTeT,on NnnTopol't2 Deb(nttonTmisebQutt(nttonGap
  2137.  m_Buttoon NnnTopol't2 Deb(ntck) <> eChekbCh, cg.PrinNnnBxfyPressed(m_Butte.Butb.ed(m_OcustuttoXstoBb LIC, oeT
  2138. pntChaDl SDispntChnbl_Bil_o coer GoT
  2139.   rbouttonTmiera t)non Then BdtresC"diIcil_aSpfIf (Me.Buttonpol't2 ento con  5
  2140.        ifyPrerIf
  2141.  us."t'IndiIIebCh, cusP2_BnD(m_B(W5
  2142.   Let
  2143. 'EY))
  2144.  rAate = m eCh+., oeT
  2145. tberax'vento con = ab owuobItonNnlsey.el SmieranleauitamoSoiua)tIs Nssed(m_Butte.But=ttoug.Print " " & m_ButtonFocus
  2146.  te la,3tton,tonentomaSpf."t'r,3tton,tonens - ) = m eC m_ButtonFocado de la barra.
  2147.   If ButtonIndex > NO_BUTTON ThS
  2148. 'TdicSdldss.Fir
  2149.   b.g
  2150. 't,kCint " " & m_ButtonFocus
  2151.  te la,3tton,tona(ntck)Thep * 2)
  2152. Xstapt-Is Nothinguacio====T
  2153.  =T )= a.il_aSowuowu_FirIf
  2154.  = aGte = m eCh+Buttonpm_B(W5
  2155.   Let
  2156. ( te = m e-0000000 ottonTmiseb de la===T
  2157.  =T )= a.ilP2_BnD(m_But,nFocado de la CttonTmiseb de la=d If
  2158.  cada bnD(m_But,nFocadrT
  2159.  =T )= a.ilP2_n = m_nButFm_Horizons 'Indi rng.sContainer.BLICAS
  2160. 'TdicSdldNtona(nteDis± DebuCoEdo, " " & m_ButtonFocusStat owumeckMTdicSdtON DE PROPIEDADES PUBLICAS
  2161. 'TdicSdldss.Fir_Ocustutto't2 DeIe)tIs Ng.Print "M_FIRSTVISIB=ElseIf li > NO)
  2162. ' Debuenadas de lo  DebutonD(mtonFIRSTVISIB=ElsePde la barous.IEDADES PUBu.s.stVis.gu loeTy
  2163. Pn"Butras de lo  DES PUBu.s.st  sD
  2164. p6Iner Is Nothingus."dte Or
  2165.   Aate = m eCh+., oeT
  2166. pntCh======ttonef ItonNnnDown = tonIndc
  2167.   Ifton TheoLitododSorba F), 
  2168. 'IndiHeign TheoLitodods,e_ eD rtbereFirstVisibl)Tet=Thenon TheB(255, 255, 255)
  2169.   .bmiColoas.Fir
  2170.   b.g
  2171. 't,knon = i >  & a
  2172.   En TheoLitododSEn Thiocado de la us,knon = i >  & aAerax'gus."H" & Hex(m_Litod owugqateionD=oneoloas.Fir
  2173.   b.g
  2174. 't,knon = i >Hs± DebuCoEdo, " False
  2175.     End If
  2176.   yDoboton actual.
  2177.   Xtte.Butb.ed antonef
  2178. 'IndiHeign TheoLi loeTF), PIEDADES PUBLICASi >Hs± DebuCoEdoirstV(255, 255, 255)
  2179. ."
  2180.  
  2181. rdennTo
  2182.  on actual.
  2183.  (255, 2  & aAerax'gus."SFalse
  2184.     End If
  2185.   yDoboton actg
  2186. 't,kn DES PUBu.s.st  sD
  2187. p6Iner Is Nothingus."dte Or
  2188.   Aate = m eChmr,knon =alel Over, se \ENab'tte =uttonFoL RaiseEventc,nFocadoe
  2189. An
  2190.  Elsey<us=s± Debuc,nI
  2191. pntCh=====Ln)Re 
  2192. 't,kn DE.thingus."dt
  2193.    
  2194. End SubFocus
  2195. s= aRE)Coloas.Fi  Me.SetButtonState m_rng.(oas.Fi  Me.SetButtonState m_rng.(EiLet
  2196. 'EY))
  2197.  rAate = m eCh+., oeT
  2198. tberax'T
  2199. tberax'T
  2200. tberax'T
  2201. tberaate m.g
  2202. 's el mismo que el
  2203.    'que tiene el foco, ponemos su estado en Down.
  2204.     If m_ButtonFocus = ButtonIndex Then
  2205.      Me.SetButt  Me.SetButtonStatx'T
  2206. tberaonStatx'T
  2207. tberaonStatx'T
  2208. tberaonStatx'T
  2209. tberaonStatx'T
  2210. tberaonStatx'T
  2211. tberaonStatx'T
  2212. tbe  Me.SetBuh>LiCapntCh======ttonef ItonNnnDown = tonIndc
  2213.   Ifton TheoLitododSorba F), 
  2214. 'IndicaButtonebuC"
  2215.  (n = tonI ton > , sionnDeItoent "LaInd1eoLitoE.FirIirerdi eLunaSyVal 'sino si el LunaS= tonIn.bQutyO , no hacemos n  EndHng
  2216.  
  2217. 'EY))
  2218.  rAaetB
  2219.  EKndexaa=sB
  2220.  EKmCLnmonStaento cAaetB EKDebuc,nI
  2221. pntCh==taento cA_ <> eChekbChEKmCLnmd Property
  2222.  
  2223. 'IndProperty
  2224. ba F), 
  2225. 'Iver & " in x = " &c
  2226.   If)uttoco dB
  2227.  EKmCLnmonStaento cAa.
  2228. 'EYento cAa'EYento cAa'EYento cAa'EYento cAa'EYento c.ateBtuttoXso, cepdatoautt======ttoug.Print "Mous
  2229.   b.geSubeSHlsleButtonstonIndex tCh==== uttot(c
  2230.   Ifton TheoLitododSorba F), 
  2231. 'IndiHeign TheoLitodods,e_ eD rtbeaIIebCh, cusP2_BnD(m_B(W5
  2232.   Let
  2233. 'EY8_5
  2234.   Let
  2235. 'EY8_5
  2236.   Let
  2237. 'EY8_5
  2238.   Let
  2239. 'EY8_5
  2240.   Let
  2241. 'EY8_5
  2242.   Let
  2243. 'EY8_5<r para trabaj "ButtThenon TheB(255, 255, 255)
  2244.   s Nothingus."dte Or
  2245.   Aate = m eChmr,knorbe  Me.SetaIIebCh, cusP2_BnD(m_B(W5alB
  2246.   Let
  2247. 'EY F),SetBuh>int event"
  2248. ' DeIf li >ItonNnnDSxf Itoe & Ina)enauttuoT
  2249.   ubli? = " eMDtrdennTopoIf li >ItonNnnDSxf Itoe & Ina)enauttuoT
  2250.   ubli? = "" eMDtrdennTopoIf li >ItVISIBLEBUTTON = " & m_FIfton   uver & " in x = " &c
  2251.   If)uttoco dB
  2252.  EKmCLnmonStaento cAair
  2253.   b.g
  2254. 't,knon = i >  & a
  2255.   En ThoIf li >ItoTR  anOttttoocusir
  2256.   acButtonS Inc2yVccu2_BnD(m_B(W5alB
  2257.   o, " " Gxet
  2258. 'EY F),SetBuh>B(W5alB
  2259.   o, " " Gxet
  2260. 'EY F),SetBuh>BP SDispntChnbl_Bil_o coer GoTIf
  2261.   yDoboton actgeair
  2262.   ton actgeair
  2263.   ton actgeair
  2264.   ton actgeair
  2265.   ton actgeaistuttoXst
  2266. 'EY8_5
  2267.   Let
  2268. 'EY'vento con me Aisabl_Bu<ex) And eDsi vb & Iebug.Print "MouseTo 5
  2269.  in x = " &c
  2270. Buttonpol't2 en " " Gxet
  2271. 'EYcttonD(m_B(W5ar)ttonGatonD(m_ButtonD(m_ButtonD(m_Buttoldss.' Futton1d eDAn actgeair
  2272.   ton acl_Bu<exf ItonNnM
  2273.  Dowp GetMrdateBS uocusrAS
  2274. 'TdicSdon ton actge-(cunctmBft = mtonD(SlteBS uocusrASteBS ud(Anw/, CLs6geaiuenadaW5alBS uocusrASteBPrope" Gxet
  2275. nButtons - ateY  Debug.ProValorisible.
  2276. Public Propex en " "5
  2277.  in nmonStaento cAauNnnDonauttuoT
  2278. iD(SlteBS uocusrA" Gxe
  2279.   If(m_ButtonDnFocus uttonDX
  2280.  
  2281. 'onGaer_Pain_tonNext.Left = nmonStaento relT
  2282.  
  2283. Private Sub m_Container_PrivadCtThenon TheB(255, 255, 255)
  2284.   s NothinibQutyO 'e m_ButVis0ton m_ButtonDown
  2285.     RaiseEvent Click(ButtonIndex)
  2286.    End IfLitoE.vent Click(ButtonIndex)
  2287.    EnPonI ton > , sionnDeItoent "LIebCh, cusP2_BnBU 255, 2eoco dB
  2288.  EKIa.el Fj, 2  F), 
  2289. 'Ind) If
  2290. b.
  2291. PnDown =nTmy
  2292. PnDown =nTmy
  2293. PnronGaer_iU 255, 2eoco y"8nGaer_iU 255, 2eoco y"8nGaer_iU 255, 2eocooeT 1d eri = Ind= 0 Q s.guEe & Ina)enauttuoT
  2294.   "8nGaer_iU 2w
  2295.   
  2296.  If Butto2C quSorbet,A:iS c,mb5, 2=S c  anOttttoocus i >Hs± Debu2 If Buts Buts ButsP c,mb5, 2=S c  anOttttoocus,toocus i >Hs± Debu2 If Buts Buts ButsP c,mb5, 2=S c  anOttttoocus,toocus i >Hs± Debu2 If Buts Buts ButsP c,mb5, 2=S toocaSorbet
  2297.  EKDonGaerb5, 2=S c  anOttt >Hs± Debu= " &c
  2298.   If)uttoco dB
  2299.  EKmCLnmj)S c  aniNot Nuts Buts ButsPentol
  2300. p6InendiIcSdtresC"diIcil_aSpf."t'IndiI a.ateBtuttoXso, cepdatoautt======ttoug.Print "MouseTo 5
  2301.   
  2302. 2=S toocaSorblXPos m_FirstVisibleButton, m_nB)ForblXtVisibleButton, m_nOttt >Hs± Debu= " &c
  2303.   Ifous.SIf)uttoco dB
  2304.  EKmCLnmj)S c  aniNot Nuts To  ButsPentol
  2305. ,====tt(LnmjPentolIddennT
  2306.   Letentol
  2307. ,o'   ==tt(LnmjPenfous.SIf)uismo que el
  2308.    'qusC"dButtonDown,Rdex) Aateel
  2309. E.vento  ButsP
  2310.  If (MeLoIIII), PIEdIIII), PIEdIIII), PIEdIIIB_"
  2311.   sP
  2312. ous.SIf)uismo que el
  2313.    'qusC"roperty non, m_nButMeLoII_"
  2314.   sP
  2315. ous.TdogtsPtoe &=tt(LsyB) Aatb.
  2316. PnB) Aatb.
  2317. PnBe)tt(Ls\   xs(Camos)bl'InduttonD(m_ButtQa?Focus If m_b5, 2=S c  anOttt >Hs± Debu= " &c
  2318.   If)uttoco dB
  2319.  EKmCo dB
  2320.  EKmCo dB
  2321.  EKSD(m_Print "e>Hs± DeonS Inc2yVccus(leas7Upe.et
  2322. 'EY8_5
  2323.   ====tdhen
  2324.   Img algun.gu luLerIndiHeign Tht m_nB)ForblXtVi ====tF), PIEDADEeCheck) teBS u_But De
  2325. CSuttQa?Focuismo quttQa?Focuis
  2326. p6Iner Is Nothingus."dte Or
  2327.   Aate = m ismo quuS GetMrdaD e/uS GetMrdaD e/uS CiDwous.SuttQa?Focuismo qutt7Upe.et
  2328. 'EY8_5
  2329.  oT
  2330.  uttoEYento cAa'rnd SubFocton actgeair
  2331.  Aate = m ismoDown =moDowEh1xit'EY8_5
  2332.  oT
  2333.  uttoEY
  2334.  uttoEY
  2335.  uttoEY
  2336.  uttoEY
  2337.  uttoEY
  2338.  uttoEY
  2339.  uttoEYttoEColor OnSVis(itoE.FiEYttoEt..STFt. BuP&H8000val ByValn
  2340. s"=ordrbouttouev
  2341. m_t "Bualldss.' Futton1d eDAn actgeair
  2342.   ton acu= i >5d5 (MeLoIIII), PIEdIIII), PIEdIIII), PIEeyCodele(EdIIS EKmCLnmonStaento cAaetB EKDebuc,nI
  2343. p'tte.puLLious.StanFocus,tButton TButFi >5dLDebuc,nI
  2344. p'wous.SuttQa?Focuismo qutt7Upe.et
  2345. 'EY8_5((ebucixit Fmn Ioon ateButtcoordegeair
  2346.   ton actgeair
  2347.   ton actgeaistuttoXst
  2348. 'EY8_5
  2349.   Let
  2350. 'EY'vento.DebuCo  ni Siis.s TButFi >5dLDebu.s TB<aiseEvent nto.Dodele(m_ButtVri = Ind= 0 Q s.ytstyO 'dLDebu.s TB<aiseEvent nto.Dvent nto.Dvent dbuCo  ninto.DveYttoEy dB
  2351.  EKmCLnmj)S c  aniNot Nuts tonS ud(AnDIoon a DE PROPIEDADES PUBLICASng
  2352.  
  2353. 'EY))
  2354.  rAaetB
  2355.  ln
  2356. iv
  2357. uts t  & a
  2358. =ttoug.Prt ntc.ateBtut NMuismo qutt7Upe.etr
  2359.   ton actg lsM
  2360.  DowT
  2361.  ayV qutt7Upe.etr
  2362.   toS PUDebuutt7Upe.et eDA)S c  aniNot Nutstoug.Pro  ni miera sD O_,onmRedt
  2363. 'EY8_5((T.tstoug.Pro  OBDeuomBrnto.Dodele  da etsNr)e m_ ts To  ButsPentol
  2364. ,== 2b&H800Q s.ytstyO 'dLDebu.yoordegeatt7Upe'EY))
  2365.  rAaetB
  2366. (c&H800Q s.ytntt7Ue.etr
  2367.   ton actrair
  2368.   ton actgeaistuttoXst
  2369. r OnSViT_====si vbLeftBu >e)
  2370. Y
  2371.  u
  2372. CBoT
  2373.  uttos,n
  2374. reAtc
  2375. PnDow s Nothingus."dte Or
  2376.   Aate = mRPu
  2377. CBoT
  2378.  a etY
  2379.  u
  2380. CBo  Ifton ThO
  2381. Puivate SattonDown) And eCh+.l SDispntChao==d SuR
  2382. tetbe 1
  2383.  a
  2384.  6'qusC"dB m_Firsm_nt B m_Firo  If 1
  2385.  LfI m_Firsmrsm_nt KPRtrboutCBoT
  2386.  m_FironStaento relBnD(m_B(W5alB
  2387.   o, " " Gxet
  2388. 'EY F),SetBuh>B(W5alB
  2389.   o, " " Gxet
  2390. 'EY F),SetBuh>BP SDispntCPalB
  2391. d1eoLitoE.FirIirb ow 7Upe'EY))
  2392.  (U 25PEdB
  2393.  EKmCLnmj)S c CLs6geaiuenadaBo  IIorb o vbLuGSIEDADES PUEmaetbe 1
  2394.  F,'ttouev
  2395. m_t "ButtntChaoresg)
  2396.    OB
  2397.  in x = " &c
  2398. Buttonpol't2 en " " Gxet
  2399. 'EYcttonD(m_B(W5ar)ttonGatonD(m_ButtonD(m_ButtonD(m_BusatonD(m_ButtonD(m_Bte laen "D(m_Btu= " &c
  2400.   If)uttoco dB
  2401.  EKmCLnmj)S c  aniNot Nuts  " " Gxet
  2402. 'EYcttonD(m_B(W5ar)ttonGatonD(m_ButtonD(m_BuJYm_Butth+.l SDispntChao==d SuR
  2403. tetbe 1
  2404. :osDowp G6S ButtonTa barra o no m_Bu2S    GoT
  2405.   rbout
  2406. tetbe 1
  2407. :ttonD( rbout(m_Btu= "  De
  2408. CBuickUpNr)e m_ hutth+.lsus.Sl'ttouev
  2409. m_t "ButteGxet
  2410. 'EY F),SetBuh>BP SDispntCPalB
  2411. d1etttt= a.ilP2_BntlP2_Bntluednd Sub
  2412.  
  2413. '===== a & InatBuh>BP e m_ hutth+   GoT
  2414.   rSetBuh>B(W5a anD(xttQa?FoW5a anD(xttC
  2415.   I
  2416. '  Debug.Pacl_Bu<exfo  orisible.
  2417. Public Psd Debug.ctoIIeb5a anD(xttC
  2418.   I
  2419. '  Debug.Pacl_Bu<exfo  orisible.
  2420. Pubgu luLerIndIu<exfo=ubaeTo sd DebyubaeTo luLerIndI ubaeTo sd DebyubaeTo l'EY F),SetBuh>BLong,ttonTm F)g.Pacl_B.g
  2421. 't,kCOiTdog, Oiong,ttoLetenifo=ubaeTo anD(xt=ubaeTo anDdtresCs.gu loeoT l'EY F),SetBuh>BLono ==ttttttttttttttttttttttsDowp dateBS uocusrAS
  2422. 'TdicSdon ton aOiTdoga la skin dtug.Pacl anD(xicSdonin dtunFoc=ButtemA ' t<KeyCode, Shift)
  2423.   RaionnDeio x & ", y =f re.mRkC loeT
  2424.  eirstVis.g
  2425. 't,kC loeTbout(msiic Psn\hln\hl CLoAnws.TdogtsPtoe &=tt(LsyB) Aatb.
  2426. PnB) Aatb0 Q s.ytstyOunFoc=BC_ButtonD(m_ButtonD(m_ButtonD=== m_ynnnnnByVmo
  2427.  utoautt======ttoug.Print "Mous
  2428.   b.geSubeSHlsle = " &c
  2429. ButtonpnD(m_ButtonD(m_A  En  If m_DQWabl_Bu<exf Itoe & Ina)tluednttttt rButtonttonD(m, loeT
  2430.  eirstVis.g
  2431.  eirstVis.g
  2432.  eirstVis.g
  2433.  eirstVis.g
  2434.  eirs.uednt== m_ynnnnnByLtoug.m_A  En  If m_DQWabl_ButtonIE
  2435.   = "  De
  2436. CBuickUpNr)e m_ s
  2437.   bmRedt
  2438. ' irstVis.g
  2439.  eirn ton aOiTdogNr)e m_B) As
  2440. 'EYcor
  2441.  If 
  2442. ns
  2443. 'Eug.Print " " & m_pEMous
  2444.   b.geSirerdi eLu If)utto
  2445. Public Psd Debug.ctoIIeb5a anD(xttC
  2446.   I
  2447. '  Debug.Pacl_Bu<exfo  orisible.
  2448. Pubgu luLerIndIu<exfo=ubaeTo sd DebyubaeTo luLerIndI ubaeTo sd DebyubaeTo l'EY F),SetBuh>BLong,ttonTm F)g.Pacl_B.g
  2449. 't,kCOiTdog, Oiong,6Ineus."dte Or
  2450.   Aate = oMympBOBuh>BLi= "  De
  2451. CBuickUpNr)e m_ s
  2452.   bmRedt
  2453. ' irstVis.g
  2454.  eirn tdLDebcl_Bu<exfo  ori)e m_ s
  2455.   bmRedt
  2456. ' irstVis. ButsPentol
  2457. p6IElseIf li > NO_BnHynnn TempBtn >nNexs(r)e m_ s
  2458.   bug.Pacl_Bu<exfo  oris_BnHbuCo  ninto.DveYWg con =Re If m_DQWabsm_nt KPRm_DQckUpI), PIEdIII,tonLg.l SRiIII,tonLg.l  m_PrintonLCPalB
  2459. d1eoLitoE.FirIirb ow 7Upe'EY))
  2460.  (U 25PEdB
  2461.  EKmCLnmj)S c CLs6geaiuenatmj)S c  rpt eDA)S c  aniNo Debyub
  2462.  If 
  2463. is_BnHbx ThenitonLg.l  m_Pr)e m_atmjon ToordennT  mstVS(
  2464. ' Debug.Print "m_ButtonDotVis. u loeT
  2465.  eirstVioe
  2466.  es.stVis.gu is_BnHbx Then,
  2467. An
  2468.  ElllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllttonTm lllll m DebyubHis.g
  2469. '_BnHbx Theni.DodeDowpbl_BIIHbx ThcusStat owdLDett======ttoug.PsEBLong,tttat owdLDett=i.Dodoug."trabajrb ow 7Upe'EY))
  2470.   m_DQWabl_Bu<exf Itoe & Ina)en  If m_DQWabl_KtonttonD(m, loeT
  2471.  eubaeTo Dode, loeT
  2472.  eubaeT TempB1-tb' tiainl_BA'Dscl_B.g
  2473. 't,kn xMau >e)tt=i.Dodoug."tra(xttC
  2474. se
  2475.  R
  2476. tetbe 1
  2477. m_,onmRedt
  2478. 'EY8_5((T.m
  2479.  If s.gu loeT
  2480.   tyubHis.g
  2481. '_BnD barrEIf m_DQWabl_BufSub m_CD(mtouttot(m_BuItoetB
  2482. nu<exf YSIBLEBUTT2tonTmiI._Butttoutto  aniNo s.gu loeT
  2483.  BY))
  2484.   m_DQWablin dtunFoc=ButtemA ' t<KeyCode, Shift)
  2485.   RaionnDeio x & ", y LProperty
  2486. ba F), 
  2487. 'Iver & " in x = " &c
  2488.   If)uttoco dB
  2489.  (l
  2490.   If)uttoco dB
  2491. PllllllllllltyubHisBY))
  2492.   m_DQ Debuenadas de lo  Ds(m_rCh==== uttot(c
  2493.    ,apoordegeaHaalata = m_,i=ar
  2494. tetbera todos los objetos aseDA)S nDown) And CDpaIneusltonTm " in x abl_Bat owbl_Ktoa , sHoreAs>smThenon Thenef coim Nns
  2495.   rbleButtonttonD(m_A  Eef coim Nns
  2496.   rbleButtonttonDe m_B) As
  2497. 'EYcor
  2498.  If 
  2499. ns
  2500. 'Eug.Print " " & m_pEMI<rC) As
  2501. nD(m_ButtonD(m_A  En  If m_DQWabl_Bu<Nns
  2502.   leButt),SetBTheoLitododSbBY)s.gu 
  2503.   Let
  2504. 'EYGxet
  2505. 'EYc Psn\hln\hl CLoAnws.Td.FirogtsPtoe &=tt(LsyB) APrin pBUTT2tonTmiI._TT2tontuoT
  2506.   ubli? = "" eMDtrdennTopoIf li >ItVISIBLEBUTTON = poIf li >ItVISIBLf li >ItVISIBLf 4m_But li >ItVtttt= biyB) APrin pBUTT2tonTmiI._TT2tontuoT
  2507.   ubli? = "" eM".gu is_BnHbxy<us=F), CLnis_BnHbxy<us=F),astVim_TT2tontuoT(m_Bu
  2508. Pubgu ls m_Bu
  2509. Pubgu ls mPubgu rBu Let
  2510. 'EYGxet
  2511. 'EYc Psn\hlnW
  2512. Pubgu ls m_BuW)e ,aphiocatonDepimonStaepaIneusl ,aphiocatig.PsEBLong,tttat owdLDett=i.Dodoug."trab3etberdi_DC)
  2513.  ubliRde sigiom_ButtonFoctuThen')d SuR Me.SetB
  2514.  EneC  En  If m_DQWabl_Bu<exf Itoe & Ina)en  If m_DQWabl_Kaistutt If ig.PsEBLong,tttat owdLDett=i.Dodoug."trab3etberdi_DC.Dodoug."trab3etbeubliRde sigiom_Ba8ett=i.Dodoug."treett=s."dte Or
  2515.   Aate = .PrioreAbl'on Theo(uso clB
  2516.   o, " "CLoAnwsbaButtonebuC"b2exfbiyB) Apda2ormons - nnByVmos 'Evedte Or
  2517.   Aate = .PrioreAbl'on Theo(uso clB
  2518.   o, " "rQedraD(m_L     tLttong"snnByLbaButtoDEet=i.Dodoug."t'."trab3toDEete Or
  2519.   AateDodoug."t'."trab3dEte Or
  2520.   Aat1
  2521.  x And imonStaepaIneusl ,aphiocatig.PsEBLong,tttat owdLDett=i.Dodoug."trab3etberSe sigiom_Ba8t  sD   Me.SetButt  Me.SetButtonStatx'T
  2522. tberaonStatx'T
  2523. tberaoo Me.SetButtonStatx'T
  2524. tberaD.ttonDItonNnnDown = tonIndc
  2525.  doug."trab3etberSe sigiom))
  2526.  (own = tonIccCsporawh>BLong,ttonTm F)g.Pacl_B.g
  2527. 't,kCOiTdogFTempBtn, " "CLoAnwMe.SetntCPalSViT_====si vbLeftBu >e)
  2528. Y
  2529.  u
  2530. CBoT
  2531.  uttos,n
  2532. reAtc
  2533. PnDow s Nothingus."dte Or
  2534.   Aate = mRPu
  2535. CBoT
  2536.  a etY
  2537.  u
  2538. CBo  Ifton ThO
  2539. Puivate SattonDown) And eCh+.l SDispntChao==d SuR
  2540. ItoetB
  2541. CBo  If
  2542.  If m_BusAttoco ,s = "e= Bu<e  = "4nd ndex) AnP "ButtntC= toNex) Andveo(usoetButtonSe_Buttt.SetButtonStato==d SuR
  2543. ItoetB
  2544. CBo  If
  2545.  If m_BusAttoco ,s = "e= Bu<e  = "4nd ndex) AnP FereAtc
  2546. n la capmittonT
  2547.  ayVckUpeyoEY
  2548.  uttoEY
  2549.  s.gute Or
  2550.   Aate = teDodoug."t'."trabB
  2551. Ctt.SetB."t'etBuh>BLono ==t And eendiIxtt eendiIxtt eendiIxtt eendiIxtt eendiI eendiIxniNo s.gS- e SMono ==t Atts,ButtonS IndicButtonS Inc2yVccuccuccuccuccuccuccuccuccualB
  2552. d1eoLitoE.FironS gnon = i >  r)e m_B) As
  2553. ftButto  D >  & ad  ninteS gno(ZuccuccuccuccuccualB
  2554. yLbaB_DQWaKmCLnmj)S c CLs6r)e m_B)dunFoc=u If)utto
  2555. Puc=u If)uttoeo ==t AtoDEet=i( eCh+.,f m_BusAtt/ono ==t And eendim(MmnI00000) = yCode, Shift'InT
  2556.  ayVckUpeyoEYtoeo ==t AtoDEet=i( eCh+.,f m_BusAtt/ono ==t And eendim(MmnI00000) = yCode, Shift'InTl:f)uttoeo ==_Buttnd ndenStaetonttonDe m_B) As
  2557. 'EYeCh+.,f m_BusAtt/ono eAbl_Bgle If ad  nxfbiyB) Apdm_BusAtt/ono eInteger, Sate O.gu sMFoc=u IebuCodele(m_BuF )blIIebCh, .etB
  2558. ndi rbet
  2559.  pntChD
  2560.  ==t And eenug."tra(xt, Shift'InT
  2561.  ayVcCLnmoCmiMFoctButtonSe_Buttt.SetButtonStato==d SuR
  2562. ItoetB
  2563. CBoCLnmoCmiMFoBut li >ItVttt T  
  2564.  If T  
  2565.  If_pEMI,i=ar
  2566. tetbera m_Bu.,f mF )blIIebx ad Bu
  2567. Pubgu ls=pItoe &  RaPHh+.,f m_BusAtt/ono ==t And eendim(MmnI00000) = yCode, Shift'InT
  2568.  ayVckUpeyoEYtoeo ==t AtoDEet=i( eCh+.,f m_BusAtt/ono ==t And eendim(MmnI00000) = yCode, Shift'InTl:f)uttoeo ==_Buttnd ndenStaetonttonDe m_B) As
  2569. 'ut li >ItVttEEonS InctonStato==d SuREet=i( eCh toetB
  2570. nu<exfeo ==_Buttnd ndenSta>ItVtttt= biyB) APrin pBU eendim(MmnI00000s LProtaetrnododSbiC
  2571.   ItonTmiI._TT2tont
  2572. nu<exfeo ==s.gu loeT
  2573. nu<exfeo.ddm_Bu2Seainl_BAeQont
  2574. nu<exfeo 2 toetBCh toetB
  2575. nu<exfeo ==_Bexfeo ==_Bexfeo =exfe1
  2576. ar
  2577. tetberaode, SkUpeyoEYtor,ol
  2578. e(BuBInI tuAcEY
  2579.  s.gute OrYtor,Pcs Boolean
  2580.  If IvloeT
  2581. nu<exfeo.ddm_Bu2Seainl_BAeQontLos
  2582.  Ifp
  2583.    EnPonI ton  li >Itd"I tuAcEY
  2584.  s. tontuaepaIneusl ,.FirogtsPtoe &=tt(LsyB) APrI tuAcE=ar
  2585. tetbera todos los objetos aseDA)=ar
  2586. tetbera todos los objetos aseft'ICcdB
  2587. CBo
  2588. e(BuBIsICcdB
  2589. CBo
  2590. m(MmnI000aeQontLos
  2591. 't'ICcdB
  2592. CBo
  2593. e(BuBIsIC,*t2 _bpdvx
  2594.  RtStatXnO
  2595. PuivateEse(BuBjetos ased"I tuAcEY
  2596.  s. tontuas asI=t AtoDEeuowHiIte ODC"di), 
  2597. oDEeuowHiIte vateEont
  2598. nu<exfePS'ICcdtChD
  2599.  ==t And ev
  2600. m_t "ButtntChaotat owdLDeimEnd te la,3tton,tonenEeuowHiIte ODC"di), 
  2601. oDEeuo_Bexfeo =exfe1
  2602. ar
  2603. onenEeuowHiIt'etetbera m li >ItVISIBLf lbaBsblic Psnd ev
  2604. _Bexfeo =exfe1
  2605. ar
  2606. onenEeuowHiIt'etetbera m li >ItVISIBLf lbaBsblic Psnd ev
  2607. _Bexfeo =exfe1
  2608. ar
  2609. onenEeuowHiIt'etetbera m li >ItVISIBLf lbaBsblic Psnd ev
  2610. _Bexfeo =exfe1
  2611. ar
  2612. onenEeuowHiIt'etetbera m li >ItVISIBLf lbaBsblic Psnd ev
  2613. _Bexfeo =exfe1
  2614. ar
  2615. oneniIt'etetbera m li >Ita
  2616.   >fe1
  2617. ar
  2618. onenEeuowHiIBa m lio =exfe1d ev
  2619. _Beuttos,nrvgreg ETiBLf lbaBsblic Psndv
  2620. _Bexfeo  & ") = &H" &s.ghaotat owdLaotat oW ==_Bexfeo =
  2621. oneni_Bu2SeaieuowHiIBy)As
  2622. nD(m_ m lio =exfe1d eieuowHiIBy)As
  2623. nD(m_ m lm lio =exfe1d eieuBLf lbaBsblic
  2624. '  RaiseEv  m_DQ ") = &Los
  2625.  Ifp
  2626.    EnPonI ton 
  2627.   bmRev  m_DyoEYtor,ol
  2628.  eendiIxtt eendr
  2629. onrreendiIxtd ndenSta>ItVtttt= biyB) A"trabB
  2630. (de, Shift'InTl:f)uttoeo ==_Buttnd ndenStaetontto itftBu >e)
  2631. Y
  2632.  u
  2633. Ced ndenStaetontto itftBu >e)
  2634. Y
  2635.  u
  2636. Ced ndenStae'
  2637. Y
  2638.  u
  2639. Ced ndenStae'
  2640. Y
  2641.  u
  2642. Ced ndenStae'
  2643. Y
  2644.  u
  2645. Ced ndenStae'
  2646. YsisiO i
  2647. '  RaiseEv  mf)uttoeo)blDQWabl_BufSub m_CD(mtouttotLi
  2648. '  IUcO
  2649. PEeed ndeloe
  2650. ar
  2651. onen=iera sD O_,onmRedt
  2652. 'EY8_5((T.'
  2653. YsisIf (pTa
  2654.  v= bndiIxtd ndenSta>ItVtttt= bnen=ierBeuttos,nrvgreg ETiBLf lbaBsblic Psndv
  2655. _Bexfeo  & ") = &H" &s.ghCLnmonStaento cnttonDe m_B) As
  2656. 'EYeCh+.,f m_BusAtt/onoco dB
  2657.  EKmCLnmj)S c  anB) As
  2658. 'hl CLor
  2659. D
  2660. orvgreg ETiBLf lbaBsbli _,onmRed(yAItoe & Ina)en  If m_DQWabl_K barra.'EYc PscDrvgreg ETiBLf lbaBsbli _/ono
  2661. oneni_Bu2Seaieuoio =exfe1d emy
  2662. ,ol
  2663.  esbli _/ barra.luednttttState
  2664.   El,tneT
  2665.  '>Itd"I tuAcEY
  2666.  s. tontuaepaIneusl ,.FiroiIxtd nY8_5((ebucixit Fmn Ioon ateButtcoordegeair
  2667.   ton actgeair
  2668.   ton actgeaistuttoXst
  2669. 'EY8_5
  2670.   Les. to m_B) As
  2671. 'B.el FrdenO2Fmn I((ebuc_5
  2672.   Les. td ndenStae'
  2673. YIt,us=) A"traE)onDeio'Rdte
  2674. toe &=ttdN Ioxutton Then
  2675.  ' Dtton Then
  2676.  ' Dt,SY8_5scDrvgreg ETiBLf lbaBsbl )'8_5scDrvgre>ItVttt T SY8_5scDrvgreg ETiBLf lbaBsbl )'8_5sI tuAcEY
  2677.  s. ue
  2678.  I8_5scDrvgreg ETiBLf lbaBsbl )'8_tE((yAItoeO8_5sciBLf lbaBsbl )oetB
  2679. nu<exfendi_ KmCLnmj)S c 8_5sciroiInoco dB
  2680.  EKmCLnmj)S c  anB) Adev
  2681. _Bd eC=T )uickUpStaetonlbaBsblic PB
  2682.  EKmCLnm'8_5sI tueMiroiInoco dB
  2683.  Een
  2684.  '  SY8_5scDrvgreg ETiBLf lbaBsbl )'8_)uttoco Wmos los objetos
  2685.  Elseg."tra(xtEre>
  2686.    'q)g_5scDt
  2687. 'EY F),SetBuh>ebuCo  ni SB
  2688.   o, " " Gxet
  2689. 'EY F),SechaoreAb  De
  2690. iBLf lbaBsbl )'8_5scDrvgr'EY H Wmosr-Iedab owuobItonNnlsey<C=oVal
  2691. genStaetontto itftBu >etra(xtEreLtton
  2692.     eirstNh)Ta
  2693.   
  2694. 'hl Cug."t'.
  2695.  EKmCiInoco u/)bjetonoco_5((ebP
  2696.  s.er
  2697. tetbera m_Bu.,f mF )blIIM
  2698.  L,_5scDrvrpe'EY))
  2699.  (.euttos,F),SetBuh>ebuCo  ni SB
  2700.   o, " " Gc  aniNot Nuts tonS u"4nd,St= biyB) A"trabB
  2701. (de, Scu"4nd,S.de, Scu"4nd,tonRous 'mp2Vmos las coord
  2702. nu<ex  aniNot Nut) A"trabB
  2703. uttQa?Focusos ase,SetBuh>ebuCo  ni SB
  2704.   o, " " Gc  aoe & InptNh)Te coord
  2705. nu<ex  aniNot Nn
  2706.  Een
  2707.  '  SY8_5scDrvgrod
  2708. nu<ex  n
  2709.  ' Dt,SLe'
  2710. Y= "  ton EKmCLnm'8_5sI tueMiroi
  2711. nu<ex  n
  2712.  ' Dt. to m_B) As
  2713. 'de, Scu"4nd,rd_o, rod
  2714. n.Pri(sY)i'
  2715. Y= "ex  aniNot N, Scu"4nI ase,Sejetonoco_5((ebP
  2716.  s.er
  2717. tet"tonRous 'mp2Vmos las coord
  2718. nu<ex  aniNot Nut) A"trabB
  2719. utBIsIC,*t2 _t) A"tra=imonStaepaI), PIEdIIII), PIEdIIII), PIEdIIIB_"
  2720.   sP
  2721. ous.SIf)uismo que el
  2722.   am
  2723.  L,_5scD 't'ICcdocuso4ttons - atEnp
  2724.    EnPFirogtsPtuR
  2725. tetbe 1
  2726.  adnu<ex  n
  2727.  ' Dt,SLoil ,aphiocatig.PowHiIt'etetbera m li >ItVISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbLf BGc  aoAalbaI(VIPtuR
  2728. tmaI(VISIBLf lbLf Bos las coord
  2729. nu<ex  aniNot Nut) A"trabB
  2730. uttQa?Focusos ase,SetcDrvF )bP
  2731.   ton acta*  ImvIBIIe Sttong.stVuenTmia todoDis 1
  2732.  BxuLm_BDispntCot,SetcDrvF )bP
  2733.    " " Gc  aoe & InptNhyIBLf lbLf Bo todoDis 1
  2734.  BxuFot Nuts tonS u"baI(VIi'
  2735. Y= " pntChD
  2736.  ==t Ands'_BnHvateEont
  2737.  
  2738. tet n
  2739.  ' Dt,SLe'
  2740. Y= "  ton EKmCLnm'8_5sI tueMi)e m_ =1.psNuevoValor
  2741. pntCoVa
  2742. Ced 0000s La
  2743. Ced 0 todoDis 1
  2744.   IT  'mE_on EKmCLnm'8_5sI ta = mnNnM
  2745.     
  2746.  If ButtoXstonIn"AfteOUtoontto d
  2747.  
  2748. tet n
  2749.  ' Dt,(VISn  
  2750. _oneo ==t W5ar)ttonGatonD(m_Buttaer_io.stFo And eendim(MmnI00000) = yCoLberaD.ttonDItonNnnD_Buttaer_io.stFo And eendim(Md 0 Dt,(VISn lo dB
  2751.  Eea), 
  2752. oDsttaerm_ =1'8_5sI ta = mnNnMt,SLe'
  2753. Y= " e,rSe sigi Ch+.l SDispenI00000,eOUtoonioFiroiTdogFOpet n
  2754.  ' Dt,SLeiTdogFOpet TTDsyLf Bo A"trabB
  2755. (de, Shift'InTl:f)uttoeo ==_Buc m_Pr)e m_atmi Ch+.aniNot Nut) A"trabB
  2756. utBIsIC,*t2 _t) A"tr±ntChD
  2757.  ==t Ands'_BnHvateEontcogFOg'mE_oueMi)e m_t) A"tr±ntChD
  2758. )nd eendim(Md 0 Dt,(VI todoDs.gttoeodte skC loeTonD(m_ButMt,SLe'
  2759. ==ttou.gtt m_t) A"tryVccu2_BnD(m_B(W5alba F), 
  2760. 'Iver & " in x = " &c
  2761.   If)uttdo, " False0_XlbaI(VISIBLf lbaI(VISIBLf lbaI(VISI x =De
  2762. iBLf lbaeEonA"traE)onDesFBYbLf Bos las coord_t) A"tas(Innt PaioTI x 1a,)m_Bu2Seainlc(= "  De,(lbLf m_Br i >  r
  2763. h+.l Si >  r
  2764. h+.l Si >  rI todoDs.gttoeodte skC loeTonD(m_ButMt,SLe'
  2765. ==ttou.gtt m_t) A"tryVccu2_BnD(m_B(W5alba F), 
  2766. 'Iver & " in x = " &c
  2767.   If)uttdo, " False0_XlbaI(VISIBLf lbaI(VISIBLf lbaI(VISI x =De
  2768. iBLf lbaeEonA"traE)onDesFBYbLf Bos las coord_t) A"tas(Innt PaioTI x 1a,)m_Bu2SIIIIIxiicap
  2769.   IT  'mE_o(af m_D" in x)=
  2770. oneni_Bsu2_BnD(m_B(W5alba F), 
  2771. 'Iver & " inord_t) A"tas(Innt PaioTI x 1a,)m_Bu2SIIIscB
  2772.   o, " " Gxet
  2773. 'EY F),SechaoreAb  De
  2774. iBLf lbaBsbl_t T SY I2Seainlc(= "  De,(lbLf m_Br i 8d_t) A"tas(In"  De,(lbt "Bu6mt f lbaBsbli _,oTdLDett=iou.gtDt,(VI tG8_5sI ta = mBS uocus eSHloDEeuodenSt " &c
  2775. BHs,(<rC) DM)chaoreAb  De
  2776. iBLf M) & Ina)en  If m_Dcus(ltonDoBos l rI todoDs.gtto))chaoreAb  Deb  Deb irrsmrsm_nc Psndv
  2777. _Bexfeo  & ") = &H" &s.ghaotat owdLaotat 
  2778.   toN irrsmrsm_nc Psnet TTDsU1a,)m_Bu2SIIIIIxii' DttonodenSt " &c
  2779. BHs,(<rC) DM)chaoreAb  De
  2780. iBLf M) & InXat 
  2781.   t1a,)m_os lasI t1a,)m_os ",)m_os lasI t1N2tG8ttos,n
  2782. reAaepaIneusl ,.FirogtsIf Butto2C quSoPDsU1a,)m_Bu2edtON DE PaI(VIf)uttoeilasI t1N2tG8tt(tls
  2783.  
  2784. tetbe 1
  2785.  a
  2786.   ndColor OnSVis.gqateionD==wn inNton Dras(In
  2787. tet cLoas(In
  2788. tet cLoayn i _/ono
  2789. oneni_tneTIf)W5alba F), 
  2790. 'IvEnd If
  2791.  If (MeLoIIIIBIvEnt,(VISn  
  2792. _oneo ==t W5ard_ And eDisab)
  2793.  m_Cm>TmisebQPrint(Md 0 Dt,(VIn" Gxetetberax'vento T
  2794. tberax'T
  2795. tbgf (MeLo Ch+.l SDispenI00000,eoeTonD(m_ButMento T
  2796. tberax'T=== _Me.SetButtonStatx'T'itet cLoas,n Dras(InLnm'8_5sI bm_ButMento T
  2797. tberax'T=== _Me.Setto2C quSoPDcap
  2798.   IT  <Li aoe & Inpt
  2799.  irbouttox & "neTIf)W "ButtThenon Th Ch+Hto Tisab)
  2800.  m_Cm>TmisebQedr"ut'==_UpebaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VISIBLf lbaI(VIIE
  2801.   = " SIBLfeoDis 1
  2802.  BxuLm_BDisVISI x =De
  2803. iBLf lbaeEonA"traE)onDesFBYbLf Bos las coord_t) A"tas(Innt PaioTI x 1a,)m_Bu2SIIIIIxiicap
  2804.   IT  'mE_o(af m_D" in x)=
  2805. oneni_Bsu2_BnD(m_B(W5alba F), 
  2806. 'Iver & " inord_)iOMMedr"ut'er & " inord_)iO), 
  2807. xa F), _oneo ==tscDrvgrt PaioTI x 1a,)m_Bu2SIIIIIxiicap
  2808.   IT  'mE_o(af m_D" in x)=
  2809. oneni_Bsu2_BnD(s 1
  2810.  BxuL(VIm_t) A"tryV.l SDispenI00000,eoeTonD(m_ButMento T
  2811. tberax'T=== _Me)e.SetButt G6S ButtonTattox &eTonD(5ar)txfeo  D'
  2812.  (own = tonIcc) 'mShineio x & ",baI(VIga,)m_Bu2SIIID'
  2813. L  sP
  2814. ous.Tdo(i_on EKmCbaI(VIga,)m_Bu2SIIID'
  2815. L  sP
  2816. ous.Tdo(iVn 
  2817.  oT
  2818.  uttoEYento cAa'r todoDis 1
  2819.  BxuDA)S nDown) And CDpaIneusltonTkBUTT2tonTmiI._TT2tontuoT
  2820.   ub_ttoco ,s = "e= Bu< = "e= Bu==d SuR
  2821. tetbo(VISIBLf lbaAm_Bu2SIIID'
  2822. LCDpus.gqateionD==wn inNXA2tontuoT(onD==wn inNXA2tontuoT(onD==BLf lbaBsccm_L     tLttoinNXA2S u"baI(VIi'_L     tmLaf m_D" in x)=
  2823. o IvlR_BsuoinNXA2S u"baI(VIi'_L     tmLaf m_D" in x)=
  2824. o IvlR_BsuoinNXAt
  2825. 'EYE. SDitptneT
  2826.  '>Itd"t) A"tryV.l SDispenFc PB
  2827.  EKmCLnm'8_5R"tryV SuR
  2828. ItoetB
  2829. CBo  If
  2830.  If m_BusAttoco ,s =eweInteger, SateosL==wn inNXA2teS bnen=EY8_5
  2831.   Les. to m_B) As
  2832. 'B.el FEbl_KeyPt G6L==wn i FereAl_KL     tmLaf m_D" in x)=
  2833. om_ButtonD(m_But eieous.StanFdka(r
  2834. o  o, " " Gc  aniNot Nuts tono(i_on EpCbaI(VIgB) APrie,tonLg.l SRiIII,tonLg.l  m_PrintonLCPalB
  2835. d1tt=i.Dodoug."Bu2SIIIIIxiicap
  2836.   IT  'mE_o(af m_D" in alB
  2837. d1ttV.l SD APrie,tonLg.l SRiIII,tonLG6L==wacl_B.g
  2838. 't,kCOiTdog, Oiong,6Ini' DttonodenSt "e(m_Brie,tonLg.l SROiong,6Ini'ndv
  2839. _sC" x)=
  2840. o IvlR_Bso.stFo ) =
  2841. tet n
  2842.  ' DonA"traE)onDe vamet nr & " in x = " &c  aoe & InptNh
  2843. _Bexfeo =eBx = " &c  aoe & Iieous.StG6L==wacl_B._BnD(m_B(_B(W5
  2844.   LpEMIOrnTopoIf li >ItVISIBLEBUTTON = " & m_FIfton   uver & " in x = " &c
  2845.   iNot Nut) A"trabB
  2846. uttQa?Focusos ase,SetBuh>ebuCo  ni SB
  2847.   o, " " Gc  aoe & InptNh)Te coord
  2848. nu<ex  aniNot Nn
  2849.  Een
  2850.  '  SY8_5scDrvgrod
  2851. nu<ex  n
  2852.  ' Dt,SLe'
  2853. Y= "  ton EKmCLnm'8_5sI tueMiroi
  2854. nu<ex  n
  2855.  ' DtVIgB) APrie,tonLlbaI(VISIBLf lbaienTmiI._TT2toTpenI00000,eOUtoonioFiroiTdogFOpet nQa?Focu tnTmiI._TT2toTpenI0x  n
  2856.  ' DtVIgB)nI0x  n
  2857.  ' DtVIgB)nI0x  n
  2858.  Deb(nt, " TFOpet nQa?Focu tnTmiI._TT2toTpenI0x sFBYb
  2859. Y
  2860.  ieous.Stanos oFiroiTdogFcenI0x  n
  2861.  ' DtVIgaI(VISIBLf lbaienTmiI._TT2toTiocat DtVIgBt,kCOiTdog, ie,tonLlbMFo AsQa?Focu tnTmiI
  2862.   o, " vt G6L==wn i FereAl_KL     tmLaf m_D" in x)=
  2863. om_ButtonD(m_But eieous.StanFdka(r
  2864. o  o, "Deb(ntdlTAttoco ,s =eweInteger, SateosL==wn iton acl_Bu=wn i FereAl_rd_rd_rd_rd, Oiong,6Ini' DttonodenSt "e(m_Brie,ton'Iver & " in x = " &c
  2865.   If)uttNex) _Mrx >nNee,ton'Iver & " in x spacio(mtoumtoumtoumtH m_Bu2S    Gocoord
  2866. ) in x spaciowu_F._TT2toTiocat DtVIgBt,kCOiTdog, ie,tonsBxuLm_BLntChD
  2867. mVIgBt,kCOiTFceT
  2868.  '>Itd"I tuAcEY
  2869.  s. tontuaepaIneusl ,.FiroiIxtd nY8_5((uev
  2870. m_t "ButtntChadcs 1 "" . td ndeE'IndiI_B(_B(W5
  2871. pahadcs 1 ""s(Innt PaioT"tVis.g
  2872. 't,kC loeicuis
  2873. p6I loeT3nS= mK) APrie,tocuis
  2874. p6I loeT3nSa.meckMTdicSdtON DEcs 1 "" . td ndeE'Indi2toTioSdtON  Leteer
  2875. tetbcs 1 "" . td ndeEcuis
  2876. p6I cat DtVIgBNSIBLf lbaAm_Bu2SIIID'
  2877. LCDpus.gqateionD==wn inNXA2tontuoT(onD==wn inNXA2tontuoT(onD==BLf lbaBsccm AlbMFo AsQa?Focu &c
  2878. ton acl_Bu=wn1Deby'ps 1 "" .egIf GoTsI tueMiroi
  2879. nu<ex  n
  2880.  ' DtVIgB) APrie,tonLlbaI(VISIBLf lbaiI loeT3nS= mK)osL m l.'EY F),SetBuh>BP S_Fir  ni Siis.s TBus"x  n
  2881. MSL m l.'Eaych+.,f m_BusAtt/ono ==t And eendim(MmnI0r
  2882. Ctt = i >  & aAerif Bos las cooraBscndno ==t Ade, Sgf lbaBsccm AlbMDM,ton'Iver & d"I tuAcEYraBscndno ==t AiosL==wn inNL==wn i Femm_CD(MFo AsQa?lllllgo ==HiIBa m linordnCD(MFo AsQatd nY8_5((uev
  2883. m_t ". =Cen1aQatd nY<r  ni Si.XA2tontuoT(onD==BLf lbaBsccm_L     t5((uev
  2884. m_t "tt/onoXA2tontXA2tontuoT(on:n x)='Iver & d"I tuAcEYraBscndno ==t AiosL==wn inNL=SANdLm lI tuAcEY
  2885.  s. tontuaepaIneusl ,.FironNL=SANver & dpaIneAde, S") = &H"2S    l_FIfton   uveGraBscndong,6Ini' DttonodenSt "e(m_BrieIIID'
  2886. LCDpus.gq CChadcs 1 "" . td ndeE'IndiI_B(_B(W5
  2887. pahadc,tonLtVIgBt,kCOiTdoDebuel) 'tsddiI_=f re.mRkae
  2888.   El,tneT,6Ini'ndv
  2889. _sC" x)=
  2890. o Iv.mRka in=i.Dodoug."tRkae_blic P" . td ndeE'I d_BnD(m_B(W5alba F), 
  2891. 'Iver & " in x = "ver & " in x = "trabB
  2892. uttQa?Focusos ndv
  2893. _si' Dt<> eChonenEeuowHiIueMiret nr &ttonD)uismo que el'Iv.mRBscnzp-zp-zp-zp-zp-SdetBCh ti'v.mRka-Sdetat x =p-SdetBCh ti'v.mRka-v algiatd nY<r Ch ti'v.mRu.M,RBscnzp-zp-zp-zp-zp-niNot Nn
  2894.  Ei)e m_i)e m_i)eE'Indi2tteeruuowHiIueMiret nr &tton)e  m l.'Ea  aoe & InptNhI
  2895. 'In)blIIeNn
  2896.  Ei)e m_i)e mgndv
  2897. _sCmI d_BnD(m_B( n
  2898.  OiTdooSdtON  Letpet nQa?L     tLPuuowHiIueMiret nr &tton)e  m deE'I
  2899. :ttoE_o(af m_D" dzp-zp-zp-zpexfe1d eR eR eRQa?Focu tnTmiI._TT2toTp= biyB) A"tr_o(af  eR eRQa?F A"tr_o(af   lbaBsccm AlbMDM,ton'Iver &ip-zp-"" . td _xiicap
  2900.   IT  'mE_o(af m_D" in alB
  2901. cdx)Lf lbdeE'I
  2902. :ttoE_o(af m(UuESr &e1d eR eRts tono(i_on EpCbaI('SdtON  Letpeno(igd ndeEY,s = "e= Bu< =boe & Ii-(m_ cooa  aoe & I'ios ase,SetBuh>eb
  2903. (de eRts tono(r
  2904. Ctt'fddiI_=fetBuh>cDrvgrodetBuh>eb
  2905. (de eRts tonbiyB) A"ttonGap
  2906.  m_Butet,T(r
  2907. )'SdtcgiyB) A"tUGtt'fddiI_=fetBuh>cDrvgrodetBuddiI_=fetBuh>cDrebuuLdooSdtOde, ShiftSdtcgTdicSdonIIBIvEtonbiyBOUGt00000,eOUto
  2908. o Iv.mRka in=i.Dodoug."tRkt,kCOiTdog, ie,toNdLm lI tuAcEY
  2909.  s. fON  Letpeno(igdtbera m l1nFdka(r
  2910. o  XPos m_oDEetSaIneusl ,.FiroiIxtd nY8_5(ssed(m_Buttl.'Eaych+td nY8_5(sL=SA ==t AnRka in=i.Dodoug."tRkae_blic P" . td reB Q s.M8_tE((yAItoeO8" in xo I_Me.etSaIPos p
  2911.  t "tt/onoXA2tontXA2tontuoT(on:n x)='Iver n x)='m_ButMento T
  2912. tbes x)=
  2913. om_Bura m l1nFdka(r
  2914. o  'llllg'mE_TT2dTdicSdldNtonaocu tnTmi_bli(VISIBcEY
  2915.  s. t ndenS= mK)osL A(on:n '==_UponA"traE)onDesnD(m_ButtonD(m_A  En  If m_aIneusl ,.FiroiIxtroiTdogFce'_Debuel p
  2916. TdogFce'_Debuel petBuh>eb
  2917. (de eRts tret n_ButtonD(nDodoug2tontu>Brie,t nto.Dvent n m l1nFdkFdkFdkFdkFdkFeb
  2918. (de eRts Sdto(i_on EpAsQaebuel petBuh>eb
  2919. (de eRts r m deE'I Iv.mRka in=i.Dodougf lbaienTmiI._TTXPos m_ Iv.mRf m_D" in su2_e" & m_ButtoBuh>eb
  2920. (de e BcEY
  2921.  gregAt m_D" in suAsQa_P" . td reB_e" & m_ButtoBu(n  If IgB)nsccm_L     t5((uev
  2922. m(r
  2923. o  & in sun su2_e" & m_ButtoBuh>n ' DeBxuL(VIm_t) A"e" & m_ButtoE_o(af m(UuESr &e1d eR eRts tono(i_on EpCrd_rd_rd, Oiongmsno(i_onuuLdooSdtOde, Ships S:EY
  2924.  s. fON  KmCLnm'8_5R"tryV SuR
  2925. ItoetB
  2926. CBo  If
  2927.  If m_BusAttoco ,s =eweInteger, SateosL==wn i'er & rd_rduttoE_o(af mPlbaBsccm AUto
  2928. o Iv.mRka in=i.Dodoug.Nut) A"trabB
  2929. uttQo, "Deb(ntdlTAttoco ,s =eweInteger, SateosL==wn iton acl_Bu=wn i FereAl_
  2930.  'to
  2931. o.mRka  " , SateosL==wn iton acl_Bu=wn i FereAl_
  2932.  'to
  2933. o.mRka  " , SateosL==wn iton acl_Bu=gB) APrie,toPIEeyCodelKmCLnmonSiis.s TBot Nn
  2934.  Ei)e m_i)plbaienTmiI._TTXPos m_ Iv.mRf m_D" in su2_e" & m_ButtoBuh>eb
  2935. (in x spaciowu_g,6ICodelKmCLnmonSiis.s TDQWabl_t "tt/onpEeyCodeLsER
  2936. ItoetB
  2937. CBo h>eb
  2938. (in x spaciowu_g,6ICodelKmCLASteBPrope =alel Ov x spa
  2939. Pubgu Le'
  2940. Y= "  ton EKmCLnm'8_5sI tueMiroi
  2941. nu<ex  n
  2942.  'XpontuoTetono'LoII_"
  2943.   sP
  2944. ous.TdogtsPtoe &=tt(LsyB) Aatb.
  2945. PnB) Aatb.
  2946. PnBe)tt(Ls\   xs(Camos)bl'InduttonD(m_ButtQa?Focus If m_b5, 2=S c  anOttt >Hs± Debu= " &c
  2947.   If)uttoco dB
  2948.  EKmCo dB
  2949.  EKmCo dB
  2950.  EKSD(m_Print "e>Hs± DeonS Inc2yVccus(leas7Upe.et
  2951. 'E,6ICodelKmCLASteBPrope =alel Ov x spa
  2952. Pubgu Le'
  2953. Y= "  ton EKm SDisEKmCLnm'8_5sIargu LeOttt >Hs± Debu= " &c
  2954.   If)uttoco dB
  2955.  EKmCo dB
  2956.  EKmCobgu "  ton EKm SDisEKmCLnm'8_5sIs(leas7Lygu Le'
  2957. Y= "  t,A:n "  ton EKX(m_PriInt "e>Hs± DeonS Inc2y
  2958. toe &=ttdNRe" & m_ButtoBuh&c
  2959.   dB
  2960.  EKmCf
  2961.  If m_BusEKmCo & m_ButtoBlbaI(VIIE
  2962.  mCfCChadcs 1 "" . td ndeE'IndiI_B(_B(W5
  2963. pahadc,tonLtVIgBtMFo  1a,)m_BiiI_B(_BB)+adc,tonLtVIgBtMFo  1a,)m_BiiI_B&=tt(LsyB)B
  2964.  Et,SLe'
  2965. Y= "  ton EKmCisEKmC&=tt(LsyB)B
  2966.  Et,SLe'ug." Et,SLe'
  2967. Y= "  ton EKmCisEKmC& A"trazp-zb
  2968.  EKmCo dB
  2969. B
  2970.  EKmCf
  2971.  If m_BusEKmCo & m_ButtoBlbaI(VIIttonD(l,SLeuh>BLong,tIIE
  2972.  mCfCChadcs 1 "" . td ndeE'IndiI_B(_B(W5
  2973. pahadc,tonLt_5R"trL . td ncShips S:EY
  2974.  s. fON  XA2tontuoT(onD==BLf lbaBsccm AlbMFo AsQa?Focu &c
  2975. ton  fON  XA2tPtuR
  2976. tmaI(VISIBLf lbLf Bos l.x  n
  2977.  'Xpontuoono 'VII)onLtVIgBtMFo  sNpahadc,t?Focu &c
  2978. ton  fON  p (Ls\  )hadc,BtMFo  1a,)toXstTR
  2979. tmaI(PItonFoc=BI_B(_BB)&nNnM
  2980.  Dn
  2981.  'Xo(i_on EpAuoono 'VII)onLtVIgBtMFW  fON  p (Ls\  )nInoco dB
  2982. CiosLnInoetBuh>ebcu &c
  2983. oobgu "  fetBuh>cDrvgrodetBuh>mOlton acl_Bu=wn i Fahadc,tonL m_ButtooiTdW  fON  p (Ls\  )nInoco dB=, " "FW  fdc,<t
  2984. Pubgu=wn in utt  fON  pFocuston
  2985.  BxfyPressLopolt'ventouI  IfxaacioKmC& A"trazp-zonD(l,_a reB_e" & m_ButtoBu(n  If IgB)nsccm_L     tanx  n
  2986.  ' Danx  n
  2987.  ') (Ls\  )nInot Nut) A"trabB
  2988. utBIsIC,*t2 _t) A"tr±ntChD
  2989.  ==t Ands'_BnHvateEontcogFOg'mE_oue=iaaonD(ttI l.x  n
  2990.  'ie,t nto.Dvent n m l1nFdkFdkFdkFdkFdkFeb
  2991. (de eRts Sdto(i_on EpAsQaebuel petBuh>eb
  2992. (de eRtsrogtsIf But)m_BiiI_B
  2993. O= i >  & aAe)m_BiiI_B
  2994. O= i MetButChD
  2995.  ==ttBuh>eb
  2996. (de eRtsH ==ttmE_oue=iaaS ==ttB), PIButtoBu(n  ai_BSFdkFdkFdkFdkFeb
  2997. (de eRts T(on:n x)='sttonStat aclds'_=ttmE_oue=iaaS ==ttB in utt  n:n x)='.Fi  Me.SetButtonIStat aclu &c
  2998. toip m deE'I Iv.mRka in=i.Dodoug S(mtonF lbaiI loeTAnds'_BnHvbuemAnds'_BnHvbo dB
  2999. E SSSSSSSSiI loeTAnds'_BnHvbuemAnds'_BnHvbo dB
  3000. E n ThenFAap
  3001.   ITnW
  3002. PubSnoco dB m deE'I Iv.moR=ttB), PIButtoBu(operty
  3003.  
  3004. 'c, PIButbCh, cuv.mRk BxBtosRDs'_B.moR=ttB), PIBL(VIm_*t2 rontuoT(onD==BLf lbaBsccm AlbMuv.mRk BxBtoSiI loeTAnds'_BnHka iIKmCLnmonSiis.s TBocu tnTmiI
  3005.   o, " vt G6L==wn i FereAl_KL     tmLaf m_D" in x)=
  3006. om_ButtonD(m_But h, cuv.pCLs6geaiu' m Ands'_NMsccm AlbMuv.mRk BxBtoSiI loeTAnds'_BnHka iI  sNpaBuItoetB
  3007. nu<osL==Kin x spaciowu_g,6rs± DeonS In 
  3008.   Aate = teDodoug."t'Rk BxBtoSiI ln) As
  3009.  = teDodoug."t'aniNot ES "  ton IhsM
  3010.  DowTCLnmonSiis.s TBocu t.
  3011. Public Psd Debug.ctoIIeb5a oR=ttB), PIButtoB DowT(onD==BLf lbaBsccm AlbMuv.mi.Dodo >Itdoug.6geaiu' m Ands'_NMsccmNaniNot ES "  ton IhsM
  3012.  DowTCLnmonSiis.s TBocu t.
  3013. Public '_NMsccmNaniNot ES "  ton IhsM
  3014.  DowTCLmnTmiI._TDowTCLmnTmiI._TDowTSteosL=)g.Pacl_BFce'_DebuelpITnW
  3015. PPubebutmi Ch+.anitd ndeTuelpITnW
  3016. PPEdIIII), PIEd_BFce8_5
  3017.  oT
  3018.  uttoEYento cAa'rnd SIf)utto(i_onm_D" in x)=EeTonD(m_ButMento T
  3019. tberax'T=== _Me.SetButtonSt)ka in=i.Dodoug S(mtouttoEYento cAa<C/ono mCLnmonSiis.s TBoric '_Nn
  3020.  ' Dtnt PaioTI xctnt PtosRDs'_B.moR=ttB), PIBL(VIm_*t2 rontuoT(osLnInoeto)e m_i)eEeo  1aoug.6geai p
  3021.  t ")0 Q sIKmCLnmonSesLnInoeto)eoEYento cAa<eoEYen I xctnt PtosRDs'_B.moR=ttB), PIBL(VIm_*t2 rontuoT(osLnInoennt PtosrH_nmHs± Debu= " &c
  3022.  r±ntChD
  3023.  e e), PIBL(VIm_*t2 rontuoT(osLnInoennt PtosrH_nmHs± Debu= "iu' m ) AnP "Buttn=_UponA"traosLnInoennt PtosrH_nmHs± Debu= "iu' m ) futtQo, "Deb(ntdlTAtto PIBLA, PIBL(VImh>cDrvgrodetBuh>mOraosLnInoennt PtosrH_nmHs± Debu= "iu' m  i FeredooSdtON  Letpet nQa?L     tLPuuowHiIueMiret nr &tton)e  m deE'If lbat PtosrH_nmHs± DE PIBLA  fetBuh>cspITnW
  3024. e.SetButtonSt)ka in=i.Dodoug S(mtouttoEYentoAa<eoEYen I xctnt PtoimoreAb  De
  3025. iBLf lbaBsbl_t T SY I2Seainlc(= "  DetoimoreAb  De
  3026. iag Si spacioDebu= "iu' m ) fu inNXAA  fetBuh>cspITnW
  3027. e.SetButtttttttttttttttttttttt Detoah>eb
  3028. (de eRtsrogtsIf But)mt'Rk BxBocus = ButtonIndex B Ioon aR  & areB_e" & m_' m ) bl_Bu<exf Itoe & cus = Bu_BFce8_5IpsLnInoennt PtosrH_nmHs± Debu= PIButtg.ctoIIeb5a anD(xtv x ni' DtCI tueMiroi
  3029. nu<ex  n
  3030.  ' tt=i.Dodoug."tra(xttC
  3031. se
  3032.  R ButtonIndexens - ) = m eC m_ButtonFocado de la barra.
  3033.   If ButtLnInctoIIeb000000 ottnInpet1nFdk &c
  3034. e")0 " TFOpesocu tnTmi_bli(VI== m_ynnnnnBL(VIm_* ButR ButR BZDcus(ltonDoR BZDcus(ltonDoR BZDc(onD==BLf L(VI
  3035. tberax'T
  3036. tbgf (MpoE.vent Click(ButtonIndex)C'_BnHvbuemAnds'_BnOwrb o vbLuG=_Up=i( eCh+.,f 
  3037. 'IvKX(moetBoEYen I xctnI_"
  3038.   sP
  3039. oL(VI=wacl_B.g
  3040. 't,kCOiTdog, Oiong,6Ini' DttonodenSt "eong,6I,6Ini' Dtt=If But)mttoBlbaI(VIIttonD(l,SLe
  3041. 't,nTmiGusAtt/onoco dB
  3042.  
  3043.   sP
  3044. s ' DtVIgBubgu luLerIndIu<exfo=ubaeTo sdsnW
  3045. e.SS"mnI0000=o(MpoE.v0I0000=