Виджеты "paneltop", "ownbtn"

55 views
Skip to first unread message

Сергей Владимирович

unread,
Nov 12, 2018, 7:28:38 AM11/12/18
to guiserver
Вопрос  "paneltop":  можно ли часть кнопок выровнять по левому краю, а часть по правому.
Вопрос  "ownbtn" по свойству "Image" :  можно ли рисунок выровнять по левому краю, по правому.

Интересует какими  свойствами можно привязывать виджеты друг относительно друга.

alkresin

unread,
Nov 12, 2018, 7:43:03 AM11/12/18
to guiserver
> "paneltop":  можно ли часть кнопок выровнять по левому краю, а часть по правому.
   Можно, для этого используется свойство Anchor (якорь) - см. как это сделано, например, в etutor - там 4 кнопки привязаны к правому краю, одна - к левому. Все значения констант для Anchor перечислены в extwidg.go: A_TOPLEFT и пр.

> "ownbtn" по свойству "Image" :  можно ли рисунок выровнять по левому краю, по правому.
   Можно будет несколько позже. В HwGUI можно указывать координаты на кнопке, куда помещать картинку, надо только передать это через какой-либо параметр из Go.

> Интересует какими  свойствами можно привязывать виджеты друг относительно друга.
   Можно через Anchor - он определяет, как изменятся положение и размер виджета при изменении размера родительского окна.
   В более сложных случаях можно установить callback ф-ю на событие "onsize" через SetCallBackProc() - но в этом случае лучше использовать Harbour-код, исполняемый прямо на GuiServer'е.

Сергей Владимирович

unread,
Nov 26, 2018, 5:47:52 AM11/26/18
to guiserver
попытался сделать 4 панели сверху, снизу , сбоку левого, сбоку правого. Не понял как работают координаты левого верхнего угла панели. Не подскажите логику?

Сергей Владимирович

unread,
Nov 26, 2018, 6:29:04 AM11/26/18
to guiserver
  egui.CreateStyle(&(egui.Style{Name: "st1", Orient: 1, Colors: []int32{CLR_LBLUE, CLR_LBLUE3}}))
  egui.CreateStyle(&(egui.Style{Name: "st2", Colors: []int32{CLR_LBLUE}, BorderW: 3}))
  egui.CreateStyle(&(egui.Style{Name: "st3", Colors: []int32{CLR_LBLUE},
    BorderW: 2, BorderClr: CLR_LBLUE0}))
  egui.CreateStyle(&(egui.Style{Name: "st4", Colors: []int32{CLR_LBLUE2, CLR_LBLUE3},
    BorderW: 1, BorderClr: CLR_LBLUE}))
// window
  pWindow := &egui.Widget{X: 100, Y: 100, W: 400, H: 300, Title: "External"}
  egui.InitMainWindow(pWindow)
// paneltop
    pWindow.AddWidget(&egui.Widget{Type: "paneltop", H: 50, AProps: map[string]string{"HStyle": "st1"}})
//panelleft фиксированная слева не рисуется снизу рамка
pWindow.AddWidget(&egui.Widget{Type: "panel",X: 0,Y: 50, W: 100,H: 194,Anchor: egui.A_TOPABS + egui.A_BOTTOMABS,
AProps: map[string]string{"HStyle": "st2"}})
//panelright не растягивается
pWindow.AddWidget(&egui.Widget{Type: "panel",X: 100,Y: 50, W: 100,H: 200,Anchor: egui.A_TOPABS + egui.A_BOTTOMABS+egui.A_RIGHTABS,
AProps: map[string]string{"HStyle": "st1"}})
// panelbot вопрос по X
pWindow.AddWidget(&egui.Widget{Type: "panelbot", X: 100,H: 50,  AProps: map[string]string{"HStyle": "st3"}})



  pWindow.Activate()

  egui.Exit()

Сергей Владимирович

unread,
Nov 26, 2018, 7:19:56 AM11/26/18
to guiserver
// window
  pWindow := &egui.Widget{X: 100, Y: 100, W: 400, H: 300, Title: "External"}
  egui.InitMainWindow(pWindow)
