frmOwnerDrawnPreview.frm
上传用户:eleven0727
上传日期:2009-12-26
资源大小:124k
文件大小:10k
源码类别:

Tab控件

开发平台:

Visual Basic

  1. VERSION 5.00
  2. Object = "*A..........MYPROJ~1XTABCH~2XTABprjXTab.vbp"
  3. Begin VB.Form frmOwnerDrawnPreview 
  4.    BorderStyle     =   4  'Fixed ToolWindow
  5.    ClientHeight    =   3870
  6.    ClientLeft      =   45
  7.    ClientTop       =   285
  8.    ClientWidth     =   3825
  9.    BeginProperty Font 
  10.       Name            =   "Verdana"
  11.       Size            =   8.25
  12.       Charset         =   0
  13.       Weight          =   400
  14.       Underline       =   0   'False
  15.       Italic          =   0   'False
  16.       Strikethrough   =   0   'False
  17.    EndProperty
  18.    LinkTopic       =   "Form1"
  19.    MaxButton       =   0   'False
  20.    MinButton       =   0   'False
  21.    ScaleHeight     =   3870
  22.    ScaleWidth      =   3825
  23.    ShowInTaskbar   =   0   'False
  24.    StartUpPosition =   1  'CenterOwner
  25.    Begin prjXTab.XTab XTab1 
  26.       Height          =   2535
  27.       Left            =   90
  28.       TabIndex        =   2
  29.       Top             =   420
  30.       Width           =   3585
  31.       _ExtentX        =   6324
  32.       _ExtentY        =   4471
  33.       TabCaption(0)   =   "Tab 0"
  34.       TabContCtrlCnt(0)=   1
  35.       Tab(0)ContCtrlCap(1)=   "cmdClose"
  36.       TabCaption(1)   =   "Tab 1"
  37.       TabCaption(2)   =   "Tab 2"
  38.       TabTheme        =   4
  39.       BeginProperty ActiveTabFont {0BE35203-8F91-11CE-9DE3-00AA004BB851} 
  40.          Name            =   "Verdana"
  41.          Size            =   8.25
  42.          Charset         =   0
  43.          Weight          =   700
  44.          Underline       =   0   'False
  45.          Italic          =   0   'False
  46.          Strikethrough   =   0   'False
  47.       EndProperty
  48.       BeginProperty InActiveTabFont {0BE35203-8F91-11CE-9DE3-00AA004BB851} 
  49.          Name            =   "Verdana"
  50.          Size            =   8.25
  51.          Charset         =   0
  52.          Weight          =   400
  53.          Underline       =   0   'False
  54.          Italic          =   0   'False
  55.          Strikethrough   =   0   'False
  56.       EndProperty
  57.       DisabledTabBackColor=   -2147483633
  58.       DisabledTabForeColor=   -2147483627
  59.       Begin VB.CommandButton cmdClose 
  60.          Caption         =   "::Close::"
  61.          Height          =   285
  62.          Left            =   1260
  63.          TabIndex        =   3
  64.          Top             =   990
  65.          Width           =   975
  66.       End
  67.    End
  68.    Begin VB.Label Label11 
  69.       Alignment       =   2  'Center
  70.       AutoSize        =   -1  'True
  71.       Caption         =   "::OwnerDrawn::"
  72.       Height          =   195
  73.       Left            =   1095
  74.       TabIndex        =   1
  75.       Top             =   60
  76.       Width           =   1410
  77.    End
  78.    Begin VB.Label Label1 
  79.       Caption         =   "This theme is not complete. I included it in this release just to give an idea what could be done."
  80.       Height          =   615
  81.       Left            =   120
  82.       TabIndex        =   0
  83.       Top             =   3150
  84.       Width           =   3495
  85.    End
  86. End
  87. Attribute VB_Name = "frmOwnerDrawnPreview"
  88. Attribute VB_GlobalNameSpace = False
  89. Attribute VB_Creatable = False
  90. Attribute VB_PredeclaredId = True
  91. Attribute VB_Exposed = False
  92. Option Explicit
  93. '===Types=============================================================================================================
  94. Private Type Size
  95.   cx As Long
  96.   cy As Long
  97. End Type
  98. Private Type RECT
  99.   Left As Long
  100.   Top As Long
  101.   Right As Long
  102.   Bottom As Long
  103. End Type
  104. Private Type LocalTabInfo
  105.   ClickableRect As RECT
  106.   Caption As String
  107. End Type
  108. '=====================================================================================================================
  109. '===Constants=========================================================================================================
  110. Private Const PS_SOLID As Long = 0
  111. '=====================================================================================================================
  112. '===Declarations======================================================================================================
  113. Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long
  114. Private Declare Function TextOut Lib "gdi32.dll" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
  115. Private Declare Function GetClientRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long
  116. 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
  117. Private Declare Function GetTextExtentPoint32 Lib "gdi32.dll" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As Size) As Long
  118. Private Declare Function MoveToEx Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long
  119. Private Declare Function LineTo Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  120. Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
  121. Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
  122. Private Declare Function CreatePen Lib "gdi32.dll" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  123. '=====================================================================================================================
  124. '====Private Variables================================================================================================
  125. Private m_lHwnd As Long
  126. Private m_lHDC As Long
  127. Private m_iActiveTabHeight As Integer
  128. Private m_iActiveTab As Integer
  129. Private m_iTabCount As Integer
  130. Private m_utRect As RECT
  131. Private m_aryTabs() As LocalTabInfo
  132. Private Sub cmdClose_Click()
  133.   Unload Me
  134. End Sub
  135. '=====================================================================================================================
  136. '=====Event Handlers==================================================================================================
  137. Private Sub Form_Load()
  138.   Dim iCnt As Integer
  139.   Dim iTabWidth As Integer
  140.   
  141.   Call pCacheControlProps      'get local copies of properties
  142.   
  143.   ReDim m_aryTabs(m_iTabCount - 1)
  144.   
  145.   iTabWidth = m_utRect.Right / m_iTabCount
  146.   
  147.   For iCnt = 0 To m_iTabCount - 1
  148.     
  149.     m_aryTabs(iCnt).Caption = "Tab " & iCnt
  150.     m_aryTabs(iCnt).ClickableRect.Top = m_utRect.Bottom - m_iActiveTabHeight
  151.     m_aryTabs(iCnt).ClickableRect.Bottom = m_aryTabs(iCnt).ClickableRect.Top + m_iActiveTabHeight
  152.     
  153.     m_aryTabs(iCnt).ClickableRect.Left = iTabWidth * iCnt
  154.     m_aryTabs(iCnt).ClickableRect.Right = m_aryTabs(iCnt).ClickableRect.Left + iTabWidth
  155.     
  156.   Next
  157.   m_aryTabs(iCnt - 1).ClickableRect.Right = m_utRect.Right
  158.   
  159. End Sub
  160. Private Sub XTab1_DrawBackground(ByVal lhWnd As Long, ByVal lHDC As Long)
  161.   Call pCacheControlProps      'get local copy of props
  162.   
  163.   Call Rectangle(m_lHDC, m_utRect.Left, m_utRect.Top, m_utRect.Right, m_utRect.Bottom)
  164. End Sub
  165. Private Sub XTab1_DrawOnActiveTabChange(ByVal lhWnd As Long, ByVal lHDC As Long)
  166.   Call XTab1_DrawTabs(lhWnd, lHDC)
  167. End Sub
  168. Private Sub XTab1_ShowHideFocus(ByVal lhWnd As Long, ByVal lHDC As Long, ByVal bIsFocused As Boolean)
  169.   Call XTab1_DrawBackground(lhWnd, lHDC)
  170.   Call XTab1_DrawTabs(lhWnd, lHDC)
  171. End Sub
  172. Private Sub XTab1_DrawTabs(ByVal lhWnd As Long, ByVal lHDC As Long)
  173.   Dim iCnt As Integer
  174.   Dim utSize As Size
  175.   Dim lPen As Long
  176.   Dim lOldPen As Long
  177.   
  178.  Call pCacheControlProps  'get local copy of props
  179.     
  180.   For iCnt = 0 To m_iTabCount - 1
  181.     With m_aryTabs(iCnt).ClickableRect
  182.       Call Rectangle(m_lHDC, .Left, .Top, .Right, .Bottom)
  183.       
  184.       Call GetTextExtentPoint32(m_lHDC, m_aryTabs(iCnt).Caption, Len(m_aryTabs(iCnt).Caption), utSize)
  185.       
  186.       Call TextOut(m_lHDC, .Left + ((.Right - .Left) / 2) - (utSize.cx / 2), .Top + ((.Bottom - .Top) / 2) - (utSize.cy / 2), m_aryTabs(iCnt).Caption, Len(m_aryTabs(iCnt).Caption))
  187.       
  188.     End With
  189.   Next
  190.   
  191.   With m_aryTabs(m_iActiveTab).ClickableRect
  192.     lPen = CreatePen(PS_SOLID, 1, pGetRGBFromOLE(vbButtonFace))
  193.     lOldPen = SelectObject(m_lHDC, lPen)
  194.     MoveToEx m_lHDC, .Left + 1, .Top, 0&
  195.     LineTo m_lHDC, m_aryTabs(m_iActiveTab).ClickableRect.Right - 1, m_aryTabs(m_iActiveTab).ClickableRect.Top
  196.     SelectObject m_lHDC, lOldPen
  197.     DeleteObject lPen
  198.   End With
  199.   
  200. End Sub
  201. Private Sub XTab1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  202.   Dim iCnt As Integer
  203.   Dim iX As Integer
  204.   Dim iY As Integer
  205.   iX = CInt(x)
  206.   iY = CInt(y)
  207.   Call pCacheControlProps      'get props
  208.   
  209.   If iY < m_utRect.Bottom - m_iActiveTabHeight Then
  210.     'Button = vbRightButton      'prevent actual code in the Xtab to execute
  211.     Exit Sub       'if above the tab height then no need to enter teh loop
  212.   End If
  213.   For iCnt = 0 To m_iTabCount - 1
  214.     If iX >= m_aryTabs(iCnt).ClickableRect.Left And iX <= m_aryTabs(iCnt).ClickableRect.Right Then
  215.       XTab1.ActiveTab = iCnt
  216.       Exit For
  217.     End If
  218.   Next
  219.   
  220.   Button = vbRightButton      'prevent actual code in the Xtab to execute
  221. End Sub
  222. '=====================================================================================================================
  223. '===Private Functions=================================================================================================
  224. ' Convert the OLE color into equivalent RGB Combination
  225. ' i.e. Convert vbButtonFace into ==> Light Grey
  226. Private Function pGetRGBFromOLE(lOleColor As Long) As Long
  227.   Dim lRGBColor As Long
  228.   Call TranslateColor(lOleColor, 0, lRGBColor)
  229.   pGetRGBFromOLE = lRGBColor
  230. End Function
  231. 'get client rect
  232. Private Sub pCacheControlProps()
  233.   m_iActiveTabHeight = XTab1.ActiveTabHeight
  234.   m_lHwnd = XTab1.Handle
  235.   m_lHDC = XTab1.DC
  236.   m_iActiveTab = XTab1.ActiveTab
  237.   m_iTabCount = XTab1.TabCount
  238.   Call GetClientRect(m_lHwnd, m_utRect)
  239.   m_utRect.Right = m_utRect.Right - 1
  240.   m_utRect.Bottom = m_utRect.Bottom - 1
  241. End Sub
  242. '=====================================================================================================================