Форум » GUI » Элемент TAB (группа вкладок) » Ответить

Элемент TAB (группа вкладок)

Новичок: Использую элемент вкладок TAB с кучей вкладок, в каждой вкладке куча прочих элементов При переключении по вкладкам происходит мелькание фона, элементов, прорисовки и прочей всякого... Кто как избавляется ?

Ответов - 16

Новичок: *(Разрабу) Может в исходниках, сперва формировать образы вкладок, и при переходе по вкладкам отображать образы, и потом только прорисовка элементов... (мысли вслух)

Andrey: Новичок пишет: При переключении по вкладкам происходит мелькание фона, элементов, прорисовки и прочей всякого... Смотря как делаешь создание Tab Пиши код своего примера.

SergKis: Новичок пишет Кто как избавляется ? Практически не использую, т.к. Mdi позволяет делать аналог на Mdi Child окнах. Пару примеров от инициатора Andrey (в примере _Tab_1c вложенный TAB реализован на ButtonEx) Тут https://TransFiles.ru/p0yhr


Haz: SergKis пишет: TAB реализован на ButtonEx) Проще вместо кнопок использовать tsb по массиву ( без хедеров и футеров). В разы более гибкий элемент Давно так делаю

SergKis: Haz пишет Проще вместо кнопок использовать tsb по массиву Для встроенного TAB в ТАБ (как в примере, понадобилось Андрею, не знаю, применил или нет в реале) ButtonEx проще и лучше в дизайне, можно раздвинуть на 2 pixel и обвести DrawRect(...), сложность упр. контролами на этих вкладках, если их много и не важно какой элемент исп. тсб или кнопки. На кнопках, по мне проще организовать имитацию TAB, где вместо FRAME использовать модал окна без заголовков. Практически единственные варианты, где я исп. ТАБ, это с использованием тсб по массиву (с header, footer), где на каждой ТАБ page заполняю тсб своими данными. Например работа с секциями ini файла или тек. запись dbf разбивается на части по полям и на ТАБ тсб заполняется разным списком полей. ( без хедеров и футеров) Строки тсб не обладают возможностью имитации нажатия кнопки, а Header имеет такую возможность. Я пробовал делать ряд кнопок из Header тсб, добавляя сверху SuperHeader, а снизу одну строку ячеек, их делал высотой 2-4 pixel и красил в один цвет. В таком виде тсб вместо кнопок нормально работает, надо только кликнутую колонку Header красить в какой то цвет выделения, типа "в фокусе". Др варианты дают "плоский" вид кнопок. В целом такой вариант не прижился, ToolBar+MdiChild окно дает тот же результат, но проще

Haz: SergKis пишет: В целом такой вариант не прижился, ToolBar+MdiChild окно дает тоже, но проще На вкус все фломастеры ... Объемный вид легко делается градиентом ( также любую морду можно в виде картинки натянуть ), а вот когда табуляторов много и не влезают все в окно , то встроенный механизм скролла у tsb очень в тему.

SergKis: Haz пишет На вкус все фломастеры ... Это да ..., но ТАБ подразумевает под каждой кнопкой наличие page ... какую то реализацию окна или frame со всеми вытекающими обработками и контролами на них. Т.е. при скролле что делать ? Менять frame\окно с контролами или нет ? Если не менять, то расплываемся на не понятку, на кнопках одно, по содержимому другое. Опять возникают "лишние" алгоритмы Объемный вид легко делается градиентом ( также любую морду можно в виде картинки натянуть ) Этого мало, надо дополнять обработчики на нажатие Click, DblClick и отпускание для смены градиентов или картинок. С картинками целая коллекция будет для вариантов "нормального" состояния и "нажатого" (возможно, картинка на disable так же нужна). Не говорю, что это не возможно сделать, но это трудозатраты, причем во времени, требуют сопровождения. Если есть, кто платит за "банкет", то ...

Haz: SergKis пишет: Этого мало, надо дополнять обработчики на нажатие Click, DblClick мы же про замену TAB говорим ... TAB этого всего не умеет