// paneltop
  pWindow.AddWidget(&egui.Widget{Type: "paneltop", H: 50, AProps: map[string]string{"HStyle": "st1"}})
//panelleft фиксированная слева не рисуется снизу рамка
panelleft := pWindow.AddWidget(&egui.Widget{Type: "panel",X: 0,Y: 52, W: 100,H: 158,Anchor: egui.A_TOPABS + egui.A_BOTTOMABS,
AProps: map[string]string{"HStyle": "st2"}})
panelleft.AddWidget(&egui.Widget{Type: "paneltop", H: 50, AProps: map[string]string{"HStyle": "st1"}})
//panelright растягивается
pWindow.AddWidget(&egui.Widget{Type: "panel",X: 102,Y: 52, W: 300,H: 158,Anchor: egui.A_TOPABS + egui.A_BOTTOMABS+egui.A_RIGHTABS + egui.A_LEFTABS,
AProps: map[string]string{"HStyle": "st1"}})
// panelbot вопрос по X
pWindow.AddWidget(&egui.Widget{Type: "panelbot", X: 100,H: 50,  AProps: map[string]string{"HStyle": "st3"}})

как я понял надо еще высоту заголовка формы учитывать.
А можно ли у формы заголовок не рисовать(для выкидного списка и не только)

alkresin

unread,
Nov 26, 2018, 7:33:02 AM11/26/18
to guiserver
Вы правы, тут сказывается высота заголовка и, если оно будет, меню.
Чтобы решить связанные с этим проблемы, в тех случаях, когда виджеты привязаны к высоте окна, надо размеры окна указывать отрицательными - тогда они интерпретируются как размеры клиентской части окна:

pWindow := &egui.Widget{X: 100, Y: 100, W: -400, H: -300, Title: "External"}

Выглядит немного странно, но такой же трюк делается и в Windows API с высотой шрифта - поэтому я решил, что и мне можно).

> panelright не растягивается

  надо добавить egui.A_LEFTABS - тогда будут фиксированы и левый, и правый края, и панель будет растягиваться.

> panelbot вопрос по X

 Для panelbot, как и для paneltop, X можно не указывать, он все равно игнорируется.

Сергей Владимирович

unread,
Nov 26, 2018, 7:43:56 AM11/26/18
to guiserver
конечный вариант + splitter
// window
  pWindow := &egui.Widget{X: 100, Y: 100, W: 400, H: 300, Title: "External"}
  egui.InitMainWindow(pWindow)
// paneltop
  pWindow.AddWidget(&egui.Widget{Type: "paneltop", H: 50, AProps: map[string]string{"HStyle": "st1"}})
//panelleft фиксированная слева
panelleft := pWindow.AddWidget(&egui.Widget{Type: "panel",X: 0,Y: 52, W: 100,H: 158,Anchor: egui.A_TOPABS + egui.A_BOTTOMABS,
AProps: map[string]string{"HStyle": "st2"}})
panelleft.AddWidget(&egui.Widget{Type: "paneltop", H: 50, AProps: map[string]string{"HStyle": "st1"}})
//panelright растягивается
panelright := pWindow.AddWidget(&egui.Widget{Type: "panel",X: 102,Y: 52, W: 300,H: 158,Anchor: egui.A_TOPABS + egui.A_BOTTOMABS+egui.A_RIGHTABS + egui.A_LEFTABS,
AProps: map[string]string{"HStyle": "st1"}})

pSpliV := pWindow.AddWidget(&egui.Widget{Type: "splitter", X: 101, Y: 52, W: 2, H: 158,
AProps: map[string]string{"ALeft": egui.ToString(panelleft), "ARight": egui.ToString(panelright)}})
pSpliV.SetCallBackProc("onsize", nil, "{|o,x,y|o:Move(,,x-o:nLeft)}")

// panelbot
pWindow.AddWidget(&egui.Widget{Type: "panelbot", H: 50,  AProps: map[string]string{"HStyle": "st3"}})

alkresin

