purebasic.info

PureBasic forum
Текущее время: Вс янв 21, 2018 11:30 pm

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: [Решено] Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 8:06 pm 
Не в сети
студент

Зарегистрирован: Пн июн 30, 2014 11:23 am
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Скажите, пожалуйста, есть ли способ средствами функций Виндовз сделать ContainerGadget с регулируемой полупрозрачностью (например, в качестве полупрозрачной панели инструментов над EditorGadget)? Насколько я понял из MSDN скрижалей, до Виндовс8 регулировать степень прозрачности можно было лишь у top-level windows, то есть у самих форм (что реализовано во многих известных прогах), но не у дочерних контролей. Поэтому функции типа SetLayeredWindowAttributes на гэджетах работать не будут (хотя и не отказываются вызываться). Но все-таки, может есть какие-то тайные способы этого достичь, с помощью тех же API?

_________________
PB 5.22 x86 WinXP SP3 Opus


Последний раз редактировалось shirozaemon Ср июл 02, 2014 11:37 am, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 9:59 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 26, 2011 8:18 pm
Сообщений: 263
Откуда: Волгоград
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ну приходит в голову такой вариант: "снимаешь" участок экрана под гаджетом и рисуешь его фоном гаджета, учитывая нужную прозрачность. Естественно, перерисовывать при обновлении самого гаджета и "фона" под ним.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 10:06 pm 
Не в сети
студент

Зарегистрирован: Пн июн 30, 2014 11:23 am
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
А нельзя ли наоборот, имитировать контейнер окном топ-уровня? Субклассировать его как-нить? То есть чтобы выглядел как контейнер, но обладал регулируемой альфа-прозрачностью?

_________________
PB 5.22 x86 WinXP SP3 Opus


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 10:08 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Как вариант - создай полупрозрачное окно без рамок вместо контейнера

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 10:23 pm 
Не в сети
студент

Зарегистрирован: Пн июн 30, 2014 11:23 am
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Не уверен, что получится, но попробую, помучаюсь.

_________________
PB 5.22 x86 WinXP SP3 Opus


