purebasic.info

PureBasic forum
Текущее время: Чт июн 21, 2018 5:14 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Пн апр 06, 2015 12:12 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Изображение
На рисунке кнопка "ОК" подсвечена и по нажатии Enter произойдет действие (окно закроется). Как такое изобразить на PB? Что-то я нигде не встречал.
Это явно виндусовая фича, встречается во многих программах, в том числе в диалогах выбора файла, цвета и т.д.
Даже когда явно устанавливаешь фокус на кнопку, эффекта ноль
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
If OpenWindow(0, 0, 0, 230, 50, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget  (1, 10, 10, 200, 20, "Click me")
  SetActiveGadget(1)
   Repeat
     Event = WaitWindowEvent()
     Select Event
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Button 1 clicked!"
         EndSelect
     EndSelect
   Until Event = #PB_Event_CloseWindow
EndIf


ПыСы если где-то было, извиняйте

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 12:21 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2275
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
+1 к вопросу. Также в PB как-то "по-левому" делается PopUp Menu.
Изображение
Дефолтный пример (PopupMenu.pb): отслеживается нажатие пр. кн. мыши и появляется меню, но в других приложениях к строке из "ListIconGadget"'а как-то "привязывается" меню и оно вызывается, например, когда строка выделена и послана клавиша {MENU}.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 12:38 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Сейчас накидал на дельфях окошко, кинул два батона и стринг. На одном батоне есть фокус и нажимается по ентер, хотя специально фокус не устанавливал

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 12:43 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Мдя, :oops:
#PB_Button_Default
Код:
1
2
3
4
5
6
7
8
9
10
11
12
If OpenWindow(0,300,250,400,200,"Button focus",#PB_Window_SystemMenu)
  ButtonGadget(1,50,50,60,25,"Hit Enter",#PB_Button_Default)
  ButtonGadget(2,150,50,60,25,"Button2")
  ButtonGadget(3,250,50,60,25,"Button3")
  SetActiveGadget(1)
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Debug EventGadget()
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf



Подсвечиваться кнопка стала, но на Enter не реагирует :(

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 1:21 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Нашел вот такой костыль :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#Btn_Cancel = 2
#Btn_OK = 3
If OpenWindow(0,300,250,400,200,"Button focus",#PB_Window_SystemMenu)
  ButtonGadget(#Btn_OK,50,50,60,25,"Hit Enter",#PB_Button_Default)
  ButtonGadget(#Btn_Cancel,150,50,60,25,"Button2")
  SetActiveGadget(#Btn_OK)
  Repeat
    ev=WaitWindowEvent()   ; Get msg
   Select ev
    Case #WM_KEYDOWN ; Key pressed (KEYBOARD)
      EventID2.l = EventwParam() ; Get wParam
      Select EventID2
        Case #VK_RETURN ; Key is RETURN
          EventID3.l = GetFocus_()  ; GetActiveGadget() не работает!
          Select EventID3
            Case GadgetID(#Btn_OK) ; active gadget is #Btn_OK
              MessageRequester("KEY!","You hit Ok",0)
            Case GadgetID(#Btn_Cancel) ; active gadget is #Btn_Cancel
              MessageRequester("KEY!","You hit Cancel",0)
            Default
          EndSelect
        Default
      EndSelect
    Case #PB_Event_Gadget ; Gadget event (MOUSE)
      Select EventGadget()
        Case #Btn_OK
          MessageRequester("MOUSE!","You clicked Ok",0)
        Case #Btn_Cancel
          MessageRequester("MOUSE!","You clicked Cancel",0)
      EndSelect
     
  EndSelect    
  Until ev=#PB_Event_CloseWindow
EndIf


Может кто-то по прямее видел

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 7:00 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6310
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
pablov писал(а):
Нашел вот такой костыль :D

#PB_Button_Default - зло!
По Tab фокус переходит, а подсветка нет, получается, что подсвечивается одна клавиша, а нажимается другая.

P.S. батоны жму "Пробелом", а потому эту проблему в Пурике не замечал. Но обидно, что везде в других ЯП есть по умолчанию, а тут нет.

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 9:52 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
kvitaliy писал(а):

P.S. батоны жму "Пробелом"

Пробел только и работает что в Пурике, в других программах не але. Даже в стандартных диалогах. Я всю жизнь батоны нажимал ентером
Сдается мне что это следствие кроссплатформенности, Вернее как ее организовал Фред. Криво сделанные обертки над API OS и вот результат

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 12:48 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
А так не пойдет?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Procedure TestHandler()
  #PB_EventType_KeyEnter = #PB_Event_FirstCustomValue
  PostEvent(#PB_Event_Gadget,EventWindow(),GetActiveGadget(),#PB_EventType_KeyEnter)
 EndProcedure
 
  Procedure ButtonGadgetEx(Gadget,X,Y,Width,Height,Caption$,Flags=0)
    Protected Menu
    ButtonGadget(Gadget,X,Y,Width,Height,Caption$,Flags) :SetActiveGadget(Gadget)
    AddKeyboardShortcut(GetActiveWindow(), #PB_Shortcut_Return, Gadget)
    Menu = CreateMenu(#PB_Any, WindowID(GetActiveWindow()))
    BindMenuEvent(Menu, Gadget, @TestHandler())
    HideMenu(Menu,1)
  EndProcedure
 
  OpenWindow(0, 100, 100, 200, 150, "Click test", #PB_Window_SystemMenu)
 
  ButtonGadget(0, 4,  4, 192, 20, "but")
  ButtonGadgetEx(1, 4,  34, 192, 20, "Norma",#PB_Button_Default)
 
  Repeat
    Event = WaitWindowEvent()
   
    newbut=GetFocus_()
    If newbut<>oldbut
      SendMessage_(oldbut,#BM_SETSTYLE,0,0) : oldbut=newbut
      SendMessage_(newbut,#BM_SETSTYLE,#BS_DEFPUSHBUTTON,#True)
    EndIf
   
    If Event = #PB_Event_Gadget And EventType() = #PB_EventType_KeyEnter
      Debug "Enter"+EventGadget()
  EndIf
  Until Event = #PB_Event_CloseWindow
 



Последний раз редактировалось mestnyi Вт апр 07, 2015 8:26 am, всего редактировалось 5 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 1:14 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6310
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
pablov писал(а):
Пробел только и работает что в Пурике, в других программах не але. Даже в стандартных диалогах. Я всю жизнь батоны нажимал ентером

Да не, "пробел" везде рулит, особенно в стандартных диалогах :D
Испробуй, да хоть в Блокноте, стрелочками курсора выбор кнопки, пробелом кнопку нажимаем. Пробел кнопка крупнее, да и ближе чем Ентер, а я ленивый.

_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 1:47 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
mestnyi писал(а):
А так не пойдет?

Нет, в обоих случаях по ентеру постоянно нажимается кнопка №1, хотя табом фокус установлен на кнопку №0. Подсветка по табу не переходит

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 1:52 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
pablov, при нажатии Enter для активной кнопки (т.е. при использовании SetActiveGadget) генерируется событие 257. Флаг #PB_Button_Default несет чисто визуальный функционал, об этом и в справке написано (Makes the button look as if it is the default button in the window)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Global OldCallback
 
Procedure CallBack(hWnd, Msg, wParam, lParam)
  If msg = 257
    Debug "Enter!"
  EndIf
 
  ProcedureReturn CallWindowProc_(OldCallback, hWnd, Msg, wParam, lParam)
EndProcedure
 
If OpenWindow(0,300,250,400,200,"Button focus",#PB_Window_SystemMenu)
  ButtonGadget(1,50,50,60,25,"Hit Enter",#PB_Button_Default)
  ButtonGadget(2,150,50,60,25,"Button2")
  ButtonGadget(3,250,50,60,25,"Button3")
  SetActiveGadget(1)
 
  OldCallback = GetWindowLong_(GadgetID(1), #GWL_WNDPROC)
  SetWindowLong_(GadgetID(1), #GWL_WNDPROC, @CallBack())
 
  Repeat
    ev=WaitWindowEvent()
    If ev=#PB_Event_Gadget
      Debug EventGadget()
    EndIf
  Until ev=#PB_Event_CloseWindow
EndIf


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 1:58 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Никита, подсветка не переходит по табу и на Enter реагирует только 1 кнопка
Вот, усовершенствовал свой костыль
Теперь по табу переходит и фокус и подсветка, и работает Enter на всех кнопках
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#Btn_Cancel = 2
#Btn_OK = 3
#Btn_Del = 4
#String = 5
 
Procedure EvProc(event.i)
   Protected.i EventID2, EventID3
      EventID2 = EventwParam() ; Get wParam
      Select EventID2
        Case #VK_RETURN ; Key is RETURN
          EventID3 = GetFocus_()  ; GetActiveGadget() не работает!
      EndSelect    
    ProcedureReturn  EventID3
EndProcedure  
 
If OpenWindow(0,300,250,400,200,"Button focus",#PB_Window_SystemMenu)
  ButtonGadget(#Btn_OK,50,50,60,25,"Hit Enter")
  ButtonGadget(#Btn_Cancel,150,50,60,25,"Cancel")
  ButtonGadget(#Btn_Del,250,50,60,25,"Delete")
  StringGadget(#String, 50, 95, 260, 20, "String")
 
  SetActiveGadget(#Btn_OK)
  Repeat
    ev=WaitWindowEvent()   ; Get msg
    newbut=GetFocus_()
    If newbut<>oldbut
      SendMessage_(oldbut,#BM_SETSTYLE,0,0) : oldbut=newbut
      SendMessage_(newbut,#BM_SETSTYLE,#BS_DEFPUSHBUTTON,#True)
    EndIf
   Select ev
     Case #WM_KEYDOWN ; Key pressed (KEYBOARD)
        EventID3 = EvProc(ev)  
          Select EventID3
            Case GadgetID(#Btn_OK) ; active gadget is #Btn_OK
              MessageRequester("KEY!","Hit Enter",0)
            Case GadgetID(#Btn_Cancel) ; active gadget is #Btn_Cancel
              MessageRequester("KEY!","You hit Cancel",0)
            Case GadgetID(#Btn_Del) ; active gadget is #Btn_Del
              MessageRequester("KEY!","You hit Delete",0)
            Default
          EndSelect
    Case #PB_Event_Gadget ; Gadget event (MOUSE)
      Select EventGadget()
        Case #Btn_OK
          MessageRequester("MOUSE!","Hit Enter",0)
        Case #Btn_Cancel
          MessageRequester("MOUSE!","You clicked Cancel",0)
        Case #Btn_Del
              MessageRequester("KEY!","You hit Delete",0)
      EndSelect
     
  EndSelect    
  Until ev=#PB_Event_CloseWindow
EndIf


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн апр 06, 2015 8:52 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Цитата:
На рисунке кнопка "ОК" подсвечена и по нажатии Enter произойдет действие

Цитата:
Нет, в обоих случаях по ентеру постоянно нажимается кнопка №1, хотя табом фокус установлен на кнопку №0. Подсветка по табу не переходит

Теперь проверь.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт апр 07, 2015 1:05 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Теперь на ентер реагируют обе кнопки, но подсветка по Табуляции не переходит, только фокус. Об это Виталий вверху писал
В этом посту я выложил вполне себе рабочий код, хоть и костыльный, но на безрыбие...

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт апр 07, 2015 8:27 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс дек 09, 2012 9:02 pm
Сообщений: 771
Откуда: Дагестан
Благодарил (а): 0 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
А теперь. :D


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB