Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Какс делать "красивые вкладки", аналог GUICtrlCreateTab (http://forum.oszone.net/showthread.php?t=180518)

Centrinar 13-07-2010 22:17 1452811

Какс делать "красивые вкладки", аналог GUICtrlCreateTab
 
Есть GUICtrlCreateTab, все замечательно, НО там не льзя "НОРМАЛЬНО" поменять цвет самой вклаки или сделать ее более оптикаемой. Есть ли другие варианты создания вкладок?

Creat0R 13-07-2010 22:30 1452822

Нужно ручками рисовать табы, задача не из простых...

Creat0R 14-07-2010 19:59 1453373

Вложений: 1
Цитата:

Цитата Creat0R
Нужно ручками рисовать табы »

Вот пример как это делается:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITab.au3>

Global Const $ODT_TAB = 101
Global Const $ODS_SELECTED = 0x0001
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODS_FOCUS = 0x0010

$hGUI = GUICreate("Draw Tab", 300, 200)

$hTab = GUICtrlCreateTab(10, 10, 280, 180, $TCS_OWNERDRAWFIXED)

$TabItem_1 = GUICtrlCreateTabItem("TabItem 1")
GUICtrlCreateLabel("", 10, 33, 277, 155)
GUICtrlSetBkColor(-1, 0xDDAA11)
GUICtrlSetState(-1, $GUI_DISABLE)

$TabItem_2 = GUICtrlCreateTabItem("TabItem 2")
GUICtrlCreateLabel("", 10, 33, 277, 155)
GUICtrlSetBkColor(-1, 0x99BBEE)
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlCreateTabItem("")

GUISetState()

GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")

_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 0)

Do
Until GUIGetMsg() = -3

Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
    Local $DRAWITEMSTRUCT

    $DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)
    If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_TAB Then Return $GUI_RUNDEFMSG

    Local $cID = DllStructGetData($DRAWITEMSTRUCT, "cID")
    Local $itmID = DllStructGetData($DRAWITEMSTRUCT, "itmID")
    Local $itmAction = DllStructGetData($DRAWITEMSTRUCT, "itmAction")
    Local $itmState = DllStructGetData($DRAWITEMSTRUCT, "itmState")
    Local $hItm = DllStructGetData($DRAWITEMSTRUCT, "hItm")
    Local $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC")

    If $itmAction <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG

    Local $iTextColor, $itmText

    Switch $itmID
        Case 0
            $iBrushColor = 0x11AADD
        Case 1
            $iBrushColor = 0xEEBB99
    EndSwitch

    DLLCall("gdi32.dll","int","SetBkMode", "hwnd", $hDC, "int", 1)

    Local $iBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
    $iBrush = $iBrush[0]

    Local $iBrushOld = _WinAPI_SelectObject($hDC, $iBrush)

    DLLCall("user32.dll","int","FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "hwnd", $iBrush)

    Local $tBuffer = DllStructCreate("char[256]")
    DllStructSetData($tBuffer, 1, "Item" & $itmID)
    $itmText = DllStructGetData($tBuffer, 1)

    DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 1) + 10, 1)
    DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 2) + 5, 2)

    DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _
        "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT)

    _WinAPI_SelectObject($hDC, $iBrushOld)
    _WinAPI_DeleteObject($iBrush)

    Return $GUI_RUNDEFMSG
EndFunc

в аттаче более сложный пример (с использованием UDF OwnTab.au3).

Anarasius 31-07-2010 23:21 1464301

а через Button это возможно воплатить?

Creat0R 31-07-2010 23:45 1464311

Цитата:

Цитата Anarasius
через Button это возможно воплатить? »

Что именно?

Anarasius 31-07-2010 23:52 1464317

Создание табов через Button. Вот тут мы делали табы: http://forum.oszone.net/thread-175101-2.html а можноли вместо них просто создать Buttons и стиль будет легче менять

Creat0R 01-08-2010 00:37 1464338

Цитата:

Цитата Anarasius
Создание табов через Button »

А в чём проблема?

Creat0R 01-08-2010 01:00 1464342

Вот так можно:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITab.au3>

Global Const $ODT_TAB = 101
Global Const $ODS_SELECTED = 0x0001
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODS_FOCUS = 0x0010

Global $aBrushColor[3] = [2, 0xDDAA11, 0x99BBEE]
Global $aTabItem[3] = [2]

$hGUI = GUICreate("Draw Tab", 300, 200)

$hTab = GUICtrlCreateTab(10, 10, 280, 160, $TCS_OWNERDRAWFIXED)