Последний раз редактировалось shirozaemon Чт июл 03, 2014 11:20 pm, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 10:32 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 80 раз.
Пункты репутации: 24
Вот набросал, попробуй, может поможет
Код:
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
55
56
57
58
59
60
61
62
63
Procedure MakeToolBar(Editor, ParentWindow)
  Protected width = GadgetWidth(Editor)
  Protected height = GadgetHeight(Editor)
  Protected x = GadgetX(Editor, #PB_Gadget_ScreenCoordinate)
  Protected y = GadgetY(Editor, #PB_Gadget_ScreenCoordinate)
 
  Protected w = OpenWindow(#PB_Any, x, y + height - 30, width, 30, "", #PB_Window_BorderLess, WindowID(ParentWindow))
 
  SetWindowLongPtr_(WindowID(w),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(w),#GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(w), 0, (255 * 70) / 100, #LWA_ALPHA) ;ТУТ ПОДКОРРЕКТИРУЙ ВТОРОЕ ЧИСЛО В СКОБКАХ
 
  ;================ Кнопки ==================
  ButtonGadget(10, 5, 5, 40, 25, "Undo")
  ButtonGadget(11, 50, 5, 40, 25, "Redo")
 
  ButtonGadget(12, 95, 5, 40, 25, "Cut")
  ButtonGadget(13, 140, 5, 40, 25, "Copy")
  ButtonGadget(14, 185, 5, 40, 25, "Paste")
 
  ProcedureReturn w
EndProcedure
 
Procedure MoveToolBar(ToolBar, Editor)
  If IsWindow(ToolBar)
    Protected width = GadgetWidth(Editor)
    Protected height = GadgetHeight(Editor)
    Protected x = GadgetX(Editor, #PB_Gadget_ScreenCoordinate)
    Protected y = GadgetY(Editor, #PB_Gadget_ScreenCoordinate)
    ResizeWindow(ToolBar, x, y + height - 30, width, 30)
  EndIf
EndProcedure
 
OpenWindow(1, 5, 5, 400, 400, "Editor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
EditorGadget(1, 5, 5, 390, 390, #PB_Editor_WordWrap)
ToolBarWindow = MakeToolBar(1, 1)
 
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_MoveWindow
      MoveToolBar(ToolBarWindow, 1)
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 10
          SendMessage_(GadgetID(1), #EM_UNDO, 0, 0)
          SetActiveGadget(1)
        Case 11
          SendMessage_(GadgetID(1), #EM_REDO, 0, 0)
          SetActiveGadget(1)
        Case 12
          SendMessage_(GadgetID(1), #WM_CUT, 0, 0)
          SetActiveGadget(1)
        Case 13
          SendMessage_(GadgetID(1), #WM_COPY, 0, 0)
          SetActiveGadget(1)
        Case 14
          SendMessage_(GadgetID(1), #WM_PASTE, 0, 0)
          SetActiveGadget(1)
      EndSelect
  EndSelect
  Delay(1)
ForEver


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Вт июл 01, 2014 10:37 pm 
Не в сети
студент

Зарегистрирован: Пн июн 30, 2014 11:23 am
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вау! спасибо огромное! классно выглядит, и даже за movewindow бегает! ну всё, ушел изучать скрипт :D

_________________
PB 5.22 x86 WinXP SP3 Opus


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Полупрозрачный ContainerGadget?
СообщениеДобавлено: Ср июл 02, 2014 10:37 am 
Не в сети
студент

Зарегистрирован: Пн июн 30, 2014 11:23 am
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Никита Однороб,

еще раз спасибо за код. Оставался единственный недочет — при перемещении формы "окно-контейнер" догоняло свою форму только после отпускания кнопки мыши. Вчера уже поздно было экспериментировать, подумал только, что надо забиндить MoveWindow. Сегодня проверил — точно, теперь сидит на форме как прибитое, когда ее по экрану таскаешь.

Кстати, насколько я понял из дискуссий на оффоруме, с грядущей 5.3 биндить #PB_Event_MoveWindow и #PB_Event_SizeWindow на колбэк через BindEvent будет единственным допустимым способом отлова этих событий. Собственно, наш с вами случай доказывает целесообразность такого нововведения.

Плюс такой момент — если у вас достаточно сложная структура гэджетов, удобно использовать функцию PB UseGadgetList() для инициализации гэджетов "окна-контейнера" (прямо в процедуре его вызова). Описание этой функции с четким примером есть в хелпе к PB.

Код:
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
55
56
57
58
59
60
61
62
63
64
65
66
Procedure MakeToolBar(Editor, ParentWindow)
  Protected width = GadgetWidth(Editor)
  Protected height = GadgetHeight(Editor)
  Protected x = GadgetX(Editor, #PB_Gadget_ScreenCoordinate)
  Protected y = GadgetY(Editor, #PB_Gadget_ScreenCoordinate)
 
  Protected w = OpenWindow(2, x, y + height - 50, width, 50, "", #PB_Window_BorderLess, WindowID(ParentWindow))
 
  SetWindowLongPtr_(WindowID(2),#GWL_EXSTYLE,GetWindowLongPtr_(WindowID(2),#GWL_EXSTYLE) | #WS_EX_LAYERED)
  SetLayeredWindowAttributes_(WindowID(2), 0, (255 * 70) / 100, #LWA_ALPHA) ;ТУТ ПОДКОРРЕКТИРУЙ ВТОРОЕ ЧИСЛО В СКОБКАХ
 
  ;================ Кнопки ==================
  ButtonGadget(10, 5, 5, 40, 25, "Undo")
  ButtonGadget(11, 50, 5, 40, 25, "Redo")
 
  ButtonGadget(12, 95, 5, 40, 25, "Cut")
  ButtonGadget(13, 140, 5, 40, 25, "Copy")
  ButtonGadget(14, 185, 5, 40, 25, "Paste")
  ButtonGadget(15, 230,5,40,25, "Kudos")
 
  ProcedureReturn w
EndProcedure
 
Procedure MoveToolBar()
 
    Protected width = GadgetWidth(1)
    Protected height = GadgetHeight(1)
    Protected x = GadgetX(1, #PB_Gadget_ScreenCoordinate)
    Protected y = GadgetY(1, #PB_Gadget_ScreenCoordinate)
    ResizeWindow(2, x, y + height - 50, width, 50)
 
EndProcedure
 
OpenWindow(1, 5, 5, 400, 400, "Editor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
BindEvent(#PB_Event_MoveWindow, @MoveToolBar())
EditorGadget(1, 5, 5, 390, 390, #PB_Editor_WordWrap)
ToolBarWindow = MakeToolBar(1, 1)
 
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
;     Case #PB_Event_MoveWindow         ; УСТАРЕВШИЙ ОТЛОВ СОБЫТИЯ
;       MoveToolBar(2, 1)
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 10
          SendMessage_(GadgetID(1), #EM_UNDO, 0, 0)
          SetActiveGadget(1)
        Case 11
          SendMessage_(GadgetID(1), #EM_REDO, 0, 0)
          SetActiveGadget(1)
        Case 12
          SendMessage_(GadgetID(1), #WM_CUT, 0, 0)
          SetActiveGadget(1)
        Case 13
          SendMessage_(GadgetID(1), #WM_COPY, 0, 0)
          SetActiveGadget(1)
        Case 14
          SendMessage_(GadgetID(1), #WM_PASTE, 0, 0)
          SetActiveGadget(1)
        Case 15
          AddGadgetItem(1,-1,"Purebasic.info rulez!")
      EndSelect
  EndSelect
ForEver



P.S. Добавляю к названию темы тэг "Решено"

_________________
PB 5.22 x86 WinXP SP3 Opus


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

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


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

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


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

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