Страница 1 из 2

Неадекватный POPUP()

Добавлено: 06 Март 2015, 14:58
Игорь Столяров
Привет всем ! :)

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

Т.к. в Clarion такой интерфейсный элемент отсутствует напрочь, создаем простой BUTTON (или CHECKBOX)
и вешаем на него что-то вроде: Popup('Пункты меню для выбора',?Button{Prop:XPos},?Button{Prop:YPos} - 2,True)

Все хорошо, за исключением того, что PopUp меню открывается в непредсказуемом направлении (вверх или вниз)
в зависимости от размера и расположения MDI окна ... :(
Можно как-либо зафиксировать направление открытия Popup() меню ?

Заранее спасибо за любые идеи.
Может быть можно как-то по другому сделать кнопку с выпадающим по нажатию меню ?

Неадекватный POPUP()

Добавлено: 06 Март 2015, 15:47
kreator
А если жёстко задать координаты левого верхнего угла, толку мало? В принципе ещё можно считать эти координаты в зависимости от условий. "Непредсказуемое" поведение popup-меню происходит из-за того, что оно не влезает полностью в окно.

Неадекватный POPUP()

Добавлено: 06 Март 2015, 15:52
Игорь Столяров
Причины по которым меняется направление открытия - понятны.
Но предположим, кнопка находится в верхнем левом угле окна, предполагая, что PopUp() будет открываться вниз,
где всегда для его открытия достаточно места (поверх MDI окна). Но нет ! Если окно находится посреди экрана -
может открыться и вверх, тем самым портя всю задумку дизайна ... ;)

Координата открытия задается - с этим проблем нет.
Проблема в том, что она может оказаться как координатой левого верхнего, так и левого нижнего угла меню.
А по человечески, ведь хочется стабильности ... :)

Я почему спросил ... например в AppFrame (точнее в структуре MENU) выпадающие меню никогда не открываются вверх ...
Да, у них другая проблема в C91 с горизонтальной координатой открытия, но это совсем другая история ...

Неадекватный POPUP()

Добавлено: 06 Март 2015, 17:24
gopstop2007
а взять параметры кнопки-чекета для popup-a и передать их popup не подойдет? Когда то, так делал и получал красивое открытие popup-a привязанное к кнопке

Неадекватный POPUP()

Добавлено: 06 Март 2015, 17:24
Admin
CFCPopup до упора почти вниз открывает...

Неадекватный POPUP()

Добавлено: 06 Март 2015, 17:43
Игорь Столяров
gopstop2007 писал(а):а взять параметры кнопки-чекета для popup-a и передать их popup не подойдет?
Я извиняюсь, а можно для тех кто в танке пояснить таинство этого действия ? Заранее спасибо.

Если оно конечно, чем то отличается от того, что я написал в первом сообщении.
( Popup('Пункты меню для выбора',?Button{Prop:XPos},?Button{Prop:YPos} - 2,True) )

Неадекватный POPUP()

Добавлено: 06 Март 2015, 22:49
gopstop2007
вот еле нашел пример с которого лепил в своей "солянке" :) нашел когда то на cla - форуме

Код: Выделить всё

PROGRAM
POINT           GROUP,TYPE
X                SIGNED
Y                SIGNED
                END
                
 Map
   Module('win32.lib')
    ClientToScreen(UNSIGNED hwnd, *POINT lpPoint),SIGNED,RAW,PASCAL
   End
 End

W    WINDOW('Popup Testing'),AT(,,154,120),GRAY
       BUTTON('Close'),AT(100,3,45,14),USE(?Close)
       BUTTON('Popup'),AT(3,2,45,14),USE(?Popup)
     END
p  Like(Point)
 Code
 Open(W)
 Display
 Accept
   Case Accepted()
   Of ?Popup
     0{Prop:Pixels} = True
     p.X = ?Popup{Prop:Xpos}
     p.Y = ?Popup{Prop:Ypos} + ?Popup{Prop:Height}
     X# = ClientToScreen(0{Prop:Handle},p)
     X# = Popup('Test1|Test2',p.X,p.Y)
     0{Prop:Pixels} = False
   Of ?Close
     Break
   End
 End
 Close(W) 
может поможет

Неадекватный POPUP()

Добавлено: 06 Март 2015, 23:05
Игорь Столяров
Спасибо. Проблемы те же.
Я так понимаю, что это очень старый пример, который реализует через API привязку к координатам окна.
Сейчас такая возможность есть и у стандартного PopUp() - последний параметр.

Думаю, что указанная мною "проблема" вызвана тем, что я пытаюсь задействовать PopUp() не по назначению.
Его задача - раскрытие контекстного меню по координатам мыши. Но более чем уверен, что можно как-то
выключить его функционал по интеллектуальному выбору направления открытия ...

Неадекватный POPUP()

Добавлено: 06 Март 2015, 23:14
Дед Пахом
Случаем не на планшете тестируешь?

Неадекватный POPUP()

Добавлено: 06 Март 2015, 23:19
Игорь Столяров
Нет. Но планшет есть могу, попробовать. Будет разница ?

Неадекватный POPUP()

Добавлено: 06 Март 2015, 23:29
gopstop2007
GetWindowRect(hWndControl, rcCtrl)
X# = POPUP('1|2|3', rcCtrl.Right, rcCtrl.Bottom)

Неадекватный POPUP()

Добавлено: 07 Март 2015, 0:05
Дед Пахом
Игорь Столяров писал(а): Нет. Но планшет есть могу, попробовать. Будет разница ?
Не, я как раз нагуглил такую проблему для Tablet PC, там это лечится кардинально в настройках девайса.

Неадекватный POPUP()

Добавлено: 07 Март 2015, 0:29
Игорь Столяров
Я по этой причине принципиально медицинские сайты не гуглю.
Обязательно что-нибудь у себя найдешь ... ;)

Неадекватный POPUP()

Добавлено: 07 Март 2015, 1:18
Admin
В С++ BS_SPLITBUTTON работает так же. Можно попробовать влезть в потрошки, перед выводом POPUP чекать позицию окна POPUP (вроде есть события) и смещать куда нужно. Но уж больно геморройно сие.

Неадекватный POPUP()

Добавлено: 07 Март 2015, 8:36
Игорь Столяров
Да. :( Углубившись в понимание сути происходящего, я понял что пытаюсь делать
что-то не то, да еще и против ветра ...
explorer.jpg