Sign in to follow this  
Followers 0
funkey

My OwnTab-Control

35 posts in this topic

#1 ·  Posted (edited)

I made my own tab-control!

Posted Image

OwnTab-Gallery

Example

#include "OwnTab.au3"

#cs
Known Bugs:
  --> Bug mit $OwnTab_Style, da diese Variable zur Laufzeit abgefragt wird beim Verstecken und erneuten Anzeigen der Register.
  --> "Zittern" der alarmierten Register, wenn diese bereits angewählt wurden --> durch blinken mit der selben Farbe
#ce
Local $hGui = GUICreate("Funkey's OwnTab-UDF Example", 500, 350)
GUISetBkColor(0xbbbbbb)

$OwnTab_Style = Random(0, 1, 1) ;random style (only 2 styles available!!)

Local $aTabText[5] = ["Settings", "Register without icon", "Pic", "Status", "Tab in Tab"] ;Declare the regions for the OwnTab-control
Local $aTabIcons[5][2] = [["shell32.dll", 130],[""],["shell32.dll", 139],["shell32.dll", 90], ["shell32.dll", 43]]
Global $aCtrlTab = _OwnTab_Create($hGui, $aTabText, 10, 10, 480, 300, 30, 0xD5D5D5, 0xCFE0E7, 0xCFE0E7, $aTabIcons)

Local $aTabTip[5] = ["Tip Item 1", "Tip Item 2", "Tip Item 3", "Alarm-Register"]
_OwnTab_SetTip($aCtrlTab, $aTabTip) ;set the tooltips for the OwnTab-control

#Region Tab1
_OwnTab_Add($aCtrlTab) ;Start controls tab1
Global $Edit1 = GUICtrlCreateEdit("Edit in Tab1", 20, 55, 300, 50, 0)
Global $Button1 = GUICtrlCreateButton("Simulate an alarm", 20, 120, 300, 20)
Global $Box1 = GUICtrlCreateCheckbox("Switch on hover  -  set time -->", 20, 180)
GUICtrlSetBkColor(-1, 0xCFE0E7)
Global $Input1 = GUICtrlCreateInput("1", 200, 180, 50, 20)
GUICtrlCreateUpdown($Input1)
GUICtrlSetLimit(-1, 15, 1)
#EndRegion Tab1

#Region Tab2
_OwnTab_Add($aCtrlTab) ;Start controls tab2
Global $Edit2 = GUICtrlCreateEdit("Edit in Tab2", 20, 150, 300, 50, 0)
Global $Label2 = GUICtrlCreateLabel("Label in Tab2", 20, 220, 300, 20, 0x201)
GUICtrlSetBkColor(-1, -2) ;$GUI_BKCOLOR_TRANSPARENT
#EndRegion Tab2

#Region Tab3
_OwnTab_Add($aCtrlTab) ;Start controls tab3
Global $Labe3 = GUICtrlCreateLabel("If you see this label, you can change the picture-path in scriptline " [email="&@ScriptLineNumber"]&@ScriptLineNumber[/email] + 1 &  "!!", 40, 150, 400, 30, 0x201)
Global $Edit3 = GUICtrlCreatePic(@DocumentsCommonDir & '\Eigene Bilder\Beispielbilder\Winter.jpg', 20, 55, 460, 280)
#EndRegion Tab3

#Region Tab4
_OwnTab_Add($aCtrlTab) ;Start controls tab4
Global $Button4 = GUICtrlCreateButton("Acknowledge the alarm", 20, 120, 300, 20)
Global $Button5 = GUICtrlCreateButton("Enable tab 3", 20, 150, 300, 20)
Global $Button6 = GUICtrlCreateButton("Disable tab 3", 20, 180, 300, 20)
Global $Button7 = GUICtrlCreateButton("Hide tab 2", 20, 240, 300, 20)
Global $Button8 = GUICtrlCreateButton("Show tab 2", 20, 210, 300, 20)
#EndRegion Tab4

#Region Tab5 and "Tab in Tab"
_OwnTab_Add($aCtrlTab) ;Start controls tab5

GUICtrlCreateLabel("Style Black", 30, 50, 200, 20, 0x201)
$OwnTab_Style = 0
Local $aTabText[2] = ["Tab1", "New Info"] ;Declare the regions for the OwnTab-control
Local $aTabIcons[2][2] = [["shell32.dll", 20],["shell32.dll", 40]]
Global $aCtrlTab2 = _OwnTab_Create($hGui, $aTabText, 30, 80, 200, 200, 30, 0xD5D5D5, 0x00ff00, 0x00ff00, $aTabIcons)
_OwnTab_Add($aCtrlTab2) ;Start controls tab1
Global $BtnSet = GUICtrlCreateButton("Simulate", 80, 150, 100, 20)
_OwnTab_Add($aCtrlTab2) ;Start controls tab2
Global $BtnReset = GUICtrlCreateButton("Acknowledge", 80, 170, 100, 20)
_OwnTab_End($aCtrlTab2)

GUICtrlCreateLabel("Style White", 270, 50, 200, 20, 0x201)
$OwnTab_Style = 1
Local $aTabText[2] = ["Tab1", "Tab2"] ;Declare the regions for the OwnTab-control
Local $aTabIcons[2][2] = [["shell32.dll", 10],["shell32.dll", 60]]
Global $aCtrlTab3 = _OwnTab_Create($hGui, $aTabText, 270, 80, 200, 200, 30, 0xD5D5D5, 0x00ff00, 0x00ff00, $aTabIcons)
_OwnTab_Add($aCtrlTab3) ;Start controls tab1
GUICtrlCreateLabel("Just testing...", 280, 150, 100, 20)
GUICtrlSetBkColor(-1, -2)
_OwnTab_Add($aCtrlTab3) ;Start controls tab2
GUICtrlCreateLabel("Hello from tab2", 280, 150, 100, 20)
GUICtrlSetBkColor(-1, -2)
_OwnTab_End($aCtrlTab3)
#EndRegion Tab5

_OwnTab_End($aCtrlTab) ;new: end control-definition AND inizialize the OwnTab

_OwnTab_Disable($aCtrlTab, 3) ;new: disable tabitems
_OwnTab_SetFontCol($aCtrlTab, 0xFF) ;new: set font-color

GUISetState()
_OwnTab_Hover($aCtrlTab, 0xFFFF88) ;start hover-function if you want
_OwnTab_AlarmInit()

Local $msg

While 1
$msg = GUIGetMsg()
For $a = 1 To UBound($aCtrlTab, 1) - 1
  If $msg = $aCtrlTab[$a][0] Then
   _OwnTab_Switch($aCtrlTab, $a)
   If $a = 5 Then
    _OwnTab_Switch($aCtrlTab2, $aCtrlTab2[0][0], 1)
    _OwnTab_Switch($aCtrlTab3, $aCtrlTab3[0][0], 1)
   EndIf
  EndIf
Next
For $a = 1 To UBound($aCtrlTab2, 1) - 1
  If $msg = $aCtrlTab2[$a][0] Then
   _OwnTab_Switch($aCtrlTab2, $a)
  EndIf
Next
For $a = 1 To UBound($aCtrlTab3, 1) - 1
  If $msg = $aCtrlTab3[$a][0] Then
   _OwnTab_Switch($aCtrlTab3, $a)
  EndIf
Next
Switch $msg
  Case $Button1
   _OwnTab_SetAlarm($aCtrlTab, 4, 0xFF0000)
  Case $Button4
   _OwnTab_ResetAlarm($aCtrlTab, 4)
  Case $BtnSet
   _OwnTab_SetAlarm($aCtrlTab2, 2, 0x5050FF)
  Case $BtnReset
   _OwnTab_ResetAlarm($aCtrlTab2, 2)
  Case $Button5
   _OwnTab_Enable($aCtrlTab, 3)
  Case $Button6
   _OwnTab_Disable($aCtrlTab, 3)
  Case $Button7
   _OwnTab_Hide($aCtrlTab, 2)
  Case $Button8
   _OwnTab_Show($aCtrlTab, 2)
  Case $Box1
   If GUICtrlRead($Box1) = 1 Then
    _OwnTab_Hover($aCtrlTab, 0xFFFF88, GUICtrlRead($Input1))
   Else
    _OwnTab_Hover($aCtrlTab, 0xFFFF88, 0)
   EndIf
  Case $Input1
   If GUICtrlRead($Box1) = 1 Then _OwnTab_Hover($aCtrlTab, 0xFFFF88, GUICtrlRead($Input1))
  Case -3
   Exit
