Форум » Документация » Документация по HwGUI » Ответить

Документация по HwGUI

alkresin: Наконец-то созрел для того, чтобы обновить документацию по HwGUI и решил начать с русской версии, которой до сих пор не было. Вот первая часть: http://www.kresin.ru/hwgdoc.html. Обращаю ваше внимание, что там, как и на многих других страницах сайта есть message board - можно писать комментарии, ругать за недостатки, сообщать о том, чего недостает, и т.п.

Ответов - 94, стр: 1 2 3 4 5 All

SergKis: alkresin пишет: нужна обработка WM_KILLFOCUS. Нужна также и обработка WM_SETFOCUS Я Имел ввиду в том виде, как было. Как сбросил текст метода, увидел, что пропустил [pre2] добавляем в класс DATA tColorinFocus DATA bColorinFocus DATA lFocused INIT .F. METHOD SetColorReal( lFocus ) CLASS HEdit LOCAL tC := ::tColor LOCAL bC := ::bColor LOCAL xC ::lFocused := ! empty(lFocus) If ::lFocused If lColorinFocus tC := tColorinFocus bC := bColorinFocus Else If ::tColorinFocus != NIL tC := ::tColorinFocus EndIf If ::bColorinFocus != NIL bC := ::bColorinFocus EndIf EndIf EndIf If hb_IsBlock(tC) xC := Eval(tC, Self) If hb_IsNumeric(xC) tC := xC EndIf EndIf If hb_IsBlock(bC) xC := Eval(bC, Self) If hb_IsNumeric(xC) bC := xC EndIf EndIf ::Setcolor( tC, bC, .T. ) RETURN и IF msg == WM_SETFOCUS ::SetColorReal(.T.) ::Refresh() ELSEIF msg == WM_KILLFOCUS ::SetColorReal(.F.) ::Refresh() тогда все что работало по старой схеме (STATIC переменные), должно работать и без них можно работать со свойствами объекта, согласен, в Refresh() вставлять не надо. [/pre2] alkresin пишет: Увы, надо Возможно. Я только вчера бегло глянул на содержимое HEdit (дома ремонт, к компу набегаю с зачумленной головой)

SergKis: alkresin пишет: Странно. Всматривался во все глаза несколько раз, но светлозеленых клеточек не увидел. Повторю др. карточку - аналог (в той задаче есть рус. яз., хотел чтоб понятней было). В текстовом файле кусок кода реализации http://my-files.ru/xtcnl1

alkresin: SergKis пишет: тогда все что работало по старой схеме (STATIC переменные), должно работать и без них можно работать со свойствами объекта, согласен, в Refresh() вставлять не надо. Надо еще :aColorOld задействовать - словом, получается примерно то, что я и сделал, только с двумя отдельными кодоблоками для текста и фона вместо одного, на котором я по-прежнему настаиваю. А вот в Refresh(), наверное, надо все-таки вставить что-то вроде: [pre2]IF !Empty(::bColorBlock) .AND. hwg_isPtrEq(::handle,hwg_getFocus) Eval( ::bColorBlock, Self ) ENDIF[/pre2] Раз есть такой кодоблок для смены цвета по условию, надо его использовать при смене содержимого GET, имеющего фокус.


alkresin: SergKis пишет: Нашел свои опыты с hbrowse, где видно, как мерцает переотображение selected строки при горизонтальном перемещении Убрал мерцание.

SergKis: alkresin пишет: Надо еще :aColorOld задействовать Не очень понимаю, для чего. В фокусе идет со static переменных, если назначено (или новых свойств), не в фокусе из ::tColor, ::bColor и источники не меняются. Но вам виднее, я что то пропускаю, наверно (башка забита ремонтом). на котором я по-прежнему настаиваю это ваше право, я только предложил.

alkresin: SergKis пишет: Не очень понимаю, для чего. В фокусе идет со static переменных, если назначено (или новых свойств), не в фокусе из ::tColor, ::bColor и источники не меняются. В том-то и дело, что меняются. Метод :SetColor() устанавливает новые значения ::tColor, ::bColor.

SergKis: alkresin пишет: Метод :SetColor() устанавливает новые значения ::tColor, ::bColor. Тогда не надо исп. SetColor(...) из CLASS HCustomWindow, надо SetColorReal, сделать SetColor(...) и произвести все действия от пполученных переменных tC, bC - добавиться несколько строк.

alkresin: SergKis пишет: Тогда не надо исп. SetColor(...) из CLASS HCustomWindow, надо SetColorReal, сделать SetColor(...) и произвести все действия от пполученных переменных tC, bC - добавиться несколько строк. Увы, это невозможно. :SetColor() не раскрашивает control самостоятельно, он устанавливает новые значения :tColor, :bColor, которые используются уже в другое время и в другом месте: методом :onCtlColor() при обработке сообщения WM_CTLCOLOREDIT, это особенности WinAPI, уж так он сделан.

SergKis: alkresin пишет: при обработке сообщения WM_CTLCOLOREDIT Увидел обработчик, да без :aColorOld не обойтись. Немного понятней стала организация, спасибо за разъяснения.