unread,
Nov 26, 2018, 7:59:55 AM11/26/18
to guiserver
Вот так, наверное, будет лучше:

    pWindow.AddWidget(&egui.Widget{Type: "splitter", X: 101, Y: 52, W: 2, H: 158, Anchor: egui.A_TOPABS + egui.A_BOTTOMABS,

        AProps: map[string]string{"ALeft": egui.ToString(panelleft), "ARight": egui.ToString(panelright)}})

А pSpliV.SetCallBackProc("onsize", nil, "{|o,x,y|o:Move(,,x-o:nLeft)}") уберите - эта конструкция растягивает сплиттер по горизонтали, вряд ли вам это надо.

Сергей Владимирович

unread,
Nov 26, 2018, 8:08:11 AM11/26/18
to guiserver
panelleft.AddWidget(&egui.Widget{Type: "paneltop", H: 50, AProps: map[string]string{"HStyle": "st1"}})

У левой панели добавил "paneltop".

А когда раздвигаю сплиттером "paneltop" остается фиксированного размера. Как тут быть?

Кроме того заметил если форму делаю на весь экран сплиттер пропадает

alkresin

unread,
Nov 26, 2018, 8:14:23 AM11/26/18
to guiserver
> У левой панели добавил "paneltop".
> А когда раздвигаю сплиттером "paneltop" остается фиксированного размера. Как тут быть?

 Вижу. Надо разобраться, сразу не готов сказать.

> Кроме того заметил если форму делаю на весь экран сплиттер пропадает

Точно? У меня не пропадает.

Сергей Владимирович

unread,
Nov 26, 2018, 8:19:22 AM11/26/18
to guiserver
со сплиттером я не прав. Он у меня фиксированного размера был и остался наверху.

alkresin

unread,
Nov 27, 2018, 3:13:31 AM11/27/18
to guiserver
> когда раздвигаю сплиттером "paneltop" остается фиксированного размера.

Исправил. Новые бинарники GuiServer - как всегда на моем сайте.

Сергей Владимирович

unread,
Nov 29, 2018, 10:13:23 AM11/29/18
to guiserver
func initPanelLeft(pWindow *egui.Widget, wx, wy, ww, wh int) *egui.Widget {
  hp := 40
  //panelleft фиксированная слева
  panelleft := pWindow.AddWidget(&egui.Widget{Type: "panel", Name: "lpan", X: wx, Y: wy, W: ww, H: wh,
    Anchor: egui.A_TOPABS + egui.A_BOTTOMABS, AProps: map[string]string{"HStyle": "stPanel"}})
  panelleft.AddWidget(&egui.Widget{Type: "paneltop", H: hp, Anchor: egui.A_TOPABS + egui.A_BOTTOMABS,
    AProps: map[string]string{"HStyle": "st1"}})
  // Tree
  pTree := panelleft.AddWidget(&egui.Widget{Type: "tree", Name: "tree",
    X: 1, Y: hp + 1, W: ww - 2, H: wh - hp - 1, Winstyle: egui.WS_VSCROLL, Anchor: egui.A_TOPABS + egui.A_BOTTOMABS + egui.A_RIGHTABS + egui.A_LEFTABS,
    AProps: map[string]string{"AImages": egui.ToString("folder.bmp", "folderopen.bmp")}})
  buildTree(pTree)
  return panelleft
}

Квадратиками в правом верхнем углу разворачиваю не весь экран, затем сворачиваю в результате ptree не растягивается полностью.
Сплитерром или при увеличении уменьшении окна растягивается.

попутно как понял у "tree" один столбец?
если захочу много то это "browse"

alkresin

unread,
Nov 29, 2018, 12:37:39 PM11/29/18
to guiserver
Можно еще строчку с вызовом этой ф-ии и строчку с определением главного окна ?
Старайтесь, по-возможности, присылать примеры в таком виде, чтобы я мог сразу их запустить.
Ну а tree и browse отличаются не только количеством столбцов. Browse с одним столбцом - это отнюдь не tree).
Browse - это, действительно, то, что иногда называют таблицей. В экосистеме xBase устоялось название browse, потому что там он традиционно применяется для просмотра dbf-файлов.
Reply all
Reply to author
Forward
0 new messages