EndSwitch 
Sleep(10)
WEnd

OwnTab-UDF

#include-once
#include <GDIPlus.au3>
#include <Array.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#Include <Timers.au3>

#cs
Copyrights to funkey from Autoit.de
#ce

Local $HoverArray[1], $ControlID, $Global_I = 0, $__ControlID, $HoverActive = 0, $Temp_Found = 0, $szTemp_Array[2]
Local $OwnTabHoverCol[2], $OwnTabHoverHelp[1], $OwnTabHoverSwitch, $aOwnTabHoverCount, $OwnTabHoverCtrl
Local $aOwnTabAlarm[1][3], $iOwnTabAlarm, $hOwnTabGui, $hTimerAlarm, $hTimerHover
Local $OwnTab_Style = 0 ; only 0 or 1 !

_GDIPlus_Startup()
Opt("OnExitFunc", "_OwnTab_OnExit")

Func _OwnTab_Create($hWnd, $aTabText, $xPos, $yPos, $iWidth, $iHeight, $iItemHeight = -1, $nColNoSel = -1, $nColSel = -1, $nColBg = -1, $aIcons = "")
Local $aSize, $aSize2[UBound($aTabText)][2], $xLast = 0, $aCtrl[UBound($aTabText) + 1][11], $iOffset = 0
If Not IsArray($aIcons) Then
  Local $Icons[UBound($aTabText)][2]
Else
  Local $Icons = $aIcons
EndIf
If Not IsArray($aTabText) Then Return SetError(1, 0, "")
For $i = 0 To UBound($aTabText) - 1
  If $aTabText[$i] = "" Then Return SetError(2, $i + 1, "")
  $aSize = _GetTextSize($aTabText[$i])
  $aSize[0] += Ceiling($aSize[0] / 10) ;make it 10% longer for bold text
  $aSize2[$i][0] = $aSize[0]
  $aSize2[$i][1] = $aSize[1]
  If $iItemHeight = -1 Then $iItemHeight = $aSize[1]
  If $Icons[$i][0] <> "" Then
   $iOffset = $iItemHeight
   $aTabText[$i] &= " "
  Else
   $iOffset = 0
  EndIf
  $aCtrl[$i + 1][7] = $Icons[$i][0] ;filename for icon
  $aCtrl[$i + 1][8] = $Icons[$i][1] ;index for icon
  $aCtrl[$i + 1][9] = $aSize[0] + 5 + $iOffset ;labelwidth
  $aCtrl[$i + 1][0] = GUICtrlCreateLabel($aTabText[$i], $xPos + $xLast + 5, $yPos + 2, $aCtrl[$i + 1][9], $iItemHeight, 0x411201 + ($Icons[$i][0] <> ""), $OwnTab_Style)
  _HoverAddCtrl($aCtrl[$i + 1][0])
  If $Icons[$i][0] <> "" Then
   $aCtrl[$i + 1][6] = GUICtrlCreateIcon("", 0, $xPos + $xLast + 8, $yPos + 5, $iItemHeight - 6, $iItemHeight - 6)
  Else
   $aCtrl[$i + 1][6] = GUICtrlCreateDummy()
  EndIf
;~   If $Icons[$i][0] <> "" Then _SetBkIcon($aCtrl[$i + 1][6], $nColNoSel, $aCtrl[$i + 1][7], $aCtrl[$i + 1][8], $iItemHeight - 6, $iItemHeight - 6)
  GUICtrlCreateLabel($aCtrl[$i + 1][7], -200, -200) ;For information
  GUICtrlCreateLabel($aCtrl[$i + 1][8], -200, -200) ;For information
  GUICtrlCreateLabel($iItemHeight - 6, -200, -200) ;For information
  $aCtrl[$i + 1][2] = $nColNoSel
  $aCtrl[$i + 1][3] = $nColSel
  $xLast += $aCtrl[$i + 1][9]
Next
GUICtrlCreateLabel("", $xPos, $yPos + $iItemHeight, $iWidth, $iHeight, 0x411000, $OwnTab_Style)
GUICtrlSetState(-1, 128) ;$GUI_DISABLE
GUICtrlSetBkColor(-1, $nColBg)
$xLast = 0
For $i = 0 To UBound($aTabText) - 1
  If $Icons[$i][0] <> "" Then
   $iOffset = $iItemHeight
  Else
   $iOffset = 0
  EndIf
  $aCtrl[$i + 1][1] = GUICtrlCreateLabel("", $xPos + $xLast + 6, $yPos + $iItemHeight - $OwnTab_Style, $aSize2[$i][0] + 3 + $iOffset, 2+2*$OwnTab_Style)
  GUICtrlSetBkColor(-1, $nColSel)
  $xLast += $aSize2[$i][0] + 5 + $iOffset
Next
$aCtrl[0][1] = $iItemHeight
$aCtrl[0][2] = $nColNoSel
$aCtrl[0][3] = $nColSel
$aCtrl[0][9] = $yPos + 2
$hOwnTabGui = $hWnd
Return $aCtrl
EndFunc   ;==>_OwnTab_Create

Func _OwnTab_Switch(ByRef $aOwnTab, $iIndex, $fForce = 0)
_OwnTab_UnRegisterHover($aOwnTab, $iIndex)
If _OwnTab_IsAlarmed($aOwnTab[$iIndex][0]) Then $aOwnTabAlarm[@extended][2] = $aOwnTabAlarm[@extended][1]
$HoverActive = 0
If $aOwnTab[0][0] = $iIndex And $fForce = 0 Then Return
For $s = 1 To UBound($aOwnTab, 1) - 1
  If $iIndex <> $s Then
   GUICtrlSetState($aOwnTab[$s][1], 32) ;$GUI_HIDE
   GUICtrlSetFont($aOwnTab[$s][0], -1, 400)
   If Not _OwnTab_IsAlarmed($aOwnTab[$s][0]) Then 
    GUICtrlSetBkColor($aOwnTab[$s][0], $aOwnTab[$s][2])
    If $aOwnTab[$s][7] <> "" Then _SetBkIcon($aOwnTab[$s][6], $aOwnTab[$s][2], $aOwnTab[$s][7], $aOwnTab[$s][8], GUICtrlRead($aOwnTab[$s][0] + 4), GUICtrlRead($aOwnTab[$s][0] + 4))
   EndIf
   If _ArraySearch($OwnTabHoverHelp, $aOwnTab[$s][0]) = -1 Then
    _OwnTab_RegisterHover($aOwnTab, $s)
   EndIf
  Else
   GUICtrlSetFont($aOwnTab[$iIndex][0], -1, 1000)
   If Not _OwnTab_IsAlarmed($aOwnTab[$s][0]) Then 
    GUICtrlSetBkColor($aOwnTab[$iIndex][0], $aOwnTab[$iIndex][3])
    If $aOwnTab[$s][7] <> "" Then _SetBkIcon($aOwnTab[$iIndex][6], $aOwnTab[$iIndex][3], $aOwnTab[$s][7], $aOwnTab[$s][8], GUICtrlRead($aOwnTab[$s][0] + 4), GUICtrlRead($aOwnTab[$s][0] + 4))
   EndIf
   GUICtrlSetState($aOwnTab[$iIndex][1], 16) ;$GUI_SHOW
  EndIf
Next
If $aOwnTab[0][0] = "" Or $fForce Then
  For $t = $aOwnTab[0][4] To $aOwnTab[UBound($aOwnTab, 1) - 1][4]
   GUICtrlSetState($t, 32) ;$GUI_HIDE
   If $t > $aOwnTab[$iIndex - 1][4] And $t < $aOwnTab[$iIndex][4] Then GUICtrlSetState($t, 16) ;$GUI_SHOW
  Next
Else
  For $t = $aOwnTab[$aOwnTab[0][0] - 1][4] To $aOwnTab[$aOwnTab[0][0]][4]
   GUICtrlSetState($t, 32) ;$GUI_HIDE
  Next
  For $t = $aOwnTab[$iIndex - 1][4] To $aOwnTab[$iIndex][4]
   GUICtrlSetState($t, 16) ;$GUI_SHOW
  Next
