Forth
http://fforum.winglion.ru/

Особенности работы WinLib by ~yz+~ygrek
http://fforum.winglion.ru/viewtopic.php?f=18&t=644
Страница 1 из 4

Автор:  in4 [ Вт апр 03, 2007 01:13 ]
Заголовок сообщения:  Особенности работы WinLib by ~yz+~ygrek

Почему-то рамка пересекает окошко edit-а
Код:
DIS-OPT \ для SPF ниже 4.10 под NT
REQUIRE toolbar ~yz/lib/wincc.f
SET-OPT

: b BYE ;

: edit-resize { n ctl -- }
\ размер поля ввода по максимальному числу символов
  n ctl limit-edit
  " W" ctl text-size SWAP n * 6 + SWAP 6 + ctl resize ;

0 VALUE g

: make-grids
  GRID -boxed  \ пересекает поле
\  GRID -bevel  \ выглядит нормально
    edit 15 this edit-resize |
  GRID; TO g
 
  GRID
    " Текст1" label |
    g |
    " Текст2" label |
  GRID;  winmain -grid!
  ;


: run
  WINDOWS...
  0 dialog-window TO winmain
  " Пример глюка -boxed" winmain -text!
  make-grids
  winmain wincenter
  winmain winshow

  ...WINDOWS
  BYE
;

run
BYE

Раньше рамки рисовались нормально, но в коде сделано много изменений

Как бы еще сделать аналоги -bevel, чтоб была рамочка выпуклая, одноцветная и др. варианты?

Автор:  ygrek [ Вт апр 03, 2007 19:17 ]
Заголовок сообщения: 

как временное решение - заменить в файле winctl.f строку
Код:
ym 2/ - SWAP xm 2/ - SWAP R> another-place

на
Код:
ym 2/ - 4 - SWAP xm 2/ - SWAP R> another-place

но это сдвигает bevel :)

Получается разное смещение за счёт того что bevel реализовано как кнопка, а boxed как static контрол. надо экспериментировать.

Автор:  ygrek [ Ср апр 25, 2007 22:05 ]
Заголовок сообщения: 

Можно ещё так обходить - в начале сетки которая -boxed ставить пустой ряд
Код:
"" label |
===

Автор:  Гость [ Пн июн 04, 2007 15:01 ]
Заголовок сообщения: 

Набросал небольшой интерфейс на WinLib.

И возникли некоторые вопросы

1. Что добавить, чтобы содержание формы при начальном отображении соответствовало
заложенному. ( пока только через шаманство на форме после ее отображения.)
2. Как можно улучшить взаимопересчет элементов, например при движении сплиттера?
3. ...


Код:
DIS-OPT \ для версий ниже 4.00 build 10

REQUIRE WINDOWS... ~yz/lib/winlib.f
REQUIRE button ~yz/lib/winctl.f
REQUIRE toolbar ~yz/lib/wincc.f

REQUIRE splitter ~yz/lib/splitter.f

SET-OPT

0 VALUE win
0 VALUE win2
0 VALUE win3

0 VALUE times

\ -----------------------------------

PROC: quit
winmain W: wm_close ?send DROP
PROC;

PROC: hello
" Привет!" msg
PROC;

WINAPI: SelectObject GDI32.DLL
WINAPI: TextOutA GDI32.DLL

PROC: paint
times windc SelectObject DROP
" Привет всем!" ASCIIZ> SWAP 0 0 windc TextOutA DROP
PROC;

\ Вложенное меню
MENU: inner
hello MENUITEM Тоже привет
MENU;

\ Основное меню
MENU: filemenu
hello MENUITEM &Привет\tF5
inner SUBMENU &Вложенное меню
' NOOP DISABLED MENUITEM Отключено
LINE
quit MENUITEM &Quit\tAlt-X
MENU;

MENU: mainmenu
filemenu SUBMENU Файл
MENU;

\ -------------------------------------
MESSAGES: my

M: wm_contextmenu
filemenu lparam LOWORD lparam HIWORD show-menu
TRUE
M;