alkresin: SergKis пишет: 4. Super header отсутствует и сделать, что то похожее (на картинке нижнее окно) не получится Посмотрел это дело внимательнее, и выяснилось, что возможность сделать этот Super header все же есть. Еще в 2003 году ( полезная вещь Changelog) ) Павел Царенко прислал код для расчерчивания ячеек заголовка. В принципе, все достаточно просто. Для каждой колонки указывается :cGrid, там информация по каждой строке заголовка отделяется точкой с запятой ( так же делятся строки и в тексте заголовка. Так вот, в этом :cGrid указывается, с какой стороны рисовать разделительную линию с помощью букв N(North), S(South), W(West), E(East). Т.е., если мы хотим в Super header объединить 2 и 3-ью колонки, то можем написать: [pre]oBrw:aColumns[2]:cGrid := "W;WN" oBrw:aColumns[2]:heading := "Super header;col1" oBrw:aColumns[3]:cGrid := "E;EN" oBrw:aColumns[3]:heading := ";col2"[/pre] Единственно, что надо сделать - чтобы в этом случае текст "Super header" автоматически размещался по центру двух колонок.

SergKis: alkresin пишет: Т.е., если мы хотим в Super header объединить 2 и 3-ью колонки, то можем написать: Такая штука, вроде, и реализована в HBrowseEx. Точно не скажу, уже отключился от hwg

SergKis: alkresin пишет: Единственно, что надо сделать - чтобы в этом случае текст "Super header" автоматически размещался по центру двух колонок Как быть с image в таком Super header (слева\справа от текста) и image в колонке col1 и col2 (для индикации уст. ордера, например) ?

alkresin: SergKis пишет: Как быть с image в таком Super header (слева\справа от текста) и image в колонке col1 и col2 Думал недавно на эту тему. Хочу сделать для колонки (oColumn) пользовательский кодоблок, который рисует все, что надо и будет вызываться при прорисовывании заголовка. При необходимости ( смене ордера, например ) его надо будет просто переставить из одного oColumn в другой. А можно сделать массив таких кодоблоков - как сделал недавно в HPanel - разные фрагменты программы могут добавлять туда свои рисующие кодоблоки.

SergKis: alkresin пишет: Хочу сделать для колонки (oColumn) пользовательский кодоблок, который рисует все, что надо Если на нем, делать строки, header, footer и т.д., то это замечательно, а если заложить в HBrowse двойную буферизацию ("раз пошла такая пъянка") - это вооооооооще SUPER !

alkresin: По идее, нужны отдельные кодоблоки для строк, header, footer. Кроме того, хорошо бы иметь кодоблок, который рисует весь объект, скажем, header, и кодоблок, который рисует только фон - если вы хотите по-своему нарисовать фон, но не хотите заморачиваться с рисованием всего остального. А еще кодоблоки, которые рисуют отдельные элементы. Скажем, вас устраивает стандартный header, но вы хотите после того как он нарисуется пририсовать какой-либо значок (тот же знак установки сортировки) - причем, теоретически, таких кодоблоков может быть больше одного. Поэтому я думаю сделать массив кодоблоков, куда можно будет добавлять их, например, так: [pre2]oColumn:SetPaint( PAINT_HEADER_ALL, block1 ) oColumn:SetPaint( PAINT_LINE_BACKGROUND, block2 )[/pre2] а HwGUI будет находить и запускать их в соответствующие моменты времени вместо каких-то своих стандартных действий. Боюсь только, не слишком ли это будет "накручено" для пользователя. а если заложить в HBrowse двойную буферизацию Ну это нетрудно - всего несколько строк добавить, как это сделано в source/common/hcedit.prg, например: [pre] hDCReal := hwg_BeginPaint( ::handle, pps ) aCoors := hwg_GetClientRect( ::handle ) hDC := hwg_CreateCompatibleDC( hDCReal ) hBitmap := hwg_CreateCompatibleBitmap( hDCReal, aCoors[3]-aCoors[1], aCoors[3]-aCoors[1] ), aCoors[4]-aCoors[2] ) hwg_Selectobject( hDC, hBitmap ) ... hwg_BitBlt( hDCReal, 0, 0, aCoors[3] - aCoors[1], aCoors[4] - aCoors[2], hDC, ::nShiftL, 0, SRCCOPY ) hwg_DeleteDC( hDC ) hwg_DeleteObject( hBitmap ) hwg_EndPaint( ::handle, pps )[/pre] но надо ли ? Я убрал многие моменты, которые могли приводить к перерисовке фрагментов browse и сейчас, вроде, мерцания нет.

SergKis: alkresin пишет: но надо ли ? Работа с сервером напрямую (без skipов, медленное соединение...). В минигуи мы вынуждены были сделать такое (старая версия) в browse (ListView). Мне думается это облегчит жизнь всем, тем более Ну это нетрудно - всего несколько строк добавить Поэтому я думаю сделать массив кодоблоков Наверно, да. Возможно такой массив (объект) организовать для ячейки и далее распространить его на строку и механизм строки распространить на hedar, super header, footer, тогда и super footer получится автоматом. Заложить средние (это условно) возможности в общее поведение browse, а т.к. это скорее всего будут классы, то наследованием можно усложнить поведение до нужных кондиций по надобности

SergKis: alkresin пишет: Боюсь только, не слишком ли это будет "накручено" для пользователя. Думаю, пользователей обрадует, расширение возможностей. "Упрощенный" вариант ляжет в #xcommand ..., а "развитой" в объектах. Это от трудоемкости реализации зависит.

alkresin: Буферизацию добавил.

alkresin: Еще добавил переменную HBrowse :lBuffering ( .F. по умолчанию ), чтобы включать при необходимости буферизацию.

SergKis: alkresin пишет Еще добавил переменную HBrowse :lBuffering Проверил оба режима на bc, все оч. хорошо . Msvc и сервер сейчас проверить не могу, не дома (где то через нельку только)



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