EndIf
$aOwnTab[0][0] = $iIndex
EndFunc   ;==>_OwnTab_Switch

Func _OwnTab_SetTip(ByRef $aOwnTab, $ToolTips = "", $iIndex = "")
If IsArray($ToolTips) Then
  For $i = 1 To UBound($aOwnTab, 1) - 1
   $aOwnTab[$i][5] = $ToolTips[$i - 1]
   GUICtrlSetTip($aOwnTab[$i][0], $ToolTips[$i - 1])
  Next
Else
  If $iIndex = "" Then Return SetError(1)
  $aOwnTab[$iIndex][5] = $ToolTips
  GUICtrlSetTip($aOwnTab[$iIndex][0], $ToolTips)
EndIf
EndFunc   ;==>_OwnTab_SetTip

Func _OwnTab_AlarmInit($iTime = 555)
If Not $hTimerAlarm Then
  $hTimerAlarm = _Timer_SetTimer($hOwnTabGui, $iTime, "_OwnTab_AlarmBlink")
Else
  $hTimerAlarm = _Timer_SetTimer($hOwnTabGui, $iTime, "", $hTimerAlarm)
EndIf
EndFunc   ;==>_OwnTab_AlarmInit

Func _OwnTab_AlarmBlink($hWnd, $Msg, $iIDTimer, $dwTime)
Local $AlarmColAct
$iOwnTabAlarm = Not $iOwnTabAlarm
For $i = 1 To UBound($aOwnTabAlarm, 1) - 1
  If $iOwnTabAlarm Then
   $AlarmColAct = $aOwnTabAlarm[$i][2]
  Else
   $AlarmColAct = $aOwnTabAlarm[$i][1]
  EndIf
  GUICtrlSetBkColor($aOwnTabAlarm[$i][0], $AlarmColAct)
  _SetBkIcon($aOwnTabAlarm[$i][0] + 1, $AlarmColAct, GUICtrlRead($aOwnTabAlarm[$i][0] + 2), GUICtrlRead($aOwnTabAlarm[$i][0] + 3), GUICtrlRead($aOwnTabAlarm[$i][0] + 4), GUICtrlRead($aOwnTabAlarm[$i][0] + 4))
Next
EndFunc   ;==>_OwnTab_AlarmBlink

Func _OwnTab_SetAlarm(ByRef $aOwnTab, $iIndex, $nAlarmSel = 0xFF0000)
Local $hCtrl = $aOwnTab[$iIndex][0]
Local $iSearch = _ArraySearch($aOwnTabAlarm, $hCtrl)
If $iSearch <> -1 Then Return
ReDim $aOwnTabAlarm[UBound($aOwnTabAlarm, 1) + 1][3]
$aOwnTabAlarm[UBound($aOwnTabAlarm, 1) - 1][0] = $hCtrl
$aOwnTabAlarm[UBound($aOwnTabAlarm, 1) - 1][1] = $nAlarmSel
$aOwnTabAlarm[UBound($aOwnTabAlarm, 1) - 1][2] = $aOwnTab[$iIndex][2]
;~  GUICtrlSetBkColor($aOwnTab[$iIndex][1], $nAlarmSel)
EndFunc   ;==>_OwnTab_SetAlarm

Func _OwnTab_ResetAlarm(ByRef $aOwnTab, $iIndex)
Local $hCtrl = $aOwnTab[$iIndex][0]
Local $iSearch = _ArraySearch($aOwnTabAlarm, $hCtrl)
If $iSearch = -1 Then Return
_ArrayDelete($aOwnTabAlarm, $iSearch)
$aOwnTab[$iIndex][2] = $aOwnTab[0][2]
$aOwnTab[$iIndex][3] = $aOwnTab[0][3]
;~  GUICtrlSetBkColor($aOwnTab[$iIndex][1], $aOwnTab[0][3])
If $aOwnTab[0][0] <> $iIndex Then
  GUICtrlSetBkColor($aOwnTab[$iIndex][0], $aOwnTab[0][2])
Else
  _SetBkIcon($aOwnTab[$iIndex][0] + 1, $aOwnTab[$iIndex][3], $aOwnTab[$iIndex][7], $aOwnTab[$iIndex][8], GUICtrlRead($aOwnTab[$iIndex][0] + 4), GUICtrlRead($aOwnTab[$iIndex][0] + 4))
  GUICtrlSetBkColor($aOwnTab[$iIndex][0], $aOwnTab[0][3])
EndIf
EndFunc   ;==>_OwnTab_ResetAlarm

Func _OwnTab_Add(ByRef $aOwnTab)
Local $i = 0
While 1
  If $aOwnTab[$i][4] = "" Then ExitLoop
  $i += 1
WEnd
$aOwnTab[$i][4] = GUICtrlCreateDummy()
EndFunc   ;==>_OwnTab_Add

Func _OwnTab_End(ByRef $aOwnTab, $iIndex = 1)
$aOwnTab[UBound($aOwnTab, 1) - 1][4] = GUICtrlCreateDummy()
_OwnTab_Switch($aOwnTab, $iIndex)
EndFunc   ;==>_OwnTab_End

Func _OwnTab_Hover($aOwnTab, $nColHover, $fSwitch = 0, $iTime = 50)
$OwnTabHoverCol[0] = $nColHover
$OwnTabHoverCol[1] = $aOwnTab[0][2]
$OwnTabHoverSwitch = $fSwitch
If Not $hTimerHover Then
  $hTimerHover = _Timer_SetTimer($hOwnTabGui, $iTime, "_ProcessHover")
Else
  $hTimerHover = _Timer_SetTimer($hOwnTabGui, $iTime, "", $hTimerHover)
EndIf
EndFunc   ;==>_OwnTab_Hover

Func _OwnTab_RegisterHover($aOwnTab, $iIndex)
If _ArraySearch($HoverArray, $aOwnTab[$iIndex][0]) = -1 Then _HoverAddCtrl($aOwnTab[$iIndex][0])
EndFunc   ;==>_OwnTab_RegisterHover

Func _OwnTab_UnRegisterHover($aOwnTab, $iIndex)
Local $iSearch = _ArraySearch($HoverArray, $aOwnTab[$iIndex][0])
If $iSearch <> -1 Then _ArrayDelete($HoverArray, $iSearch)
EndFunc   ;==>_OwnTab_UnRegisterHover

#Region Disable and Enable Tab-Register
Func _OwnTab_Disable($aOwnTab, $iIndex)
GUICtrlSetState($aOwnTab[$iIndex][0], 128)
_OwnTab_UnRegisterHover($aOwnTab, $iIndex)
Local $iSearch = _ArraySearch($OwnTabHoverHelp, $aOwnTab[$iIndex][0])
If $iSearch = -1 Then _ArrayAdd($OwnTabHoverHelp, $aOwnTab[$iIndex][0])
EndFunc   ;==>_OwnTab_Disable

Func _OwnTab_Enable($aOwnTab, $iIndex)
GUICtrlSetState($aOwnTab[$iIndex][0], 64)
_OwnTab_RegisterHover($aOwnTab, $iIndex)
Local $iSearch = _ArraySearch($OwnTabHoverHelp, $aOwnTab[$iIndex][0])
If $iSearch <> -1 Then _ArrayDelete($OwnTabHoverHelp, $iSearch)
EndFunc   ;==>_OwnTab_Enable
#EndRegion Disable and Enable Tab-Register

Func _OwnTab_Hide(ByRef $aOwnTab, $iIndex)
If $iIndex = 0 Or $iIndex > UBound($aOwnTab, 1) - 1 Then Return SetError(1)
If BitAND(GUICtrlGetState($aOwnTab[$iIndex][0]), 32) Then Return
GUICtrlSetState($aOwnTab[$iIndex][0], 32) ;$GUI_HIDE
GUICtrlSetState($aOwnTab[$iIndex][1], 32) ;$GUI_HIDE
GUICtrlSetState($aOwnTab[$iIndex][6], 32) ;$GUI_HIDE

Local $Offset = 3
For $o = 0 To $iIndex - 1
  $Offset += $aOwnTab[$o][9] - 0