WINAPI: WinHelpA USER32.DLL

M: wm_help
0 W: help_helponhelp 0 winmain -hwnd@ WinHelpA DROP
M;

MESSAGES;
\ -------------------------------------

\ Таблица быстрых клавиш
KEYTABLE
hello ONKEY vk_f5
quit ONKEY alt+X
KEYTABLE;

0 VALUE t
0 VALUE hd
0 VALUE tv
0 VALUE lv

WINAPI: ImageList_Create COMCTL32.DLL
WINAPI: ImageList_ReplaceIcon COMCTL32.DLL
WINAPI: ImageList_GetImageCount COMCTL32.DLL

: create-il ( size -- il )
>R 5 5 W: ilc_color8 R> DUP ImageList_Create ;
: add-icon ( resno il -- )
>R IMAGE-BASE LoadIconA -1 R> ImageList_ReplaceIcon DROP ;

WINAPI: FindFirstFileA KERNEL32.DLL
WINAPI: FindNextFileA KERNEL32.DLL
WINAPI: FindClose KERNEL32.DLL

: fill-listview { \ no fh [ 400 ] fdata }
32 create-il DUP 1 SWAP add-icon W: lvsil_normal lv -imagelist!
16 create-il DUP 1 SWAP add-icon W: lvsil_small lv -imagelist!
" Имя файла" 0 0 lv add-column
" Размер" 1 1 lv add-column
fdata " *.f" FindFirstFileA TO fh
BEGIN
fdata 11 CELLS + 0 0 lv add-item
\ следующий фокус с вечно нулевым последним подъэлементом не проходит,
\ когда включена автосортировка: номера конкретной иконки все время меняются
\ тогда надо запоминать уникальный param и пользоваться lv-param>i
fdata 8 CELLS@ S>D <# 0 HOLD #S #> DROP 0 1 lv -isubitem!
fdata fh FindNextFileA 0= UNTIL
fh FindClose DROP ;

: fill-header,treeview
0 " Имя" none 0 0 hd add-item
0 " Фамилия" none 0 1 hd add-item
0 " Отчество" none 0 2 hd add-item
90 0 hd -iwidth!
100 1 hd -iwidth!
100 2 hd -iwidth!
\
16 create-il DUP 1 SWAP add-icon 0 tv -imagelist!
" yz" 0 0 0 W: tvi_first 0 tv add-item >R
" prog" 0 0 0 W: tvi_first R> tv add-item >R
" winlib" 0 0 0 W: tvi_first R> tv add-item >R
" winlib-example" 0 0 0 W: tvi_last R@ tv add-item DROP
" winctl-example" 0 0 0 W: tvi_last R@ tv add-item DROP
" wincc-example" 0 0 0 W: tvi_last R> tv add-item DROP
;

: make-tabs ( -- tab)
0 tabcontrol

16 create-il DUP 1 SWAP add-icon 0 this -imagelist!
\ Вкладка 1 ===========================
GRID
===
" Индикатор:" label |
===
progress -xspan 60 this +pos! " Это пример индикатора" this -tooltip! |
===
" Ползунок: " label |
===
W: tbs_autoticks trackbar -xspan 80 this -pos! " А вот ползунок" this -tooltip! |
===
" Строка ввода со спином:" label |
===
edit -xspan " 40" this -text! W: uds_setbuddyint this add-updown
" А это просто строка" this -tooltip! |

GRID; " Первая" 0 0 this add-item

\ Вкладка 2 ==========================
GRID
0 header DUP TO hd -xspan -yfixed |
===
(* tvs_haslines tvs_linesatroot tvs_hasbuttons *) treeview DUP TO tv
150 200 this ctlresize |
0 calendar -xfixed |
fill-header,treeview
GRID; " Вторая" 0 1 this add-item

\ Вкладка 3 ========================
GRID
0 listview DUP TO lv -xspan -yspan fill-listview |

GRID; " Третья" 0 2 this add-item

;

PROC: tbutt
" Кнопка на панели инструментов!" msg
PROC;