Haz: примерчик на скорую руку, без наведения эстетики [pre2] #include "minigui.ch" #include "common.ch" #include "i_winuser.ch" #include "hbthread.ch" #include "tsbrowse.ch" #include "hmg.ch" *--------------------------------------------------------* Procedure Main() *--------------------------------------------------------* LOCAL oWnd LOCAL aArray := {} LOCAL aFont := {} LOCAL i := 0 set oop on aArray := {{"Sheet 1", "Sheet 2", "Sheet 3", "Sheet 4" }} cTitle := "" DEFINE WINDOW Form_0 ; AT 0,0 ; WIDTH 400 HEIGHT 300 ; TITLE cTitle ; MAIN ; oWnd := ThisWindow.Object END WINDOW DEFINE FONT Font_1 FONTNAME "Times New Roman" SIZE 11 DEFINE FONT Font_2 FONTNAME "Times New Roman" SIZE 13 BOLD AAdd( aFont, GetFontHandle( "Font_1" ) ) AAdd( aFont, GetFontHandle( "Font_2" ) ) DEFINE TBROWSE oBrw AT 5, 2 OF Form_0 ; WIDTH oWnd:ClientWidth() - 4; HEIGHT 25; GRID END TSBROWSE with object oBrw :SetArray( aArray , .T. ) :nWheelLines := 0.1 :nClrLine := COLOR_GRID :lNoChangeOrd := TRUE :lCellBrw := TRUE :lNoKeyChar := TRUE :lNoVScroll := TRUE :lNoHScroll := TRUE :nClrLine := COLOR_GRID :nHeightCell := 25 :nHeightHead := 0 :bChange := {|| nil } :bLDblClick := {|| nil } :SetColor( { 1 }, { { || RGB(0,0,0) } }, ) :SetColor( { 5 }, { { || RGB(0,0,0) } }, ) :SetColor( { 11 }, { { || RGB(0,0,0) } }, ) :SetColor( { 6 }, { {|a, b, c| IF( c:nCell == b, { RGB( 255, 255, 255 ), RGB( 220, 220, 220 ) }, ; { RGB( 255, 255, 255 ), RGB( 220, 220, 220 ) } ) } } ) :SetColor( { 12 }, { {|a, b, c| IF( c:nCell == b, { RGB( 255, 255, 255 ), RGB( 220, 220, 220 ) }, ; { RGB( 255, 255, 255 ), RGB( 220, 220, 220 ) } ) } } ) :ChangeFont( {|| IF( oBrw:nCell == 1, aFont[ 2 ], aFont[ 1 ] ) }, 1, 1 ) :ChangeFont( {|| IF( oBrw:nCell == 2, aFont[ 2 ], aFont[ 1 ] ) }, 2, 1 ) :ChangeFont( {|| IF( oBrw:nCell == 3, aFont[ 2 ], aFont[ 1 ] ) }, 3, 1 ) :ChangeFont( {|| IF( oBrw:nCell == 4, aFont[ 2 ], aFont[ 1 ] ) }, 4, 1 ) :bTSDrawCell := { |a,b,c| if( b:nCell == oBrw:nCell, b:nClrLine := CLR_GRAY , b:nClrLine := COLOR_GRID )} :bOnDraw := {|| DrawPage(oBrw, oBrw:nCell) } end SetWindowLong(oBrw:hWnd, GWL_EXSTYLE, WS_EX_STATICEDGE ) //define pages for i := 1 To oBrw:nColCount() DEFINE WINDOW &("P" + hb_ntoc(i)) AT 30 , 2 ; PARENT Form_0 ; WIDTH oWnd:ClientWidth() - 4; HEIGHT oWnd:ClientHeight() - 30; PANEL; BACKCOLOR {220,220,220}; NOSHOW DEFINE LABEL &("L" + hb_ntoc(i)) ROW 100 COL 10 WIDTH oWnd:ClientWidth() - 4 - 20 HEIGHT 30 FONTNAME 'Arial' FONTSIZE 18 FONTBOLD .T. VALUE "Page " + hb_ntoc(i) BACKCOLOR {220,220,220} CENTERALIGN .T. END LABEL END WINDOW end //DoMethod( "p1", "show") drawPage(oBrw, 1) Form_0.Center Form_0.Activate Return func drawPage(oBrw, i) static nPage := 0 if nPage <> 0 doMethod( "P" + hb_ntoc(nPage), "hide" ) end nPage := i doMethod( "P" + hb_ntoc(nPage), "show" ) return nil [/pre2]

SergKis: Haz пишет примерчик на скорую руку, без наведения эстетики На тек. версии hmg все отлично Но на моей версии hmg 2.07 (тсб 7.0 мах совмещен, в рамках разумного с тсб 9.0) не работает такой вариант. Тсб не отрисовывается, при пробных кликах на том месте, где строка с тсб он появляется, но Page не соответствует позиции в тсб (фонт фокуса). Только после следующего клика все приходит в норму.

Haz: SergKis пишет: Только после следующего клика все приходит в норму Сергей, так это больше демка самой возможности. Просто по-быстрому набросал как пример. Кому нужно допилит и красоту наведет.

Dima: Haz пишет: Кому нужно допилит и красоту наведет. +1

Andrey: Классный пример !

Новичок: Конечно, спс... Сперва написал свое мнение... получилось статья про ООП, психологию, философию, логистику и ... Потом стер, и пишу переформулировав вопрос: " Есть прога, используемый фон к примеру - синий, есть элемент TAB - используемый фон - белый, При перемещении по вкладкам элемента TAB происходит мерцание фонов (белый-синий-белый) с явной прорисовкой элементов (FRAME, TEXTBOX и т.д.) *хотя очень быстро Вопрос - как избавиться от мерцания ? Какие есть идеи ?" Заранее спасибо за идеи...

Новичок: Пока сделал костыль - вытащил на отдельное окно и сделал фон окна и TAB одним и тем же, мерцание исчезло... Прорисовка элементов уже не наблюдается(но заметно что моргает), но допускаю что на слабых компах появится прорисовка...

Andrey: Новичок пишет: Вопрос - как избавиться от мерцания ? Какие есть идеи ?" Никак. Просто использовать то что есть.



полная версия страницы