Next

For $o = $iIndex + 1 To UBound($aOwnTab, 1) - 1
  GUICtrlSetPos($aOwnTab[$o][0], $Offset, $aOwnTab[0][9])
  GUICtrlSetPos($aOwnTab[$o][1], $Offset + 1, $aOwnTab[0][9] + $aOwnTab[0][1] - 2 - $OwnTab_Style)
  GUICtrlSetPos($aOwnTab[$o][6], $Offset + 3, $aOwnTab[0][9] + 3)
  $Offset += $aOwnTab[$o][9]
Next
If $iIndex = $aOwnTab[0][0] Then
  If $iIndex = 1 Then
   _OwnTab_Switch($aOwnTab, 2)
  Else
   _OwnTab_Switch($aOwnTab, $iIndex - 1)
  EndIf
EndIf
EndFunc   ;==>_OwnTab_Hide

Func _OwnTab_Show(ByRef $aOwnTab, $iIndex, $iActivate = 0)
If $iIndex = 0 Or $iIndex > UBound($aOwnTab, 1) + 1 Then Return SetError(1)
If BitAND(GUICtrlGetState($aOwnTab[$iIndex][0]), 16) Then Return

Local $Offset = 3
For $o = 0 To UBound($aOwnTab, 1) - 2
  $Offset += $aOwnTab[$o][9] - 0
Next

For $o = UBound($aOwnTab, 1) - 1 To $iIndex + 1 Step -1
  GUICtrlSetPos($aOwnTab[$o][0], $Offset, $aOwnTab[0][9])
  GUICtrlSetPos($aOwnTab[$o][1], $Offset + 1, $aOwnTab[0][9] + $aOwnTab[0][1] - 2 - $OwnTab_Style)
  GUICtrlSetPos($aOwnTab[$o][6], $Offset + 3, $aOwnTab[0][9] + 3)
  $Offset -= $aOwnTab[$o - 1][9]
Next

GUICtrlSetState($aOwnTab[$iIndex][0], 16) ;$GUI_SHOW
GUICtrlSetState($aOwnTab[$iIndex][6], 16) ;$GUI_SHOW

If $iActivate Then
  _OwnTab_Switch($aOwnTab, $iIndex)
EndIf
EndFunc   ;==>_OwnTab_Show

Func _OwnTab_SetFontCol($aOwnTab, $nColor, $iIndex = "")
If $iIndex = "" Then
  For $i = 1 To UBound($aOwnTab, 1) - 1
   GUICtrlSetColor($aOwnTab[$i][0], $nColor)
  Next
Else
  If $iIndex < 1 Or $iIndex >= UBound($aOwnTab, 1) Then Return SetError(1)
  GUICtrlSetColor($aOwnTab[$iIndex][0], $nColor)
EndIf
EndFunc   ;==>_OwnTab_SetFontCol

Func _OwnTab_SetOnEvent($aOwnTab, $sFunc = "", $iIndex = "")
If $sFunc = "" Then $sFunc = "_OwnTab_OnEvent"
If $iIndex = "" Then
  For $f = 1 To UBound($aOwnTab, 1) -1
   GUICtrlSetOnEvent($aOwnTab[$f][0], $sFunc)
  Next
Else
  If $iIndex < 1 Or $iIndex >= UBound($aOwnTab, 1) Then Return SetError(1)
  GUICtrlSetOnEvent($aOwnTab[$iIndex][0], $sFunc)
EndIf
EndFunc

;~ Func _OwnTab_OnEvent() ;for example
;~  For $a = 1 To UBound($aCtrlTab, 1) -1
;~   If @GUI_CtrlId = $aCtrlTab[$a][0] Then ExitLoop
;~  Next
;~  If $a < UBound($aCtrlTab, 1) Then _OwnTab_Switch($aCtrlTab, $a) 
;~ EndFunc

Func _OwnTab_OnExit()
_GDIPlus_Shutdown()
If $hTimerAlarm Then _Timer_KillTimer($hOwnTabGui, $hTimerAlarm)
If $hTimerHover Then _Timer_KillTimer($hOwnTabGui, $hTimerHover)
EndFunc   ;==>_OwnTab_Exit

Func _GetTextSize($nText, $sFont = 'Microsoft Sans Serif', $iFontSize = 8.5, $iFontAttributes = 0)
;Author: Bugfix
;Modified: funkey
If $nText = '' Then Return
Local $hGui = GUICreate("Textmeter by Bugfix")
;~  _GDIPlus_Startup()
Local $hFormat = _GDIPlus_StringFormatCreate(0)
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3)
Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0)
Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat)
Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width"))
Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height"))
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_GraphicsDispose($hGraphic)
;~  _GDIPlus_Shutdown()
GUIDelete($hGui)
Local $aSize[2] = [$iWidth, $iHeight]
Return $aSize
EndFunc   ;==>_GetTextSize

Func _ProcessHover($hWnd, $Msg, $iIDTimer, $dwTime)
If $OwnTabHoverSwitch > 1 And $OwnTabHoverCtrl <> "" Then
  If $aOwnTabHoverCount < $OwnTabHoverSwitch Then $aOwnTabHoverCount += 1
  If $aOwnTabHoverCount >= $OwnTabHoverSwitch Then
   ControlClick($hOwnTabGui, "", $OwnTabHoverCtrl)
   $aOwnTabHoverCount = 0
   $OwnTabHoverCtrl = ""
  EndIf
EndIf
$ControlID = _HoverCheck()
If IsArray($ControlID) Then
  If $ControlID[0] = "AcquiredHover" Then
   $OwnTabHoverCtrl = $ControlID[1]
   $aOwnTabHoverCount = 0
   If $OwnTabHoverSwitch = "1" Then
    Return ControlClick($hOwnTabGui, "", $OwnTabHoverCtrl)
   Else
    _HoverFound($ControlID[1])
   EndIf
  Else
   If $ControlID[1] <> "" Then
    _HoverLost($ControlID[1])
    $OwnTabHoverCtrl = ""
   EndIf
  EndIf
EndIf
EndFunc   ;==>_ProcessHover

Func _HoverLost($ControlID)
If _OwnTab_IsAlarmed($ControlID) Then Return
GUICtrlSetBkColor($ControlID, $OwnTabHoverCol[1])
If GUICtrlRead($ControlID + 2) <> "" Then _SetBkIcon($ControlID + 1, $OwnTabHoverCol[1], GUICtrlRead($ControlID + 2), GUICtrlRead($ControlID + 3), GUICtrlRead($ControlID + 4), GUICtrlRead($ControlID + 4))
EndFunc   ;==>_HoverLost

Func _HoverFound($ControlID)
If _OwnTab_IsAlarmed($ControlID) Then Return
GUICtrlSetBkColor($ControlID, $OwnTabHoverCol[0])
If GUICtrlRead($ControlID + 2) <> "" Then _SetBkIcon($ControlID + 1, $OwnTabHoverCol[0], GUICtrlRead($ControlID + 2), GUICtrlRead($ControlID + 3), GUICtrlRead($ControlID + 4), GUICtrlRead($ControlID + 4))
EndFunc   ;==>_HoverFound

Func _OwnTab_IsAlarmed($hCtrl)
Local $iSearch = _ArraySearch($aOwnTabAlarm, $hCtrl)
If $iSearch = -1 Then Return 0
Return SetExtended($iSearch, 1)
EndFunc

#Region _MouseHover.au3
;====================================================================================================================================
; UDF Name: _MouseHover.au3
;
; Author: marfdaman (Marvin)
;
; Contributions: RazerM (adding SetText parameter to _HoverFound and _HoverUndo).
;
; email: marfdaman at gmail dot com
;
; Use: Enable hover events for controls
;
; Note(s): If you want to use this i.c.w. an AdlibEnable in your current script, make your Adlib call "_HoverCheck()" as well.
; In this case, _HoverOn must NOT be called.
;====================================================================================================================================


;===============================================================================
; Description:   _HoverAddCtrl
; Parameter(s):  $___ControlID -> Control ID of control to be hoverchecked
;
; Requirement:   Array.au3
; Return Value(s): None
;===============================================================================
Func _HoverAddCtrl($___ControlID)
_ArrayAdd($HoverArray, $___ControlID)
EndFunc   ;==>_HoverAddCtrl