PROC: mode1 lv icon-view PROC;
PROC: mode2 lv smallicon-view PROC;
PROC: mode3 lv list-view PROC;
PROC: mode4 lv report-view PROC;

: make-toolbar
0 winmain create-toolbar
W: idb_view_small_color winmain -toolbar@ add-std-bitmap DROP
none 0 W: btns_button mode1 0 winmain -toolbar@ add-item
none 1 W: btns_button mode2 1 winmain -toolbar@ add-item
none 2 W: btns_button mode3 2 winmain -toolbar@ add-item
none 3 W: btns_button mode4 3 winmain -toolbar@ add-item
winmain -toolbar@ separate
none 4 W: btns_wholedropdown tbutt 4 winmain -toolbar@ add-item
none 5 W: btns_button tbutt 5 winmain -toolbar@ add-item
;

WINAPI: CreateHatchBrush GDI32.DLL

: run
WINDOWS...
\ 0 - нет родительского окна
0 create-window TO win
\ Объявим главное окно, при закрытии которого программа завершится
win TO winmain
win create-tooltip
make-toolbar
GRID
GRID
multiedit -xspan -yspan |
GRID;
GRID
make-toolbar

GRID
make-tabs -xspan -yspan |
GRID;
GRID
win dialog-window TO win2
GRID;
hsplitter 0 -xmargin 0 -ymargin -xspan -yspan |
GRID;
splitter 0 -xmargin 0 -ymargin -xspan -yspan |
GRID; winmain -grid!

\ заголовки окон " Пример окна верхнего уровня" win -text!
" Дочернее окно" win2 -text!
\ размер и положение дочернего окна
100 100 win2 winresize
100 100 win2 winmove
\ цвет дочернего окна
win2 -bgbrush@ DeleteObject DROP
blue >bgr W: hs_bdiagonal CreateHatchBrush win2 -bgbrush!
\ добавить меню к основному окну
mainmenu win attach-menubar
\ создать шрифт
" Times New Roman Cyr" 36 bold italic create-font TO times
\ установить процедуру отрисовки окна
paint win -painter!
\ установить наш обработчик сообщений
my win -wndproc!
\ показать окна, поскольку по умолчанию они невидимые
win wincenter
win winshow
win2 wincenter
win2 winshow
...WINDOWS
." Программа завершилась"
times delete-font
BYE ;

\ 0 TO SPF-INIT?
' ANSI>OEM TO ANSI><OEM
\ TRUE TO ?GUI
\ ' run MAINX !
\ S" winlib-example.exe" SAVE
run
BYE

Автор:  in4 [ Вт июн 05, 2007 13:18 ]
Заголовок сообщения: 

Гость писал(а):
1. Что добавить, чтобы содержание формы при начальном отображении соответствовало
заложенному. ( пока только через шаманство на форме после ее отображения.)

Можно поподробнее? Что хочется сделать и что именно работает не так?
Желательно выделить для примера только то, что иллюстирует проблему.

В библиотеке для ячейки сетки предусмотрено еще несколько настроек. Может, нужно использовать какие-то из них?
Гость писал(а):
2. Как можно улучшить взаимопересчет элементов, например при движении сплиттера?

Работа сплиттера будет улучшена. Иллюстрирующие примеры переданы автору. :)
Гость писал(а):
3. ...

Пример запустил. Видны части кода демо из библиотеки.
А что должно быть?

Автор:  Гость [ Вт июн 05, 2007 16:08 ]
Заголовок сообщения: 

Гость писал(а):
3. ...

Пример запустил. Видны части кода демо из библиотеки.
А что должно быть?[/quote]
Для начала можно попробовать погонять элементы управления.
Например свернуть развернуть на полный экран и к исходному размеру.

Элементами настройки не удалось вывести форму, чтобы таб панель
выравнивалась по верху и горизонтальный сплиттер был виден.
Хотя при работе с ней она может принять соответствующее ей положение.

Как правильнее сформировать структуру окон, чтобы фоновая надпись
основного окна не влияла на контроллы верхнего слоя?

Хочется, чтобы активная область основного окна не наползала на кнопки
находящиеся ниже меню.

