cButton.cls
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:25k
源码类别:

浏览器

开发平台:

Visual Basic

  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 = "cButton"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. '---------------------------------------------------------------------------------------
  17. ' Module    : cButton
  18. ' DateTime  :
  19. ' Author    : Lingll
  20. ' Purpose   : 在picturebox上画按钮
  21. '               draw a button on picturebox
  22. '---------------------------------------------------------------------------------------
  23. '8/5/2005 : 修正了api中 byval * as string 的问题
  24. Option Explicit
  25. '确保strconv能正确转换
  26. Private Const LocaleID_SC As Long = 2052&    '简中
  27. Private Const LocaleID_CurUse As Long = LocaleID_SC
  28. '===================================================
  29. Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  30. Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long
  31. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  32. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  33. Private Const PS_SOLID As Long = 0
  34. Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long
  35. Private Const BLACK_PEN As Long = 7
  36. Private Const DEFAULT_GUI_FONT As Long = 17
  37. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  38. Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
  39. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  40. Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  41. Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
  42. Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
  43. Private Const TRANSPARENT As Long = 1
  44. Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
  45. Private Const LF_FACESIZE As Long = 32
  46. Private Type LOGFONT
  47.     lfHeight As Long
  48.     lfWidth As Long
  49.     lfEscapement As Long
  50.     lfOrientation As Long
  51.     lfWeight As Long
  52.     lfItalic As Byte
  53.     lfUnderline As Byte
  54.     lfStrikeOut As Byte
  55.     lfCharSet As Byte
  56.     lfOutPrecision As Byte
  57.     lfClipPrecision As Byte
  58.     lfQuality As Byte
  59.     lfPitchAndFamily As Byte
  60.     lfFaceName(1 To LF_FACESIZE) As Byte
  61. End Type
  62. Private Declare Function GetTextMetrics Lib "gdi32" Alias "GetTextMetricsA" (ByVal hdc As Long, lpMetrics As TEXTMETRIC) As Long
  63. Private Type TEXTMETRIC
  64.     tmHeight As Long
  65.     tmAscent As Long
  66.     tmDescent As Long
  67.     tmInternalLeading As Long
  68.     tmExternalLeading As Long
  69.     tmAveCharWidth As Long
  70.     tmMaxCharWidth As Long
  71.     tmWeight As Long
  72.     tmOverhang As Long
  73.     tmDigitizedAspectX As Long
  74.     tmDigitizedAspectY As Long
  75.     tmFirstChar As Byte
  76.     tmLastChar As Byte
  77.     tmDefaultChar As Byte
  78.     tmBreakChar As Byte
  79.     tmItalic As Byte
  80.     tmUnderlined As Byte
  81.     tmStruckOut As Byte
  82.     tmPitchAndFamily As Byte
  83.     tmCharSet As Byte
  84. End Type
  85. Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
  86. Private Declare Function DrawIconEx Lib "user32" (ByVal hdc As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
  87. Private Const DI_NORMAL As Long = &H3
  88. Private Declare Function GetIconInfo Lib "user32" (ByVal hIcon As Long, piconinfo As ICONINFO) As Long
  89. Private Type ICONINFO
  90.     fIcon As Long
  91.     xHotspot As Long
  92.     yHotspot As Long
  93.     hbmMask As Long
  94.     hbmColor As Long
  95. End Type
  96. Private Declare Function GetObjectApi Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
  97. Private Type BITMAP
  98.     bmType As Long
  99.     bmWidth As Long
  100.     bmHeight As Long
  101.     bmWidthBytes As Long
  102.     bmPlanes As Integer
  103.     bmBitsPixel As Integer
  104.     bmBits As Long
  105. End Type
  106. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
  107. 'Private Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hdc As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, lpDrawTextParams As DRAWTEXTPARAMS) As Long
  108. Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As Long, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
  109. Private Const DT_LEFT As Long = &H0
  110. Private Const DT_CENTER As Long = &H1
  111. Private Const DT_VCENTER As Long = &H4
  112. Private Const DT_SINGLELINE As Long = &H20
  113. Private Const DT_BOTTOM As Long = &H8
  114. 'Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  115. 'Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  116. Private Type POINTAPI
  117.     x As Long
  118.     y As Long
  119. End Type
  120. 'Private Declare Function CreateWindowEX Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal HMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
  121. 'Private Declare Function SendMessageAny Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  122. 'Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
  123. 'Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  124. 'Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
  125. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  126. 'Private Declare Function GetCapture Lib "user32" () As Long
  127. 'Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
  128. 'Private Declare Function ReleaseCapture Lib "user32" () As Long
  129. 'Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
  130. Private Const COLOR_BTNSHADOW As Long = 16
  131. Private Const COLOR_BTNHIGHLIGHT As Long = 20
  132. Private Const COLOR_BTNFACE = 15
  133. Private Declare Function BitBlt Lib "gdi32" (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
  134. Private Const SRCCOPY = &HCC0020
  135. Private Const WM_USER = &H400
  136. Private Const CW_USEDEFAULT = &H80000000
  137. Private Const SWP_NOSIZE = &H1
  138. Private Const SWP_NOACTIVATE = &H10
  139. Private Const SWP_NOMOVE = &H2
  140. Private Const HWND_TOPMOST = -1
  141. Private Type RECT
  142.     Left As Long
  143.     Top As Long
  144.     Right As Long
  145.     Bottom As Long
  146. End Type
  147. Private Const TTS_NOPREFIX = &H2
  148. 'Private Const TTF_TRANSPARENT = &H100
  149. 'Private Const TTF_CENTERTIP = &H2
  150. Private Const TTM_ADDTOOLA = (WM_USER + 4)
  151. 'Private Const TTM_ACTIVATE = WM_USER + 1
  152. Private Const TTM_UPDATETIPTEXTA = (WM_USER + 12)
  153. Private Const TTM_SETMAXTIPWIDTH = (WM_USER + 24)
  154. 'Private Const TTM_SETTIPBKCOLOR = (WM_USER + 19)
  155. 'Private Const TTM_SETTIPTEXTCOLOR = (WM_USER + 20)
  156. Private Const TTM_SETTITLE = (WM_USER + 32)
  157. Private Const TTS_BALLOON = &H40
  158. Private Const TTS_ALWAYSTIP = &H1
  159. Private Const TTF_SUBCLASS = &H10
  160. Private Const TTF_CENTERTIP = &H2
  161. Private Const TOOLTIPS_CLASSA = "tooltips_class32"
  162. Private Type TOOLINFO
  163.     lSize As Long
  164.     lFlags As Long
  165.     lHwnd As Long
  166.     lId As Long
  167.     lpRect As RECT
  168.     hInstance As Long
  169.     lpStr As String
  170.     lParam As Long
  171. End Type
  172. '#########################################################
  173. Private hTip As Long
  174. Private preButton As Integer, preOut As Boolean
  175. Private mButton As Integer
  176. Private mParent As Object
  177. 'Private WithEvents BtnFace As PictureBox
  178. Private mHdc As Long
  179. Private mBffImg As cImgEx
  180. '####################################################
  181. '缺省属性值:
  182. Const m_def_Selected = False
  183. Const m_def_Caption = ""
  184. Const m_def_TipText = ""
  185. '属性变量:
  186. Dim m_Left As Long
  187. Dim m_Top As Long
  188. Dim m_Width As Long
  189. Dim m_Height As Long
  190. Dim m_RightBorder As Boolean
  191. Dim m_Selected As Boolean
  192. Dim m_Caption As String
  193. Public m_TipText As String
  194. Private m_TipTitle As String
  195. Dim m_Center As Boolean
  196. Private mImageNormal As StdPicture
  197. Private mImageOver As StdPicture
  198. '水平方向间隔
  199. Private mHPading As Long
  200. '垂直方向间隔
  201. Private mVPading As Long
  202. 'Tip Title 最大长度
  203. Private Const MaxTipTitle As Long = 96
  204. '按钮状态
  205. Public Enum cbeButtonState
  206.     cbtnNull = -1
  207.     cbtnNormal = 0
  208.     cbtnPress = 1
  209.     cbtnOver = 2
  210.     cbtnChecked = 3
  211. End Enum
  212. '按钮类型
  213. Public Enum cbeButtonStyle
  214.     cbtsNormal = 0
  215.     cbtsCheck = 1
  216. End Enum
  217. Dim Color_Shadow As Long
  218. Dim Color_Light As Long
  219. Dim Color_ButtonFace As Long
  220. '按钮全区域
  221. Private mBtnFullRc As RECT
  222. '文字区域
  223. Private mTextRc As RECT
  224. '图标区域
  225. Private mPctRc As RECT
  226. '灰区域
  227. Private mGrayRc As RECT
  228. '按钮区域
  229. Private mBtnRc As RECT
  230. '按钮区域2,相对于外部
  231. Private mBtnRcOut As RECT
  232. '右边间隔条宽度
  233. Private Const mRightBorderWidth& = 6
  234. Private mPctWidth As Long
  235. Private mPctHeight As Long
  236. '按钮状态
  237. Private mButtonState As cbeButtonState
  238. Private m_Checked As Boolean
  239. Private m_Style As cbeButtonStyle
  240. Private mCreated As Boolean
  241. '装载自己的容器
  242. Private mParentBar As cButtonBar
  243. Public TagS As String
  244. Public TagL As Long
  245. Public index As Long
  246. '按钮状态
  247. Public Property Let ButtonState(ByVal vData As cbeButtonState)
  248. 'used when assigning an Object to the property, on the left side of a Set statement.
  249. 'Syntax: Set x.ButtonState = Form1
  250.     If mButtonState <> vData Then
  251.         mButtonState = vData
  252.         Call DrawButton(mButtonState)
  253.     End If
  254. End Property
  255. Public Property Get ButtonState() As cbeButtonState
  256. 'used when retrieving value of a property, on the right side of an assignment.
  257. 'Syntax: Debug.Print X.ButtonState
  258.     ButtonState = mButtonState
  259. End Property
  260. '计算各种区域
  261. Private Sub GetRectZZ()
  262. With mBtnFullRc
  263.     .Left = m_Left
  264.     .Top = m_Top
  265.     .Right = m_Left + m_Width - 1
  266.     .Bottom = m_Top + m_Height - 1
  267. End With
  268. With mBtnRcOut
  269.     .Left = m_Left
  270.     .Top = m_Top
  271.     If m_RightBorder Then
  272.         .Right = mBtnFullRc.Right - mRightBorderWidth
  273.     Else
  274.         .Right = mBtnFullRc.Right
  275.     End If
  276.     .Bottom = mBtnFullRc.Bottom
  277. End With
  278. With mBtnRc
  279.     .Left = 0
  280.     .Top = 0
  281.     If m_RightBorder Then
  282.         .Right = m_Width - 1 - mRightBorderWidth
  283.     Else
  284.         .Right = m_Width - 1
  285.     End If
  286.     .Bottom = m_Height - 1
  287. End With
  288. With mGrayRc
  289.     .Left = 1
  290.     .Top = 1
  291.     .Right = mBtnRc.Right - 1
  292.     .Bottom = mBtnRc.Bottom - 1
  293. End With
  294. If mPctWidth > 0 And mPctHeight > 0 Then
  295.     With mPctRc
  296.         .Top = mGrayRc.Top + 2 + mVPading
  297.         .Left = mGrayRc.Left + 2 + mHPading
  298.         
  299.         .Right = .Left + mPctWidth
  300.         If .Right > mGrayRc.Right - 2 - mHPading Then
  301.             .Right = mGrayRc.Right - 2 - mHPading
  302.         End If
  303.         
  304.         .Bottom = .Top + mPctHeight
  305.         If .Bottom > mGrayRc.Bottom - 2 - mVPading Then
  306.             .Bottom = mGrayRc.Bottom - 2 - mVPading
  307.         End If
  308.     End With
  309. Else
  310.     With mPctRc
  311.         .Top = mGrayRc.Top
  312.         .Left = mGrayRc.Left
  313.         .Right = .Left
  314.         .Bottom = .Top
  315.     End With
  316. End If
  317. With mTextRc
  318.     .Left = mPctRc.Right + 2 + mHPading
  319.     .Top = mGrayRc.Top + 2 + mVPading
  320.     .Bottom = mGrayRc.Bottom - 2 - mVPading
  321.     .Right = mGrayRc.Right - 2 - mHPading
  322. End With
  323. End Sub
  324. '注意!不要删除或修改下列被注释的行!
  325. 'MemberInfo=13,0,0,
  326. Public Property Get Caption() As String
  327.     Caption = m_Caption
  328. End Property
  329. Public Property Let Caption(ByVal New_Caption As String)
  330. If m_Caption <> New_Caption Then
  331.     m_Caption = New_Caption
  332.     Call DrawButton(mButtonState)
  333. End If
  334. End Property
  335. Public Sub DrawButton(ByVal State As cbeButtonState)
  336. If Not mCreated Then Exit Sub
  337. mBffImg.SetColor Color_ButtonFace
  338. If State <> cbtnNull Then
  339.     If m_Checked Then
  340.         If m_Style = cbtsCheck Then
  341.             State = cbtnChecked
  342.         Else
  343.             State = cbtnPress
  344.         End If
  345.     End If
  346.     
  347.     If State = cbtnChecked Then
  348.         GrayButton mBffImg.hdc
  349.     End If
  350.     
  351.     DrawPicture mBffImg.hdc, State
  352.     PrintText mBffImg.hdc, m_Caption, State
  353.     
  354.     DrawOutLine mBffImg.hdc, State
  355.     
  356.     If m_RightBorder Then DrawRightBorder mBffImg.hdc
  357.     
  358.     If m_Selected Then DrawSelect mBffImg.hdc
  359. End If
  360. Call RePaint
  361. End Sub
  362. 'api方式的draw line
  363. Private Sub LineHdc(nHdc&, X1&, Y1&, X2&, Y2&, color&)
  364. Dim tHdc&, tBsh&, tPreObj&
  365. tBsh = CreatePen(PS_SOLID, 1, color)
  366. tPreObj = SelectObject(nHdc, tBsh)
  367. Call MoveToEx(nHdc, X1, Y1, ByVal 0&)
  368. Call LineTo(nHdc, X2, Y2)
  369. DeleteObject SelectObject(nHdc, GetStockObject(BLACK_PEN))
  370. 'If tBsh <> 0 Then Debug.Print "delete "; DeleteObject(tBsh)
  371. End Sub
  372. Private Sub DrawLine(nHdc&, nw&, nh&, C1 As Long, C2 As Long)
  373. Dim tHdc&
  374. tHdc = nHdc
  375. With mBtnRc
  376.     LineHdc tHdc, .Left, .Top, .Right + 1, .Top, C1
  377.     LineHdc tHdc, .Left, .Top, .Left, .Bottom + 1, C1
  378.     
  379.     LineHdc tHdc, .Right, .Bottom, .Right, .Top, C2
  380.     LineHdc tHdc, .Right, .Bottom, .Left, .Bottom, C2
  381. End With
  382. End Sub
  383. '画按钮显现的3d部分
  384. Private Sub DrawOutLine(nHdc&, State As cbeButtonState)
  385. If State = cbtnChecked Or State = cbtnPress Then
  386.     Call DrawLine(nHdc, m_Width, m_Height, _
  387.         Color_Shadow, Color_Light)
  388. ElseIf State = cbtnOver Then
  389.     Call DrawLine(nHdc, m_Width, m_Height, _
  390.         Color_Light, Color_Shadow)
  391. End If
  392. End Sub
  393. '被选择了
  394. Private Sub DrawSelect(nHdc&)
  395. Dim tBsh&
  396. Const tClr As Long = 15168858
  397. tBsh = CreatePen(PS_SOLID, 1, tClr)
  398. SelectObject nHdc, tBsh
  399. MoveToEx nHdc, mGrayRc.Left, mGrayRc.Top, ByVal 0&
  400. LineTo nHdc, mGrayRc.Right, mGrayRc.Top
  401. LineTo nHdc, mGrayRc.Right, mGrayRc.Bottom
  402. LineTo nHdc, mGrayRc.Left, mGrayRc.Bottom
  403. LineTo nHdc, mGrayRc.Left, mGrayRc.Top
  404. DeleteObject SelectObject(nHdc, GetStockObject(BLACK_PEN))
  405. End Sub
  406. Private Sub GrayButton(nHdc&)
  407. 'Dim trc As RECT
  408. 'Call SetRect(trc, 1, 1, m_Width - 1, m_Height - 1)
  409. GrayRect nHdc, mGrayRc
  410. End Sub
  411. Private Sub GrayRect(nHdc&, nRc As RECT)
  412. Dim tGray As cImgEx
  413. Dim tbr&, x&, y&
  414. Dim tRc As RECT
  415. Set tGray = New cImgEx
  416. tGray.Create 4, 4, nHdc, Color_ButtonFace
  417. For y = 0 To 3
  418.     For x = 0 To 3 Step 2
  419.         If y Mod 2 = 0 Then
  420.             Call SetPixelV(tGray.hdc, x, y, Color_Light)
  421.         Else
  422.             Call SetPixelV(tGray.hdc, x + 1, y, Color_Light)
  423.         End If
  424.     Next x
  425. Next y
  426. tRc = nRc
  427. tRc.Bottom = tRc.Bottom + 1
  428. tRc.Right = tRc.Right + 1
  429. tbr = CreatePatternBrush(tGray.hBmp)
  430. Call FillRect(nHdc, tRc, tbr)
  431. Call DeleteObject(tbr)
  432. End Sub
  433. Private Sub PrintText(nHdc&, nStr$, State As cbeButtonState)
  434. Dim tRc As RECT
  435. Dim offset As Long
  436. If nStr = "" Then Exit Sub
  437. Select Case State
  438.     Case cbtnNormal
  439.         offset = 0
  440.     Case cbtnOver
  441.         offset = 0 '-1
  442.     Case cbtnPress, cbtnChecked
  443.         offset = 1
  444. End Select
  445. SetRect tRc, mTextRc.Left + offset, mTextRc.Top + offset, _
  446.         mTextRc.Right + offset, mTextRc.Bottom + offset
  447. DrawText nHdc, StrPtr(StrConv(nStr, vbFromUnicode, LocaleID_CurUse)), _
  448.         -1, tRc, DT_LEFT Or DT_BOTTOM Or DT_SINGLELINE
  449. End Sub
  450. '初始化
  451. Public Sub CreateFace(nHdc&, x&, y&, cx&, cy&, _
  452.     Optional nParentBar As cButtonBar)
  453. Call Destory
  454. mHdc = nHdc
  455.     
  456. m_Left = x
  457. m_Top = y
  458. m_Width = cx
  459. m_Height = cy
  460. 'mPctHeight = imgH
  461. 'mPctWidth = imgW
  462. Call RefreshColor
  463. Call GetRectZZ
  464. Call IniBffImg
  465. Set mParentBar = nParentBar
  466. mCreated = True
  467. End Sub
  468. '初始化缓冲img
  469. Private Sub IniBffImg()
  470. If mCreated Then
  471.     DeleteObject SelectObject(mBffImg.hdc, GetStockObject(BLACK_PEN))
  472. End If
  473. Set mBffImg = New cImgEx
  474. mBffImg.Create m_Width, m_Height, mHdc, COLOR_BTNFACE
  475. SetBkMode mBffImg.hdc, TRANSPARENT
  476. SelectObject mBffImg.hdc, CreateFont("宋体")
  477. End Sub
  478. '是否在内
  479. Public Function InMe(ByVal x&, ByVal y&) As Boolean
  480. 'InMe = x >= m_Left And x <= m_Left + m_Width And _
  481.     y >= m_Top And y <= m_Top + m_Height
  482. InMe = x >= mBtnRcOut.Left And x <= mBtnRcOut.Right And _
  483.     y >= mBtnRcOut.Top And y <= mBtnRcOut.Bottom
  484. End Function
  485. Private Sub Class_Initialize()
  486. Call RefreshColor
  487. mButtonState = cbtnNull
  488. m_RightBorder = False
  489. mCreated = False
  490. m_Checked = False
  491. m_Style = cbtsNormal
  492. End Sub
  493. '创建字体
  494. Private Function CreateFont(fName As String) As Long
  495. Dim lf As LOGFONT, tm As TEXTMETRIC
  496. Dim tstr$
  497. GetTextMetrics mHdc, tm
  498. With lf
  499.     tstr = StrConv(fName, vbFromUnicode)
  500.     CopyMemory ByVal VarPtr(.lfFaceName(1)), ByVal StrPtr(tstr), LenB(tstr)
  501.     .lfCharSet = 134
  502.     .lfHeight = 12 ' tm.tmHeight
  503. End With
  504. CreateFont = CreateFontIndirect(lf)
  505. End Function
  506. Private Sub DrawPicture(nHdc&, State As cbeButtonState)
  507. Dim tImg As cImgEx
  508. Dim offset&, tPct As StdPicture
  509. If mPctHeight > 0 And mPctWidth > 0 Then
  510.     Select Case State
  511.         Case cbtnNormal
  512.             offset = 0
  513.             Set tPct = mImageNormal
  514.         Case cbtnOver
  515.             offset = 0 ' -1
  516.             Set tPct = mImageOver
  517.         Case cbtnPress, cbtnChecked
  518.             offset = 1
  519.             Set tPct = mImageNormal
  520.     End Select
  521.     If tPct Is Nothing Then Set tPct = mImageNormal
  522.     If Not tPct Is Nothing Then
  523.         Set tImg = New cImgEx
  524.         tImg.Create mPctWidth, mPctHeight, nHdc
  525.         BitBlt tImg.hdc, 0, 0, mPctWidth, mPctHeight, _
  526.                 nHdc, mPctRc.Left + offset, mPctRc.Top + offset, SRCCOPY
  527.         Call DrawPicture2(tImg, tPct)
  528.         BitBlt nHdc, mPctRc.Left + offset, mPctRc.Top + offset, mPctWidth, mPctHeight, _
  529.              tImg.hdc, 0, 0, SRCCOPY
  530.     End If
  531. End If
  532. End Sub
  533. Private Sub DrawPicture2(nImg As cImgEx, npct As StdPicture)
  534. Dim tIfo As ICONINFO
  535. Dim tBmp As BITMAP
  536. If npct.Type = vbPicTypeIcon Then
  537.     GetIconInfo npct.handle, tIfo
  538.     GetObjectApi tIfo.hbmColor, Len(tBmp), tBmp
  539.     DrawIconEx nImg.hdc, 0, 0, npct.handle, tBmp.bmWidth, tBmp.bmHeight, 0, 0, DI_NORMAL
  540.     DeleteObject tIfo.hbmColor
  541.     DeleteObject tIfo.hbmMask
  542. ElseIf npct.Type = vbPicTypeBitmap Then
  543.     'nImg.CopyByBmp npct.handle
  544.     DrawMaskImage npct.handle, nImg.hdc, RGB(255, 0, 255)
  545. End If
  546. End Sub
  547. '获得图像大小
  548. Private Sub GetImageSize(npct As StdPicture, nw&, nh&)
  549. Dim tIfo As ICONINFO
  550. Dim tBmp As BITMAP
  551. If npct Is Nothing Then
  552.     nw = 0: nh = 0
  553. Else
  554.     If npct.Type = vbPicTypeIcon Then
  555.         GetIconInfo npct.handle, tIfo
  556.         GetObjectApi tIfo.hbmColor, Len(tBmp), tBmp
  557.         nw = tBmp.bmWidth: nh = tBmp.bmHeight
  558.         DeleteObject tIfo.hbmColor
  559.         DeleteObject tIfo.hbmMask
  560.     ElseIf npct.Type = vbPicTypeBitmap Then
  561.         GetObjectApi npct.handle, Len(tBmp), tBmp
  562.         nw = tBmp.bmWidth: nh = tBmp.bmHeight
  563.     End If
  564. End If
  565. End Sub
  566. Public Property Get ImageNormal() As StdPicture
  567. Set ImageNormal = mImageNormal
  568. End Property
  569. Public Property Set ImageNormal(vNewValue As StdPicture)
  570. Set mImageNormal = vNewValue
  571. Call GetImageSize(mImageNormal, mPctWidth, mPctHeight)
  572. Call Refresh
  573. End Property
  574. Public Property Get ImageOver() As StdPicture
  575. Set ImageOver = mImageOver
  576. End Property
  577. Public Property Set ImageOver(vNewValue As StdPicture)
  578. Set mImageOver = vNewValue
  579. Call Refresh
  580. End Property
  581. '重新获得系统颜色
  582. Private Sub RefreshColor()
  583. Color_Shadow = GetSysColor(COLOR_BTNSHADOW)
  584. Color_Light = GetSysColor(COLOR_BTNHIGHLIGHT)
  585. Color_ButtonFace = GetSysColor(COLOR_BTNFACE)
  586. End Sub
  587. Private Sub DrawRightBorder(nHdc&)
  588. LineHdc nHdc, mBtnRc.Right + 3, mBtnRc.Top, mBtnRc.Right + 3, mBtnRc.Bottom, Color_Shadow
  589. LineHdc nHdc, mBtnRc.Right + 4, mBtnRc.Top, mBtnRc.Right + 4, mBtnRc.Bottom, Color_Light
  590. End Sub
  591. 'Tool Tip 标题
  592. Public Property Get TipTitle() As String
  593. TipTitle = m_TipTitle
  594. End Property
  595. Public Property Let TipTitle(ByVal vNewValue As String)
  596. If m_TipTitle <> vNewValue Then
  597.     m_TipTitle = vNewValue
  598.     Call ChangeTip
  599. End If
  600. 'Dim tStr$
  601. 'tStr = StrConv(vNewValue, vbFromUnicode)
  602. 'If LenB(tStr) > MaxTipTitle Then
  603. '    m_TipTitle = Replace(StrConv(LeftB$(tStr, MaxTipTitle), vbUnicode), Chr(0), "") & "..."
  604. 'Else
  605. '    m_TipTitle = vNewValue
  606. 'End If
  607. End Property
  608. Public Property Get tiptext() As String
  609. tiptext = m_TipText
  610. End Property
  611. Public Property Let tiptext(ByVal vNewValue As String)
  612. If m_TipText <> vNewValue Then
  613.     m_TipText = vNewValue
  614.     Call ChangeTip
  615. End If
  616. End Property
  617. '调用parent bar ,改变Tip
  618. Private Sub ChangeTip()
  619. Dim tstr$
  620. If Not mParentBar Is Nothing Then
  621.     mParentBar.UpdateTipText index, GetCombinTipText
  622. End If
  623. End Sub
  624. '将TipTitle 与TipText合并
  625. Public Function GetCombinTipText() As String
  626. If m_TipTitle = "" Then
  627.     GetCombinTipText = m_TipText
  628. End If
  629. If m_TipText = "" Then
  630.     GetCombinTipText = m_TipTitle
  631. End If
  632. If m_TipText <> "" And m_TipTitle <> "" Then
  633.     GetCombinTipText = m_TipTitle & vbNewLine & m_TipText
  634. End If
  635. End Function
  636. Public Property Get HPading() As Long
  637. HPading = mHPading
  638. End Property
  639. Public Property Let HPading(ByVal vNewValue As Long)
  640. mHPading = vNewValue
  641. End Property
  642. Public Property Get VPading() As Long
  643. VPading = mVPading
  644. End Property
  645. Public Property Let VPading(ByVal vNewValue As Long)
  646. mVPading = vNewValue
  647. End Property
  648. Private Sub Class_Terminate()
  649. Call Destory
  650. End Sub
  651. Public Sub Destory()
  652. mCreated = False
  653. mHdc = 0
  654.     
  655. m_Left = 0
  656. m_Top = 0
  657. m_Width = 0
  658. m_Height = 0
  659. mPctHeight = 0
  660. mPctWidth = 0
  661. mButtonState = cbtnNull
  662. Set mParentBar = Nothing
  663. If Not mBffImg Is Nothing Then
  664.     DeleteObject SelectObject(mBffImg.hdc, GetStockObject(DEFAULT_GUI_FONT))
  665. End If
  666. End Sub
  667. Public Sub RePaint()
  668. If mCreated Then
  669.     BitBlt mHdc, m_Left, m_Top, m_Width, m_Height, mBffImg.hdc, 0, 0, SRCCOPY
  670. End If
  671. End Sub
  672. Public Property Get Left() As Long
  673. Left = m_Left
  674. End Property
  675. Friend Property Let Left(ByVal vNewValue As Long)
  676. If m_Left <> vNewValue Then
  677.     m_Left = vNewValue
  678.     Call Refresh
  679. End If
  680. End Property
  681. Public Property Get Top() As Long
  682. Top = m_Top
  683. End Property
  684. Friend Property Let Top(ByVal vNewValue As Long)
  685. If m_Top <> vNewValue Then
  686.     m_Top = vNewValue
  687.     Call Refresh
  688. End If
  689. End Property
  690. Public Property Get width() As Long
  691. width = m_Width
  692. End Property
  693. Friend Property Let width(ByVal vNewValue As Long)
  694. If vNewValue > 0 And m_Width <> vNewValue Then
  695.     m_Width = vNewValue
  696.     Call IniBffImg
  697.     Call Refresh
  698. End If
  699. End Property
  700. Public Property Get height() As Long
  701. height = m_Height
  702. End Property
  703. Friend Property Let height(ByVal vNewValue As Long)
  704. If vNewValue > 0 And m_Height <> vNewValue Then
  705.     m_Height = vNewValue
  706.     Call IniBffImg
  707.     Call Refresh
  708. End If
  709. End Property
  710. Public Property Get RightBorder() As Boolean
  711. RightBorder = m_RightBorder
  712. End Property
  713. Public Property Let RightBorder(ByVal vNewValue As Boolean)
  714. m_RightBorder = vNewValue
  715. Call Refresh
  716. End Property
  717. Friend Sub Move(nLeft&, nTop&, _
  718.         Optional nWidth&, Optional nHeight&)
  719. Dim tSized As Boolean
  720. tSized = False
  721. If m_Left <> nLeft Then m_Left = nLeft
  722. If m_Top <> nTop Then m_Top = nTop
  723.     
  724. If nWidth > 0 Then
  725.     If m_Width <> nWidth Then
  726.         m_Width = nWidth
  727.         tSized = True
  728.     End If
  729. End If
  730. If nHeight > 0 Then
  731.     If m_Height <> nHeight Then
  732.         m_Height = nHeight
  733.         tSized = True
  734.     End If
  735. End If
  736.         
  737. Call IniBffImg
  738. Call Refresh
  739. End Sub
  740.     
  741. Public Sub Refresh()
  742. Call RefreshColor
  743. Call GetRectZZ
  744. Call DrawButton(mButtonState)
  745. End Sub
  746. Public Property Get Selected() As Boolean
  747. Selected = m_Selected
  748. End Property
  749. Public Property Let Selected(ByVal vNewValue As Boolean)
  750. If m_Selected <> vNewValue Then
  751.     m_Selected = vNewValue
  752.     Call Refresh
  753. End If
  754. End Property
  755. Public Property Get Checked() As Boolean
  756. Checked = m_Checked
  757. End Property
  758. Public Property Let Checked(ByVal vNewValue As Boolean)
  759. If m_Checked <> vNewValue Then
  760.     m_Checked = vNewValue
  761.     Call Refresh
  762. End If
  763. End Property
  764. Public Property Get Style() As cbeButtonStyle
  765. Style = m_Style
  766. End Property
  767. Public Property Let Style(ByVal vNewValue As cbeButtonStyle)
  768. If m_Style <> vNewValue Then
  769.     m_Style = vNewValue
  770.     If m_Checked Then
  771.         Call Refresh
  772.     End If
  773. End If
  774. End Property
  775. '获得按钮可用区域
  776. Public Sub GetButtonLprect(lpRect As Long)
  777. CopyMemory ByVal lpRect, ByVal VarPtr(mBtnRcOut), Len(mBtnRcOut)
  778. End Sub