;===============================================================================
; Description:   Checks whether the mousecursor is hovering over any of the defined controls.
; Parameter(s):  None
; Requirement:   None
; Return Value(s): If a control has matched, an array will be returned, with $array[1] being either
;   "AcquiredHover" or "LostHover". $array[2] will contain the control ID.
;   It is recommended that you put this function in an AdlibEnable, since it's EXTREMELY
;   resource friendly.
;===============================================================================
Func _HoverCheck()
$HoverData = GUIGetCursorInfo()
If Not IsArray($HoverData) Then Return
$Temp_Found = 0
For $i = 1 To UBound($HoverArray) - 1
  If $HoverData[4] = $HoverArray[$i] Or $HoverData[4] = $HoverArray[$i] + 1 Then
   $Temp_Found = $i
  EndIf
Next
Select
  Case $Temp_Found = 0 And $HoverActive = 1 Or $Temp_Found <> 0 And $Temp_Found <> $Global_I And $HoverActive = 1
   $HoverActive = 0
   $Temp_Found = 0
   $szTemp_Array[0] = "LostHover"
   $szTemp_Array[1] = $HoverArray[$Global_I]
   Return $szTemp_Array
  Case $Temp_Found > 0 And $HoverActive = 0
   $Global_I = $Temp_Found
   $HoverActive = 1
   $Temp_Found = 0
   $szTemp_Array[0] = "AcquiredHover"
   $szTemp_Array[1] = $HoverArray[$Global_I]
   Return $szTemp_Array
EndSelect
EndFunc   ;==>_HoverCheck
#EndRegion _MouseHover.au3

Func _SetBkIcon($ControlID, $iBackground, $sIcon, $iIndex, $iWidth, $iHeight)
;Yashied
;http://www.autoitscript.com/forum/index.php?showtopic=92207&view=findpost&p=662886
Const $STM_SETIMAGE = 0x0172

Local $tIcon, $tID, $hDC, $hBackDC, $hBackSv, $hBitmap, $hImage, $hIcon, $hBkIcon

$tIcon = DllStructCreate('hwnd')
$tID = DllStructCreate('hwnd')
$hIcon = DllCall('user32.dll', 'int', 'PrivateExtractIcons', 'str', $sIcon, 'int', $iIndex, 'int', $iWidth, 'int', $iHeight, 'ptr', DllStructGetPtr($tIcon), 'ptr', DllStructGetPtr($tID), 'int', 1, 'int', 0)
If (@error) Or ($hIcon[0] = 0) Then
  Return SetError(1, 0, 0)
EndIf
$hIcon = DllStructGetData($tIcon, 1)
$tIcon = 0
$tID = 0

$hDC = _WinAPI_GetDC(0)
$hBackDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateSolidBitmap(0, $iBackground, $iWidth, $iHeight)
$hBackSv = _WinAPI_SelectObject($hBackDC, $hBitmap)
_WinAPI_DrawIconEx($hBackDC, 0, 0, $hIcon, 0, 0, 0, 0, $DI_NORMAL)

;~  _GDIPlus_Startup()

$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
$hBkIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'hWnd', $hImage, 'int*', 0)
$hBkIcon = $hBkIcon[2]
_GDIPlus_ImageDispose($hImage)

GUICtrlSendMsg($ControlID, $STM_SETIMAGE, $IMAGE_ICON, _WinAPI_CopyIcon($hBkIcon))
_WinAPI_RedrawWindow(GUICtrlGetHandle($ControlID))

;~  _GDIPlus_Shutdown()

_WinAPI_SelectObject($hBackDC, $hBackSv)
_WinAPI_DeleteDC($hBackDC)
_WinAPI_ReleaseDC(0, $hDC)
_WinAPI_DeleteObject($hBkIcon)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hIcon)

Return SetError(0, 0, 1)
EndFunc   ;==>_SetBkIcon

Have fun!

Edit: Fixed a problem with the hover-function

Edit2: New version with Icon-support and hover-switch Posted Image

Edit3: New improved version!!

OwnTab.au3

OwnTab_Example.au3

Edited by funkey
1 person likes this

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites



Nice work funkey! GUI looks good! :)

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Thanks a lot, RockemSockem and UEZ!!

I fixed one problem with the hover-effect, see post#1!

Do you have any ideas what's to do to improve it? Tell me.


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites

Tabulous! Great job!

Do you have any ideas what's to do to improve it? Tell me.

  • Icon/background image support.
  • I sometimes have a need to fire the tab event on hover, but that's probably an obscure request.

I might have a few more suggestions after I check it out a little more, thanks for sharing!

Share this post


Link to post
Share on other sites

Thank you all.

I added icon-support and hover-switch as you wanted. Looks great. See post#1.


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites

Welcome back autoitscript.com!!!

I improved my UDF! Now it works fine!

See post#1


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites

#9 ·  Posted (edited)

Thanks a lot, RockemSockem and UEZ!!

I fixed one problem with the hover-effect, see post#1!

Do you have any ideas what's to do to improve it? Tell me.

Are You ask for idea to improve, I've a lot; but first let me thank you, a very good work,  I will learn from this.

1- Check SciTE tabs, can I move the tabs.

2- Could be a button to close the tab - same as Opera, FireFox.

I am working on a free project, for the Holy Bible in Arabic, which is 100% AutoIT.

this is the test version, working on Rev. 01

http://www.4shared.com/file/112953701/17b9f2a1/___-_.html

So I may use your work for  different Bible section, or different  search pages.

Edited by aymhenry

Share this post


Link to post
Share on other sites

Wow, thanks for implementing the suggestions!

Keep on tearing it up!

Share this post


Link to post
Share on other sites

This is fantastic and I will definitely use one day, thanks for sharing. I have a suggestion for you to consider. You could use gradients for the tab background and even potentially for the border.

Share this post


Link to post
Share on other sites

Some ideas:

#include <WindowsConstants.au3>
#Include <WinAPI.au3>

$hGui = GUICreate("Overview OwnTab-Styles", 840, 400)
GUISetBkColor(0xFF080)

_OwnTab_Style1($hGui, 20, 20, 200, 45)
_OwnTab_Pic(@DocumentsCommonDir & '\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg', 200, 45)
_OwnTab_Label("Style 1", 200, 45)
_OwnTab_Style1($hGui, 220, 20, 200, 45)
_OwnTab_Label("Style 1", 200, 45, 0x201, 0x1)
_OwnTab_Style1($hGui, 420, 20, 200, 45)
_OwnTab_Label("Style 1", 200, 45, 0x411201)
_OwnTab_Style1($hGui, 620, 20, 200, 45)
_OwnTab_Gradient(0xffff00, 0xFF080, 200, 45)
_OwnTab_Label("Style 1", 200, 45)

_OwnTab_Style2($hGui, 20, 80, 200, 45)
_OwnTab_Pic(@DocumentsCommonDir & '\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg', 200, 45)
_OwnTab_Label("Style 2", 200, 45)
_OwnTab_Style2($hGui, 220, 80, 200, 45)
_OwnTab_Label("Style 2", 200, 45, 0x201, 0x1)
_OwnTab_Style2($hGui, 420, 80, 200, 45)
_OwnTab_Label("Style 2", 200, 45, 0x411201)
_OwnTab_Style2($hGui, 620, 80, 200, 45)
_OwnTab_Gradient(0xffff00, 0xff9090, 200, 45)
_OwnTab_Label("Style 2", 200, 45)

_OwnTab_Style3($hGui, 20, 140, 200, 45)
_OwnTab_Pic(@DocumentsCommonDir & '\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg', 200, 45)
_OwnTab_Label("Style 3", 200, 45)
_OwnTab_Style3($hGui, 220, 140, 200, 45)
_OwnTab_Label("Style 3", 200, 45, 0x201, 0x1)
_OwnTab_Style3($hGui, 420, 140, 200, 45)
_OwnTab_Label("Style 3", 200, 45, 0x411201)
_OwnTab_Style3($hGui, 620, 140, 200, 45)
_OwnTab_Gradient(0xffff00, 0x10a0ff, 200, 45)
_OwnTab_Label("Style 3", 200, 45)