На первой вкладке слово индикатор становится именем закладки.
Сами вкладки возникают в рабочем поле, а могли быть небольшими полосками
при активизации небольшими полосками над областью табов.

Примерно так, возможно сказанное легко реализуется или объясняется.

P.S. Глюк вызванный искажением подсказок связан с моим неправильным
способом их создания:)
Использование атрибута -bevel тоже как то ни так.
Не видно эффекта применения команд изменения размера к главному окну.

Можно сделать, чтобы вкладки табулов находились на уровне кнопок.
при задании соответствующей сетки.

Спасибо за взаимодействие с ~yz.

Автор:  Гость [ Вт июн 05, 2007 16:19 ]
Заголовок сообщения: 

Одно из пожеланий добавить в библиотечку
опции рисования точками, линиями из разработки ~yz
пакетного редактора ged. и отслеживания текущих мышинных координат в окне.

Автор:  Гость [ Вт июн 05, 2007 16:32 ]
Заголовок сообщения: 

Еще на приводимом примере можно попробовать обменять местами
табы и окно редактирования.
У меня наблюдалась нестабильность в работе при попытке изменения
размера окна.

Автор:  yz [ Вт июн 05, 2007 18:46 ]
Заголовок сообщения: 

Anonymous писал(а):
Одно из пожеланий добавить в библиотечку
опции рисования точками, линиями из разработки ~yz
пакетного редактора ged. и отслеживания текущих мышинных координат в окне.

Вы имеете в виду рисование границ? Это не так просто, как кажется. Для этого надо полностью выкидывать отрисовку элементов системой и рисовать их самому.

Координаты мыши отслеживаются перехватом сообщения WM_MOUSEMOVE.

Автор:  in4 [ Вт июн 05, 2007 18:48 ]
Заголовок сообщения: 

Надеюсь, документация прочитана... ;) Внимательно прочитана. :)

Гость писал(а):
Для начала можно попробовать погонять элементы управления.
Например свернуть развернуть на полный экран и к исходному размеру.
Элементы не могут быть меньше минимального размера(обычно, но есть способы ;) ). Этот размер определяется при создании.
-xfixed -yfixed -xspan -yspan
(/ -size 300 100 /)
Гость писал(а):
Элементами настройки не удалось вывести форму, чтобы таб панель
выравнивалась по верху и горизонтальный сплиттер был виден.
Хотя при работе с ней она может принять соответствующее ей положение.

Это проблемы сплиттера. Будет исправлено.
Гость писал(а):
Как правильнее сформировать структуру окон, чтобы фоновая надпись
основного окна не влияла на контроллы верхнего слоя?
Хочется, чтобы активная область основного окна не наползала на кнопки
находящиеся ниже меню.

Я не использую фоновую надпись, использую label .
По-видимому при ее использовании нужно учитывать и размер toolbar-а
А зачем она нужна? Просто интересно... ;)
Ее ведь все равно закроют контролы сеток... ;)
Гость писал(а):
На первой вкладке слово индикатор становится именем закладки.
Сами вкладки возникают в рабочем поле, а могли быть небольшими полосками
при активизации небольшими полосками над областью табов.

А это как по иерархии. Если табы внутри сетки, а тулбар для всего окна - то все правильно ;)
Или надо чтоб тулбав был в табах? Это надо сделать по-другому, но я так еще не пробовал... :(
Гость писал(а):
Использование атрибута -bevel тоже как то ни так.

Автору сообщено. Проблема появиласть при изменении версий. Изучаем, исправим... ;)
Гость писал(а):
Не видно эффекта применения команд изменения размера к главному окну.

У меня - работает. Но задаваемый размер д.б. больше минимального размера элементов. Иначе эффекта действительно не будет видно.
Гость писал(а):
Можно сделать, чтобы вкладки табулов находились на уровне кнопок.
при задании соответствующей сетки.