$aTabItem[1] = GUICtrlCreateTabItem("  Item 1")
GUICtrlCreateLabel("", 10, 33, 277, 135)
GUICtrlSetBkColor(-1, $aBrushColor[1])
GUICtrlSetState(-1, $GUI_DISABLE)

$aTabItem[2] = GUICtrlCreateTabItem("  Item 2")
GUICtrlCreateLabel("", 10, 33, 277, 135)
GUICtrlSetBkColor(-1, $aBrushColor[2])
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlCreateTabItem("")

$nButton = GUICtrlCreateButton("Create Tab", 10, 175, 60, 20)

GUISetState()

GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")

_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 0)

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $nButton
                        $aBrushColor[0] += 1
                        ReDim $aBrushColor[$aBrushColor[0]+1]
                       
                        While _ColorIsDarkShade($aBrushColor[$aBrushColor[0]])
                                $aBrushColor[$aBrushColor[0]] = _ColorGetRandomColor()
                        WEnd
                       
                        $aTabItem[0] += 1
                        ReDim $aTabItem[$aTabItem[0]+1]
                        $aTabItem[$aTabItem[0]] = GUICtrlCreateTabItem("  Item " & $aTabItem[0])
                        GUICtrlCreateLabel("", 10, 33, 277, 135)
                        GUICtrlSetBkColor(-1, $aBrushColor[$aBrushColor[0]])
                        GUICtrlSetState(-1, $GUI_DISABLE)
                       
                        GUICtrlSetState($aTabItem[$aTabItem[0]], $GUI_SHOW)
        EndSwitch
WEnd

Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
    Local $DRAWITEMSTRUCT

    $DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)
    If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_TAB Then Return $GUI_RUNDEFMSG

    Local $cID = DllStructGetData($DRAWITEMSTRUCT, "cID")
    Local $itmID = DllStructGetData($DRAWITEMSTRUCT, "itmID")
    Local $itmAction = DllStructGetData($DRAWITEMSTRUCT, "itmAction")
    Local $itmState = DllStructGetData($DRAWITEMSTRUCT, "itmState")
    Local $hItm = DllStructGetData($DRAWITEMSTRUCT, "hItm")
    Local $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC")

    If $itmAction <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG

    Local $iTextColor, $itmText, $iBrushColor = _ColorSwitchRGBBGR($aBrushColor[$itmID+1])
       
    DLLCall("gdi32.dll","int","SetBkMode", "hwnd", $hDC, "int", 1)

    Local $iBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
    $iBrush = $iBrush[0]

    Local $iBrushOld = _WinAPI_SelectObject($hDC, $iBrush)

    DLLCall("user32.dll","int","FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "hwnd", $iBrush)

    Local $tBuffer = DllStructCreate("char[256]")
    DllStructSetData($tBuffer, 1, "Item " & $itmID)
    $itmText = DllStructGetData($tBuffer, 1)

    DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 1) + 10, 1)
    DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 2) + 5, 2)

    DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _
        "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT)

    _WinAPI_SelectObject($hDC, $iBrushOld)
    _WinAPI_DeleteObject($iBrush)

    Return $GUI_RUNDEFMSG
EndFunc

Func _ColorGetRandomColor()
        Return "0x" & Hex(Random(1, 255, 1) & Random(1, 255, 1) & Random(1, 255, 1), 6)
EndFunc

Func _ColorIsDarkShade($nColor)
        Local $i_Red = BitAND(BitShift($nColor, 16), 0xFF)
        Local $i_Green = BitAND(BitShift($nColor, 8), 0xFF)
        Local $i_Blue = BitAND($nColor, 0xFF)
       
        Local $iMidle_Color_Val = Int(765 / 2) ;765 is the total of 255 + 255 + 255
       
        Return (($i_Red + $i_Green + $i_Blue) < $iMidle_Color_Val)
EndFunc

Func _ColorSwitchRGBBGR($iColor)
        Local $iMask = BitXOR(BitAND($iColor, 0xFF), ($iColor / 0x10000))
        Return "0x" & Hex(BitXOR($iColor, ($iMask * 0x10001)), 6)
EndFunc


Centrinar 08-08-2010 01:16 1469116

А как поменять цвет заголовков Табов?

Creat0R 08-08-2010 01:49 1469129

Цитата:

Цитата Centrinar
как поменять цвет заголовков Табов? »

Это показано в примере выше.

Centrinar 09-08-2010 00:24 1469662

не цвет фона а цвет текста-названия таба


Время: 16:52.

Время: 16:52.
© OSzone.net 2001-