_OwnTab_Style4($hGui, 20, 200, 200, 45)
_OwnTab_Pic(@DocumentsCommonDir & '\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg', 200, 45)
_OwnTab_Label("Style 4", 200, 45)
_OwnTab_Style4($hGui, 220, 200, 200, 45)
_OwnTab_Label("Style 4", 200, 45, 0x201, 0x1)
_OwnTab_Style4($hGui, 420, 200, 200, 45)
_OwnTab_Label("Style 4", 200, 45, 0x411201)
_OwnTab_Style4($hGui, 620, 200, 200, 45)
_OwnTab_Gradient(0xffff00, 0x90ff90, 200, 45)
_OwnTab_Label("Style 4", 200, 45)

_OwnTab_Style5($hGui, 20, 260, 200, 45)
_OwnTab_Pic(@DocumentsCommonDir & '\Eigene Bilder\Beispielbilder\Sonnenuntergang.jpg', 200, 45)
_OwnTab_Label("Style 5", 200, 45)
_OwnTab_Style5($hGui, 220, 260, 200, 45)
_OwnTab_Label("Style 5", 200, 45, 0x201, 0x1)
_OwnTab_Style5($hGui, 420, 260, 200, 45)
_OwnTab_Label("Style 5", 200, 45, 0x411201)
_OwnTab_Style5($hGui, 620, 260, 200, 45)
_OwnTab_Gradient(0xffff00, 0xffffff, 200, 45)
_OwnTab_Label("Style 5", 200, 45)

GUISwitch($hGui)
GUISetState()

Local $msg
Do
 $msg = GUIGetMsg()
 If $msg > 0 Then MsgBox(0, "OwnTab", "You pressed tab with ID " & $msg & ".")
Until $msg = -3

Func _OwnTab_Label($sText, $iWidth, $iHeight, $iStyle = 0x201, $iExStyle = 0x0)
 Local $Label = GUICtrlCreateLabel($sText, 0, 0, $iWidth, $iHeight, $iStyle, $iExStyle)
 GUICtrlSetBkColor(-1, -2)
 Return $Label
EndFunc

Func _OwnTab_Pic($sFileName, $iWidth, $iHeight, $iStyle = 0x0, $iExStyle = 0x0)
 Local $Pic = GUICtrlCreatePic($sFileName, 0, 0, $iWidth, $iHeight, $iStyle, $iExStyle)
 GUICtrlSetState(-1, 128) ;$GUI_DISABLE
 Return $Pic
EndFunc   ;==>_OwnTab_Pic

Func _OwnTab_Gradient($nStartColor, $nEndColor, $iWidth, $iHeight)
    Local $colorR = Dec(StringLeft(Hex($nStartColor, 6), 2))
    Local $colorG = Dec(StringMid(Hex($nStartColor, 6), 3, 2))
    Local $colorB = Dec(StringMid(Hex($nStartColor, 6), 5, 2))
 
    Local $StepR = (Dec(StringLeft(Hex($nEndColor, 6), 2)) - $colorR) / ($iHeight - 1)
    Local $StepG = (Dec(StringMid(Hex($nEndColor, 6), 3, 2)) - $colorG) / ($iHeight - 1)
    Local $StepB = (Dec(StringMid(Hex($nEndColor, 6), 5, 2)) - $colorB) / ($iHeight - 1)
 
 Local $hGraph = GUICtrlCreateGraphic(0, 0, $iWidth, $iHeight)
 Local $sCol
    For $i = 0 To $iHeight - 1
  $sCol = StringFormat("0x%02X%02X%02X", $colorR + $StepR * $i, $colorG + $StepG * $i, $colorB + $StepB * $i)
  GUICtrlSetGraphic(-1, 8, $sCol) ;$GUI_GR_COLOR = 8
  GUICtrlSetGraphic(-1, 6, 0, $i) ;$GUI_GR_MOVE = 6
  GUICtrlSetGraphic(-1, 2, $iWidth, $i) ;$GUI_GR_LINE = 2
    Next
 Return $hGraph
EndFunc   ;==>_OwnTab_Gradient

Func _OwnTab_Style1($hWnd, $iX, $iY, $iWidth, $iHeight)
 Local $rgn, $rgn2, $rel = $iHeight/5
 Local $hGui = GUICreate("OwnTab", $iWidth, $iHeight, $iX, $iY, 0x40000000, 0, $hWnd)
 $rgn = _WinAPI_CreateRectRgn(0, $rel, $iX + $iWidth, $iY + $iHeight)
 For $i = 0 To $rel - 1
  $rgn2 = _WinAPI_CreateRectRgn($rel - $i, $i, $iWidth - $rel + $i + 1, $i + 1)
  _WinAPI_CombineRgn($rgn, $rgn, $rgn2, $RGN_OR)
  _WinAPI_DeleteObject($rgn2)
 Next
 _WinAPI_SetWindowRgn($hGui, $rgn)
 GUISetState()
 Return $hGui
EndFunc   ;==>_OwnTab_Style1

Func _OwnTab_Style2($hWnd, $iX, $iY, $iWidth, $iHeight)
 Local $rgn, $rgn2
 Local $hGui = GUICreate("OwnTab", $iWidth, $iHeight, $iX, $iY, 0x40000000, 0, $hWnd)
 GUISetState()
 Return $hGui
EndFunc   ;==>_OwnTab_Style2

Func _OwnTab_Style3($hWnd, $iX, $iY, $iWidth, $iHeight)
 Local $rgn, $rgn2, $diameter = $iWidth
 Local $hGui = GUICreate("OwnTab", $iWidth, $iHeight, $iX, $iY, 0x40000000, 0, $hWnd)
 $rgn = _WinAPI_CreateRectRgn(0, $iHeight/2, $iWidth, $iHeight)
 $rgn2 = _WinAPI_CreateRoundRectRgn(0, 0, $iWidth, $iHeight, $diameter, $diameter)
 _WinAPI_CombineRgn($rgn, $rgn, $rgn2, $RGN_OR)
 _WinAPI_DeleteObject($rgn2)
 _WinAPI_SetWindowRgn($hGui, $rgn)
 GUISetState()
 Return $hGui
EndFunc   ;==>_OwnTab_Style3

Func _OwnTab_Style4($hWnd, $iX, $iY, $iWidth, $iHeight)
 Local $rgn, $rgn2, $rel = $iHeight/5
 Local $hGui = GUICreate("OwnTab", $iWidth, $iHeight, $iX, $iY, 0x40000000, 0, $hWnd)
 $rgn = _WinAPI_CreateRectRgn($rel, 0, $iWidth - $rel, 1)
 For $i = 1 To $iHeight - 1
  $rgn2 = _WinAPI_CreateRectRgn($rel - ($rel / $iHeight * $i), $i, $iWidth - $rel + ($rel / $iHeight * $i) + 1, $i + 1)
  _WinAPI_CombineRgn($rgn, $rgn, $rgn2, $RGN_OR)
  _WinAPI_DeleteObject($rgn2)
 Next
 _WinAPI_SetWindowRgn($hGui, $rgn)
 GUISetState()
 Return $hGui
EndFunc   ;==>_OwnTab_Style4

Func _OwnTab_Style5($hWnd, $iX, $iY, $iWidth, $iHeight)
 Local $rgn, $rgn2, $diameter = $iHeight
 Local $hGui = GUICreate("OwnTab", $iWidth, $iHeight, $iX, $iY, 0x40000000, 0, $hWnd)
 $rgn = _WinAPI_CreateRoundRectRgn($iWidth+ 1, 0, 0, $iWidth, $diameter, $diameter)
 _WinAPI_SetWindowRgn($hGui, $rgn)
 GUISetState()
 Return $hGui
EndFunc   ;==>_OwnTab_Style5

Now you can make our own tabs. Just design them by yourself.


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites

#13 ·  Posted (edited)

Hi, this is getting to be very impressive. I added a border to the tab and rendered the gradient differently. I think it is an improvement, but then again I'm not much of an artist.

#include <WindowsConstants.au3>
#Include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
Global $hGui = GUICreate("Overview OwnTab-Styles", 840, 400)
GUISetBkColor(0xFF080)