не понял, можно примерчик... ;) или небольшой иллюстрирующий рисунок (скриншот, где такое есть)?
Гость писал(а):
Одно из пожеланий добавить в библиотечку
опции рисования точками, линиями из разработки ~yz
пакетного редактора ged. и отслеживания текущих мышинных координат в окне.

есть прямоугольники. Мало? ;)
Мышиные координаты отслеживать-то можно, но зачем? Для взаимодействия с контролами простого отслеживания недостаточно. :(
Надо для графического редактора?
Тогда лучше сообщением или процедурой. Думаю, что смог бы сделать вызов заданного PROC из обработчика событий мышки. Похожее для другой цели уже сделал. ;)
Можно поподробнее, что именно требуется? А если будет известно, для чего, м. м.б. сделать аналог другими средствами... ;)
Гость писал(а):
Еще на приводимом примере можно попробовать обменять местами
табы и окно редактирования.
У меня наблюдалась нестабильность в работе при попытке изменения
размера окна.

Я стараюсь делать минимальные примеры, где видно проблему. Они же будут тестами при проведении изменений. Рекомендую поступать так же. Тут многие жаловались на отсутствие телепатических способностей... :(

Автор:  yz [ Вт июн 05, 2007 21:14 ]
Заголовок сообщения: 

Anonymous писал(а):
Как правильнее сформировать структуру окон, чтобы фоновая надпись
основного окна не влияла на контроллы верхнего слоя?

Выводите фоновую надпись в обработчике -paint основного окна. Тогда контролы будут всегда поверх нее.

Автор:  Гость [ Ср июн 06, 2007 08:55 ]
Заголовок сообщения: 

yz писал(а):
Anonymous писал(а):
Как правильнее сформировать структуру окон, чтобы фоновая надпись
основного окна не влияла на контроллы верхнего слоя?

Выводите фоновую надпись в обработчике -paint основного окна. Тогда контролы будут всегда поверх нее.


Так вроде и делается.

P.S. Где можно будет взять исправленный splitter и посмотреть тестовый пример?
У меня splitter на полном экране сильно тормозит и не отрисовывается
основное изображение пока он перемещается.

Автор:  in4 [ Ср июн 06, 2007 13:41 ]
Заголовок сообщения: 

Гость писал(а):
P.S. Где можно будет взять исправленный splitter и посмотреть тестовый пример?
У меня splitter на полном экране сильно тормозит и не отрисовывается
основное изображение пока он перемещается.

Это связано со сложностью разделяемых сплиттером сеток. У меня на более простых сетках получше.
М. надо бы использовать не "честное" изображение, а картинку?

Автор:  Гость [ Ср июн 06, 2007 14:27 ]
Заголовок сообщения: 

in4 писал(а):
Это связано со сложностью разделяемых сплиттером сеток. У меня на более простых сетках получше. М. надо бы использовать не "честное" изображение, а картинку?


А как отрабатывает сплиттер у ~day в библиотеке wfl?

Пробую перехватывать сообщение мышки для отрисовки ее перемещения по
рабочему полю в нажатом состоянии и еще не получилось.
Как это более правильно сделать?
Нужно для перемещения рисунка схемы по рабочей области окна.

P.S. C вертикальным сплиттером заметил особенность в текущем своем тесте
что если его дернуть то контролы выравниваются. Может это происходит
при использовании force-redraw. У меня при попытке скрыть вертикальный
сплиттер, по нажатию кнопки, интерфейс вылетает. С горизонтальным
такое не происходит. По кнопке включаю/выключаю отображение
контролов на рабочем поле.

Автор:  in4 [ Ср июн 06, 2007 15:35 ]
Заголовок сообщения: 

Гость писал(а):
Как это более правильно сделать?

Думаю, кое-что можно, используя что-то вроде:
Код:
MESSAGES: wmes

M: wm_mousemove { | x y }
  lparam LOWORD TO x  lparam HIWORD TO y
...
M;
...
MESSAGES;
...
  wmes winmain -wndproc!
...

А желательно сделать простейший пример, к-й сразу можно запустить и который показывает, что надо. Удобнее будет и добавлять, и хорошая иллюстрация используемых техник... ;)

Страница 1 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/