Что нового

Зафиксировать ленту Rebar'а сверху

musicstashall

Знающий
Сообщения
322
Репутация
7
Как запретить перетаскивать ленту на новый уровень, с возможностью изменения при этом ее ширины? Стиль $RBBS_TOPALIGN в данном случае не решает проблему. Реализовал следующим образом, но криво, мне не нравится. Я бы хотел, чтобы ширина ленты изменялась, но сама лента оставалась всегда сверху, не перемещалась на нижний уровень.

Код:
#include <GUIConstantsEx.au3>
#include <GuiReBar.au3>
#include <GuiToolbar.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

$Debug_RB = False

Global $iMemo, $hgui, $g_hReBar

_Main()

Func _Main()
    $hgui = GUICreate(StringTrimRight(@ScriptName, 4), 600, 250, -1, -1, BitOR($WS_BORDER, $WS_CAPTION, $WS_GROUP, $WS_CLIPCHILDREN, $WS_SIZEBOX))

    $g_hReBar = _GUICtrlRebar_Create($hgui, BitOR($CCS_TOP, $RBS_FIXEDORDER, $RBS_DBLCLKTOGGLE))
    ;WinSetTrans($g_hReBar, '', 5)
    _GUICtrlRebar_AddBand($g_hReBar, GUICtrlGetHandle(GUICtrlCreateInput('', 0, 0, 300, 22)), 230, 300, "AddressBand", 0, BitOR($RBBS_CHILDEDGE, $RBBS_HIDETITLE, $RBBS_NOGRIPPER))
    GUICtrlSetState(-1, $GUI_DISABLE)
    _GUICtrlRebar_AddBand($g_hReBar, GUICtrlGetHandle(GUICtrlCreateInput('', 0, 0, 0, 22)), 90, 100, "SearchBox", 1, BitOR($RBBS_CHILDEDGE, $RBBS_HIDETITLE))
    GUICtrlSetState(-1, $GUI_DISABLE)

    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_SIZE, "WM_SIZE")

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
EndFunc   ;==>_Main

Func WM_SIZE($hWnd, $iMsg, $iwParam, $ilParam)
    If Not ($hWnd = $hgui) Then Return
    Local $wPos = WinGetPos($hgui)
    ControlMove($hgui, "", $g_hReBar, 0, 0, $wPos[2])
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
    Local $tAUTOBREAK, $tAUTOSIZE, $tNMREBAR, $tCHEVRON, $tCHILDSIZE, $tOBJECTNOTIFY

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $g_hReBar
            Switch $iCode
                Case $RBN_AUTOBREAK
                    ; Уведомляет родителя ReBar, что перенос на новую линию будет появляться в ReBar. Родитель определяет, делать ли перенос
                    $tAUTOBREAK = DllStructCreate($tagNMREBARAUTOBREAK, $lParam)
                    ; Возвращаемое значение не используется
                Case $RBN_AUTOSIZE
                    ; Высылается ReBar'ом, созданным со стилем $RBS_AUTOSIZE, когда ReBar автоматически изменяет свои размеры
                    ; Возвращаемое значение не используется
                Case $RBN_BEGINDRAG
                    ; Высылается ReBar'ом, когда пользователь начал перетаскивание ленты
                    Return 0 ; Позволяет ReBar'у продолжить операцию перетаскивания
                    ;Return 1 ; иное, кроме ноль, чтобы прервать операцию перетаскивания
                Case $RBN_CHEVRONPUSHED
                    ; Высылается ReBar'ом, при нажатии шеврона (двойная угловая скобка)
                    ; Когда приложение получает это уведомление, оно отвечает за отображение всплывающего меню с пунктами для каждой скрытой панели инструментов.
                    ; Используйте поле rc структуры $tagNMREBARCHEVRON, чтобы найти правильную позицию для всплывающего меню
                    ; Возвращаемое значение не используется
                Case $RBN_CHILDSIZE
                    ; Высылается ReBar'ом, когда дочернее окно ленты было изменено в размерах
                     If _GUICtrlRebar_GetBandStyleBreak($g_hReBar, 1) Then _GUICtrlRebar_SetBandStyleBreak($g_hReBar, 1, False)
                    ; Возвращаемое значение не используется
                Case $RBN_DELETEDBAND
                    ; Высылается ReBar'ом после удаления ленты
                    ; Возвращаемое значение не используется
                Case $RBN_DELETINGBAND
                    ; Высылается ReBar'ом при удалении ленты
                    ; Возвращаемое значение не используется
                Case $RBN_ENDDRAG
                    ; Высылается ReBar'ом при завершении перетаскивания ленты пользователем
                    If _GUICtrlRebar_GetBandStyleBreak($g_hReBar, 1) Then _GUICtrlRebar_SetBandStyleBreak($g_hReBar, 1, False)
                    ; Возвращаемое значение не используется
                Case $RBN_GETOBJECT
                    ; Высылается ReBar'ом, созданным со стилем $RBS_REGISTERDROP, когда объект перетаскивается над лентами ReBar
                    ; Возвращаемое значение не используется
                Case $RBN_HEIGHTCHANGE
                    ; Высылается ReBar'ом, при изменении высоты
                    ; Rebar с использованием стиля $CCS_VERT высылает это уведомление, когда его ширина изменилась
                    ; Возвращаемое значение не используется
                Case $RBN_LAYOUTCHANGED
                    ; Высылается ReBar'ом, когда пользователь изменяет расположение лент
                    If _GUICtrlRebar_GetBandStyleBreak($g_hReBar, 1) Then _GUICtrlRebar_SetBandStyleBreak($g_hReBar, 1, False)
                    ; Возвращаемое значение не используется
                Case $RBN_MINMAX
                    ; Высылается ReBar'ом, перед достижением максимального или минимального размера ленты
                    ; Return 1 ; ненулевое значение, чтобы предотвратить операцию
                    Return 0 ; 0 позволяет продолжить
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Так же не получается после создания Rebar'а установить для ленты ширину — минимальную, максимальную и текущую, фиксация ширины работает, но при отключении фиксации, ширина откатывается на первоначальную, с которой была создана. Что-то здесь накуралесили разрабы.. Хочу, чтобы при изменении размеров окна, правая лента оставалась в фиксированных размерах, а левая поджималась, но руками лента должна изменяться в размерах.
 
Последнее редактирование:
Верх