_OwnTab_Style5($hGui, 620, 260, 200, 45)
    Global $bckpic= GUICtrlCreatePic("",0,0,0,0,$WS_CLIPSIBLINGS)
     GuiCtrlSetState(-1,$GUI_DISABLE)
    _GDIPlus_Startup()
    $guibitmap=startbmp($hGui,200, 45)
    $guibitmap= _drawborder($guibitmap,200, 45,"2","0x444444","0x999999","22") ;sets up the border on background
    finalizectrl($bckpic,$guibitmap)
    _GDIPlus_Shutdown()
_OwnTab_Label("Style 5", 200, 45)

GUISwitch($hGui)
GUISetState()

Local $msg
Do
 $msg = GUIGetMsg()
 If $msg > 0 Then MsgBox(0, "OwnTab", "You pressed tab with ID " & $msg & ".")
Until $msg = -3

Func _OwnTab_Label($sText, $iWidth, $iHeight, $iStyle = 0x201, $iExStyle = 0x0)
 Local $Label = GUICtrlCreateLabel($sText, 0, 0, $iWidth, $iHeight, $iStyle, $iExStyle)
 GUICtrlSetBkColor(-1, -2)
 Return $Label
EndFunc

Func _OwnTab_Pic($sFileName, $iWidth, $iHeight, $iStyle = 0x0, $iExStyle = 0x0)
 Local $Pic = GUICtrlCreatePic($sFileName, 0, 0, $iWidth, $iHeight, $iStyle, $iExStyle)
 GUICtrlSetState(-1, 128) ;$GUI_DISABLE
 Return $Pic
EndFunc   ;==>_OwnTab_Pic

Func _OwnTab_Gradient($nStartColor, $nEndColor, $iWidth, $iHeight)
    Local $colorR = Dec(StringLeft(Hex($nStartColor, 6), 2))
    Local $colorG = Dec(StringMid(Hex($nStartColor, 6), 3, 2))
    Local $colorB = Dec(StringMid(Hex($nStartColor, 6), 5, 2))
 
    Local $StepR = (Dec(StringLeft(Hex($nEndColor, 6), 2)) - $colorR) / ($iHeight - 1)
    Local $StepG = (Dec(StringMid(Hex($nEndColor, 6), 3, 2)) - $colorG) / ($iHeight - 1)
    Local $StepB = (Dec(StringMid(Hex($nEndColor, 6), 5, 2)) - $colorB) / ($iHeight - 1)
 
 Local $hGraph = GUICtrlCreateGraphic(0, 0, $iWidth, $iHeight)
 Local $sCol
    For $i = 0 To $iHeight - 1
  $sCol = StringFormat("0x%02X%02X%02X", $colorR + $StepR * $i, $colorG + $StepG * $i, $colorB + $StepB * $i)
  GUICtrlSetGraphic(-1, 8, $sCol) ;$GUI_GR_COLOR = 8
  GUICtrlSetGraphic(-1, 6, 0, $i) ;$GUI_GR_MOVE = 6
  GUICtrlSetGraphic(-1, 2, $iWidth, $i) ;$GUI_GR_LINE = 2
    Next
 Return $hGraph
EndFunc   ;==>_OwnTab_Gradient

Func _OwnTab_Style5($hWnd, $iX, $iY, $iWidth, $iHeight)
 Local $rgn, $rgn2, $diameter = $iHeight
 Local $hGui = GUICreate("OwnTab", $iWidth, $iHeight, $iX, $iY, 0x40000000, 0, $hWnd)
 $rgn = _WinAPI_CreateRoundRectRgn($iWidth+ 1, 0, 0, $iWidth, $diameter, $diameter)
 _WinAPI_SetWindowRgn($hGui, $rgn)
 GUISetState()
 Return $hGui
EndFunc   ;==>_OwnTab_Style5

Func startbmp($gui,$iWidth, $iHeight)
    ;Create a new bitmap, this way the original opened png is left unchanged
     $hBitmap = _GDIPlus_GraphicsCreateFromHWND(WinGetHandle($gui))
    $hImage =  _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hBitmap)
    _WinAPI_DeleteObject($hBitmap)
    Return $hImage
EndFunc
func _drawborder($hBitmap,$gwt,$ght,$depth,$colour1,$colour2,$corner)
    $iC1 = StringReplace($colour1, "0x", "0xFF")
    $iC2 = StringReplace($colour2, "0x", "0xFF")
    $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Global $hBrush = _GDIPlus_BrushCreateSolid($iC1)
    Global $hBrush2 = _GDIPlus_BrushCreateSolid(0xFF7E3517)

    Local $aFactors[4] = [0.0, 0.6, 0.8, 1.0], $aPositions[4] = [0.0, 0.6, 0.8, 1.0]
    Local $bGammaCorrection = False
    $hBrush1 = _GDIPlus_CreateLineBrushFromRect(0, 0, $gwt,$ght, $aFactors, $aPositions, "0xFFBBBBBB",$iC1, 1)
    GDIPlus_SetLineGammaCorrection($hBrush1, $bGammaCorrection)
    $hBrush3 = _GDIPlus_CreateLineBrushFromRect(0, 0, $gwt,$ght, $aFactors, $aPositions, $iC1,$iC2,  3)
    GDIPlus_SetLineGammaCorrection($hBrush3, $bGammaCorrection)
;    Global $hBrush1 = _GDIPlus_BrushCreateSolid($iC2)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 4)
        _GDIPlus_GraphicsDrawRoundRect($hGraphics, 0, 0, $gwt,$ght, $corner, $hBrush3)
        _GDIPlus_GraphicsDrawRoundRect($hGraphics, $depth, $depth, $gwt-($depth*2)-2, $ght-($depth*2)-2, $corner,$hBrush1)

        _GDIPlus_BrushDispose($hBrush)
        _GDIPlus_BrushDispose($hBrush1)
        _GDIPlus_BrushDispose($hBrush2)
         _GDIPlus_GraphicsDispose($hGraphics)
return $hBitmap
EndFunc

Func finalizectrl($controlID,$hImage)
    $hWnd = GUICtrlGetHandle($controlID)
            $hbmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
     $aBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", 0x0172, "int", 0, "int", $hbmp)
    If $aBmp[0] <> 0 Then _WinAPI_DeleteObject($aBmp[0])
    _WinAPI_DeleteObject($hbmp)
EndFunc

;==== GDIPlus_CreateLineBrushFromRect === Malkey's function
Func _GDIPlus_CreateLineBrushFromRect($iX, $iY, $iWidth, $iHeight, $aFactors, $aPositions, _
        $iArgb1 = 0xFF0000FF, $iArgb2 = 0xFFFF0000, $LinearGradientMode = 0x00000001, $WrapMode = 0)

    Local $tRect, $pRect, $aRet, $tFactors, $pFactors, $tPositions, $pPositions, $iCount

    If $iArgb1 = Default Then $iArgb1 = 0xFF0000FF
    If $iArgb2 = Default Then $iArgb2 = 0xFFFF0000
    If $LinearGradientMode = -1 Or $LinearGradientMode = Default Then $LinearGradientMode = 0x00000001
    If $WrapMode = -1 Or $LinearGradientMode = Default Then $WrapMode = 1

    $tRect = DllStructCreate("float X;float Y;float Width;float Height")
    $pRect = DllStructGetPtr($tRect)
    DllStructSetData($tRect, "X", $iX)
    DllStructSetData($tRect, "Y", $iY)
    DllStructSetData($tRect, "Width", $iWidth)
    DllStructSetData($tRect, "Height", $iHeight)
    $aRet = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushFromRect", "ptr", $pRect, "int", $iArgb1, _
            "int", $iArgb2, "int", $LinearGradientMode, "int", $WrapMode, "int*", 0)

    If IsArray($aFactors) = 0 Then Dim $aFactors[4] = [0.0, 0.4, 0.6, 1.0]
    If IsArray($aPositions) = 0 Then Dim $aPositions[4] = [0.0, 0.3, 0.7, 1.0]
    $iCount = UBound($aPositions)
    $tFactors = DllStructCreate("float[" & $iCount & "]")
    $pFactors = DllStructGetPtr($tFactors)
    For $iI = 0 To $iCount - 1
        DllStructSetData($tFactors, 1, $aFactors[$iI], $iI + 1)
    Next
    $tPositions = DllStructCreate("float[" & $iCount & "]")
    $pPositions = DllStructGetPtr($tPositions)
    For $iI = 0 To $iCount - 1
        DllStructSetData($tPositions, 1, $aPositions[$iI], $iI + 1)
    Next
    $hStatus = DllCall($ghGDIPDll, "int", "GdipSetLineBlend", "hwnd", $aRet[6], _
            "ptr", $pFactors, "ptr", $pPositions, "int", $iCount)
    Return $aRet[6] ; Handle of Line Brush
EndFunc   ;==>_GDIPlus_CreateLineBrushFromRect

Func GDIPlus_SetLineGammaCorrection($hBrush, $useGammaCorrection = True)
    Local $aResult
    $aResult = DllCall($ghGDIPDll, "int", "GdipSetLineGammaCorrection", "hwnd", $hBrush, "int", $useGammaCorrection)
    Return $aResult[0]
EndFunc   ;==>GDIPlus_SetLineGammaCorrection

Func _GDIPlus_GraphicsDrawRoundRect($hGraphics, $iX, $iY, $iWidth, $iHeight, $iRadius, $hBrush = 0, $hPen = 0)
    _GDIPlus_PenCreate($hPen)
    Local $hPath = _GDIPlus_GraphicsPathCreate()
    _GDIPlus_GraphicsPathAddLine($hPath, $iX + $iRadius, $iY, $iX + $iWidth - ($iRadius * 2), $iY)
     _GDIPlus_GraphicsPathAddArc($hPath, $iX + $iWidth - ($iRadius * 2), $iY, $iRadius * 2, $iRadius * 2, 270, 90)
    _GDIPlus_GraphicsPathAddLine($hPath, $iX + $iWidth, $iY + $iRadius, $iX + $iWidth, $iY + $iHeight )
  ;  _GDIPlus_GraphicsPathAddArc($hPath, $iX + $iWidth - ($iRadius * 2), $iY + $iHeight - ($iRadius * 2), $iRadius * 2, $iRadius * 2, 0, 90)
    _GDIPlus_GraphicsPathAddLine($hPath, $iX + $iWidth , $iY + $iHeight, $iX, $iY + $iHeight)
  ;  _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY + $iHeight - ($iRadius * 2), $iRadius * 2, $iRadius * 2, 90, 90)
        _GDIPlus_GraphicsPathAddLine($hPath, $iX, $iY + $iHeight - ($iRadius * 2), $iX, $iY + $iRadius)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY, $iRadius * 2, $iRadius * 2, 180, 90)

    ;Draw the font onto the new bitmap
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    If $hBrush <> 0 Then _GDIPlus_GraphicsFillPath($hGraphics, $hBrush, $hPath)
    _GDIPlus_GraphicsDrawPath($hGraphics, $hPen, $hPath)
    _GDIPlus_GraphicsPathDispose($hPath)
    _GDIPlus_PenDispose($hPen)
EndFunc

Func _GDIPlus_GraphicsPathCreate($iFillMode = 0)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipCreatePath", "int", $iFillMode, "int*", 0);
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[2])
EndFunc
Func _GDIPlus_GraphicsPathAddLine($hGraphicsPath, $iX1, $iY1, $iX2, $iY2)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathLine", "hwnd", $hGraphicsPath, "float", $iX1, "float", $iY1, _
                                "float", $iX2, "float", $iY2)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
EndFunc
Func _GDIPlus_GraphicsPathAddArc($hGraphicsPath, $iX, $iY, $iWidth, $iHeight, $iStartAngle, $iSweepAngle)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathArc", "hwnd", $hGraphicsPath, "float", $iX, "float", $iY, _
                                "float", $iWidth, "float", $iHeight, "float", $iStartAngle, "float", $iSweepAngle)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
EndFunc
Func _GDIPlus_GraphicsPathCloseFigure($hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipClosePathFigure", "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
EndFunc
Func _GDIPlus_GraphicsPathDispose($hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDeletePath", "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
EndFunc
Func _GDIPlus_GraphicsDrawPath($hGraphics, $hPen, $hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawPath", "hwnd", $hGraphics, "hwnd", $hPen, "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
EndFunc
Func _GDIPlus_GraphicsFillPath($hGraphics, $hBrush, $hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipFillPath", "hwnd", $hGraphics, "hwnd", $hBrush, "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
EndFunc
Edited by picea892

Share this post


Link to post
Share on other sites

Wow, fantastic stuff picea892!!! Now I have a lot of work to let it be easy to use. I'm not sure about the hover-funktion with this user-drawn picture, but I will solve this hopefully!


Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Share this post


Link to post
Share on other sites

Hi, this is getting to be very impressive. I added a border to the tab and rendered the gradient differently. I think it is an improvement, but then again I'm not much of an artist.

Very nice, picea! That's looking really good. I thought I'd attempt one myself but that plan fizzled when I saw your code. Man, that GDIPlus stuff is intimidating at first. Up until now I've done a fine job of avoiding it but after seeing your tab I guess its time for me to go lock horns with:

GDIPlus_GraphicsCreateFigureArcFillBrushLinePathSetGabbaGabba($tab)

Cover me, I'm going in!

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

@Funkey,

Thanks for this great udf.

I tried to hide the second and third tab, but it leave's an empty space..

Do you think this can be fixed ?!

Futher the behavior of a label over an image which is disabled erases parts of the background image.

The background image is a transparant gif

Best regards,

Emiel

Edited by Emiel Wieldraaijer

Best regards,Emiel Wieldraaijer

Share this post


Link to post
Share on other sites

I have got crash in _HoverCheck() function.

The error is:

C:\All\B_QA\QA\MyTools\Astetaine\examples\OwnTab\OwnTab.au3 (443) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

$szTemp_Array[1] = $HoverArray[$Global_I]

$szTemp_Array[1] = ^ ERROR

BTW: I like the idea

Func _HoverCheck()
    $HoverData = GUIGetCursorInfo()
    If Not IsArray($HoverData) Then Return
    $Temp_Found = 0
    For $i = 1 To UBound($HoverArray) - 1
        If $HoverData[4] = $HoverArray[$i] Or $HoverData[4] = $HoverArray[$i] + 1 Then
            $Temp_Found = $i
        EndIf
    Next
    Select
        Case $Temp_Found = 0 And $HoverActive = 1 Or $Temp_Found <> 0 And $Temp_Found <> $Global_I And $HoverActive = 1
            $HoverActive = 0
            $Temp_Found = 0
            $szTemp_Array[0] = "LostHover"
            $szTemp_Array[1] = $HoverArray[$Global_I]
            Return $szTemp_Array
        Case $Temp_Found > 0 And $HoverActive = 0
            $Global_I = $Temp_Found
            $HoverActive = 1
            $Temp_Found = 0
            $szTemp_Array[0] = "AcquiredHover"
            $szTemp_Array[1] = $HoverArray[$Global_I]
            Return $szTemp_Array
    EndSelect
EndFunc   ;==>_HoverCheck

Be Green Now or Never (BGNN)!

Share this post


Link to post
Share on other sites

Hi,

after updating to the latest stabil and beta I tested coincidentally OwnTab_example.

After replacing AdlibEnable with AdlibRegister (see help) it works fine.

If you have problems it may help if you state your version.

best regards, Reinhard

Share this post


Link to post
Share on other sites

#19 ·  Posted (edited)

Hi,

after updating to the latest stabil and beta I tested coincidentally OwnTab_example.

After replacing AdlibEnable with AdlibRegister (see help) it works fine.

If you have problems it may help if you state your version.

best regards, Reinhard

I am not sure. There are still problems with the latest UDF as for today.

1. The icons disapears at some point when clicking many times on the tabs. i do not have the use case..

2. A memory problems occurs after many clicks. Sometimes getting crash or the client is not responding.

I suspects the problem related to the icons.I removed all icons and no problem occurs.! :D

I like it and want to use it in my project. hope I will get help and the UDF will be fixed.

Thanks for sharing it.

Edited by lsakizada

Be Green Now or Never (BGNN)!

Share this post


Link to post
Share on other sites

Tank you very much for your UDF! I search half an hour for setting the bgColor of a tab.....than I found your UDF, and this saved a lot of time.

Currently I face a small problem with the hover in my app, but in the example its working. It is highlighting but not changing (in my app).

Thank you very much !

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0