PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Создатель программ


Создатель программ

Сообщений 1 страница 30 из 103

1

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

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 295, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(1, 15, 10, 100, 25, "Создать кнопку")
      ButtonGadget(2, 130, 10, 105, 25, "Удалить кнопку")
      StringGadget(3, 240, 15, 35, 20, "")
      
      Count=0
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
   If Event=#PB_Event_Gadget
    If Gadget=1
      Count+1
      ButtonGadget(#PB_Any,100, 100, 75,25, "Кнопка № "+Str(Count))
    EndIf
   EndIf   
  
Until Event = #PB_Event_CloseWindow

End

0

2

Вот пример перетаскивания кнопки с именем "Создать кнопку"

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 295, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(1, 15, 10, 100, 25, "Создать кнопку")
      ButtonGadget(2, 130, 10, 105, 25, "Удалить кнопку")
      StringGadget(3, 240, 15, 35, 20, "")
      
      Count=0
      
    EndIf
  EndIf
EndProcedure


Procedure IsMouseOver(wnd) ; Определяем находится ли курсор мышки в пределах данного окна (гаджета)
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
Result = PtInRect_(re,pt\x|( pt\y<<32)) 
ProcedureReturn Result 
EndProcedure 

Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
;    If Event=#PB_Event_Gadget
;     If Gadget=1
;       Count+1
;       ButtonGadget(#PB_Any,100, 100, 75,25, "Кнопка № "+Str(Count))
;     EndIf
;    EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
     If IsMouseOver(GadgetID(1)) ; Курсор мышки на кнопкой с идентификатором 1
       ResizeGadget(1, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, #PB_Ignore, #PB_Ignore)
     EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

0

3

хм..интересное решение, респект. А вот распознается Курсор мышки на кнопкой с идентификатором 1, можно не зная какую кнопку будет передвигать пользователь узнать ее? То есть если в данном коде

Код:
 If IsMouseOver(GadgetID(1)) ; Курсор мышки на кнопкой с идентификатором 1
       ResizeGadget(1, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, #PB_Ignore, #PB_Ignore)
     EndIf

неизвестны значения идентификатора кнопки, можно как нибудь определить их. Мне на ум приходит только одно: сделать что то типа активности кнопки и из этого отталкиваться: брать тот идентификатор кнопка которой активна. Тут условия не прокатят, так как колличество гаджетов может быть очень большим.

0

4

Ну можно просто проверять чтобы код курсобор было что-то (какие-то гаджеты), а не главное окно и передвигать их.

Примерно так

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 295, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(1, 15, 10, 100, 25, "Создать кнопку")
      ButtonGadget(2, 130, 10, 105, 25, "Удалить кнопку")
      StringGadget(3, 240, 15, 35, 20, "")
      
      Count=0
      
    EndIf
  EndIf
EndProcedure



Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
    If Event=#PB_Event_Gadget
     If Gadget=1
       Count+1
       ButtonGadget(#PB_Any,100, 100, 75,25, "Кнопка № "+Str(Count))
     EndIf
    EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
       GetCursorPos_(Cursor.POINT) ; Позиция курсора на экране
       Wnd = WindowFromPoint_(Cursor\X|(Cursor\Y<<32))    ; Хендл окна под курсором
       If Wnd<>WindowID(#Window_0)
         GetWindowRect_(Wnd,re.RECT) ; Размеры окна (гаджета)
         MoveWindow_(Wnd, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, re\right-re\left, re\bottom-re\top,1)
       EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

0

5

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

0

6

Для этого нужно сохранять идентификаторы кнопок в массиве или, что лучше, в динамичесик связанном списке и прежде чем перетаскивать кнопку, проведять чтобы идентификатор был в этом списке.

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration


Global NewList MyButton() ; Динамически связанный список


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 295, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(1, 15, 10, 100, 25, "Создать кнопку")
      ButtonGadget(2, 130, 10, 105, 25, "Удалить кнопку")
      StringGadget(3, 240, 15, 35, 20, "")
      
      Count=0
      
    EndIf
  EndIf
EndProcedure


Procedure IsMouseOver(wnd) ; Определяем находится ли курсор мышки в пределах данного окна (гаджета)
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
Result = PtInRect_(re,pt\x|( pt\y<<32)) 
ProcedureReturn Result 
EndProcedure 

Procedure TestButton()
 ForEach MyButton() ; В цикле сканирется динамически связанный список
   Gadget=MyButton() 
   If IsMouseOver(GadgetID(Gadget))
     ProcedureReturn Gadget
   EndIf
 Next
ProcedureReturn -1
EndProcedure



Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
   If Event=#PB_Event_Gadget
    If Gadget=1
      Count+1
      AddElement(MyButton())
      MyButton()=ButtonGadget(#PB_Any,100, 100, 75,25, "Кнопка № "+Str(Count))
    EndIf
   EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
     Gadget=TestButton()
     If Gadget>-1 
       ResizeGadget(Gadget, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, #PB_Ignore, #PB_Ignore)
     EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

0

7

O, вот и простой практический пример на динамически связанные списки !

0

8

А какие имена присваиваются только что созданным кнопкам, ведь чтоб их удалять нужно знать идентификатор, то есть имя

0

9

daiomik написал(а):

А какие имена присваиваются только что созданным кнопкам, ведь чтоб их удалять нужно знать идентификатор, то есть имя

Идентификаторы созданых кнопок хранятся в динамически связанном списке.
Вот там их и нужно искать.

Вот что показывает отладчик

http://s003.radikal.ru/i201/1002/f1/02eb3c0c1c92.png

0

10

А если заранее предположить, что будет например 10 кнопок и дать  всем по порядку в списке имена, будем знать какую кнопку удалить ?

0

11

В том-то и дело, что количество кнопок зарание неизвестно! Поэтому и был использован динамический список, ведь он безразмерный, ну до тех пор пока память компа не закончится.
Если число кнопок нам известно, то логичнее использовать массив.

0

12

A как будет выглядеть код через массив например на 10 кнопок?

0

13

mirashic написал(а):

A как будет выглядеть код через массив например на 10 кнопок?

Вот так

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration


Global Dim MyButton.l(10)


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 295, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(1, 15, 10, 100, 25, "Создать кнопку")
      ButtonGadget(2, 130, 10, 105, 25, "Удалить кнопку")
      StringGadget(3, 240, 15, 35, 20, "")
      
      Count=0
      
    EndIf
  EndIf
EndProcedure


Procedure IsMouseOver(wnd) ; Определяем находится ли курсор мышки в пределах данного окна (гаджета)
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
Result = PtInRect_(re,pt\x|( pt\y<<32)) 
ProcedureReturn Result 
EndProcedure 

Procedure TestButton()
 For i=1 To 10 ; В цикле сканирется динамически связанный список
   Gadget=MyButton(i) 
   If IsGadget(Gadget) And IsMouseOver(GadgetID(Gadget))
     ProcedureReturn Gadget
   EndIf
 Next
ProcedureReturn -1
EndProcedure



Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
   If Event=#PB_Event_Gadget
    If Gadget=1
      Count+1
      If Count<=10
        MyButton(Count)=ButtonGadget(#PB_Any,100, 100, 75,25, "Кнопка № "+Str(Count))
      Else
        MessageRequester("", "Нет свободного места в массиве", #MB_OK|#MB_ICONWARNING)
      EndIf
    EndIf
   EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
     Gadget=TestButton()
     If Gadget>-1 
       ResizeGadget(Gadget, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, #PB_Ignore, #PB_Ignore)
     EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

0

14

Спасибо !

0

15

Пётр написал(а):

Идентификаторы созданых кнопок хранятся в динамически связанном списке.Вот там их и нужно искать.

то есть для только что созданной кнопки 1 ее имя =9890480?

0

16

Это её идентификатор.
Поскольку при создании кнопки её идентификатор не был задан явно, а в место него использована константа #PB_Any, то он ганарируется автоматически.
9890480 это и есть автоматически сгенерированый идентификатор.

0

17

ясно, спасибо. А как открыть этот просмотрщик переменных для созданный кнопок, как у тебя на скрине?

0

18

Когда прога запущена, в меню "Отладчик", выбери "Просмотр переменных".

А чтобы посмотреть какие гаджеты, рисунки и т. д. существуют, нужно в меню "Отладчик" выбрать "Просмотр библиотек".

0

19

Пётр написал(а):

то он ганарируется автоматически. 9890480 это и есть автоматически сгенерированый идентификатор.

Но надо учитывать, что на разных компьютерах он разный или это от версии PureBasic зависит.
И использовать его для удаления кнопок только в конкретном случае ?

0

20

A как удалить ?
Удаляется элемент списка, а не сам гаджет ?

Код:
   If Gadget=2
      DeleteElement(MyButton() , 9890480) 
   EndIf

0

21

Хм.. ну тогда бредово получается. Програмно пользователь же не знает идентификаторы созданных кнопок и поэтому удалит их не сможет. Нужно что то совершенное придумать или автоматизировать процесс. Я правильно понимаю?

Отредактировано daiomik (04.02.2010 23:07:04)

0

22

mirashic написал(а):

Удаляется элемент списка, а не сам гаджет ?

Удалять надо так

Код:
 ForEach MyButton() ; В цикле сканирется динамически связанный список
   Gadget=MyButton() 
   If Gadget=9890480
     DeleteElement(MyButton() )
     FreeGadget(Gadget)
     Break
   EndIf
 Next

Это DeleteElement(MyButton() , 9890480) работать не будет!

0

23

Да у меня на одной системе 1я кнопка всегда имеет номер 3813192
а на другой системе, 1я -  9890480
При отладки в программе PureBasic  работает удаление, а  в готовом exe файле нет.

0

24

mirashic написал(а):

Да у меня на одной системе 1я кнопка всегда имеет номер 3813192
а на другой системе, 1я -  9890480
При отладки в программе PureBasic  работает удаление, а  в готовом exe файле нет

Идентификаторы генерируются в случайном порядке, поэтому нужно точно знать что удалять!
Вот пример удаления через контекстное меню, вызываемое при клике по кнопке.

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration

Structure MyButton
  Gadget.l
  GadgetID.l
EndStructure

Global NewList MyButton.MyButton() ; Динамически связанный список


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 295, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(1, 15, 10, 100, 25, "Создать кнопку")
      ;ButtonGadget(2, 130, 10, 105, 25, "Удалить кнопку")
      StringGadget(3, 240, 15, 35, 20, "")
      
      Count=0
      
    EndIf
  EndIf
EndProcedure


Procedure IsMouseOver(wnd) ; Определяем находится ли курсор мышки в пределах данного окна (гаджета)
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
Result = PtInRect_(re,pt\x|( pt\y<<32)) 
ProcedureReturn Result 
EndProcedure 

Procedure TestButton()
 ForEach MyButton() ; В цикле сканирется динамически связанный список
   If IsMouseOver(MyButton()\GadgetID)
     ProcedureReturn MyButton()\Gadget
   EndIf
 Next
ProcedureReturn -1
EndProcedure

If CreatePopupMenu(1)
  MenuItem(1,"Удалить")
EndIf

ActiveDelButton=-1
Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
   If Event=#PB_Event_Gadget
    If Gadget=1
      Count+1
      AddElement(MyButton())
      MyButton()\Gadget=ButtonGadget(#PB_Any,100, 100, 75,25, "Кнопка № "+Str(Count))
      MyButton()\GadgetID=GadgetID(MyButton()\Gadget)
    EndIf
   EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
     Gadget=TestButton()
     If Gadget>-1 
       ResizeGadget(Gadget, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, #PB_Ignore, #PB_Ignore)
     EndIf
   EndIf
   
   If Event=#WM_RBUTTONUP ; Нажата правая кнопка мышки
     GetCursorPos_(Cursor.POINT) ; Позиция курсора на экране
     Wnd = WindowFromPoint_(Cursor\X|(Cursor\Y<<32))    ; Хендл окна под курсором
     ActiveDelButton=-1
     ForEach MyButton()
       If MyButton()\GadgetID=Wnd
         ActiveDelButton=MyButton()\Gadget
         DisplayPopupMenu(1,WindowID(#Window_0))
         Break
       EndIf
     Next
   EndIf
   
   If Event=#PB_Event_Menu
     If EventMenu()=1
       If ActiveDelButton>-1 And IsGadget(ActiveDelButton)
           ForEach MyButton() ; В цикле сканирется динамически связанный список 
             If MyButton()\Gadget=ActiveDelButton
               DeleteElement(MyButton())
               FreeGadget(ActiveDelButton)
               Break
             EndIf
           Next
         ActiveDelButton=-1
       EndIf
     EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

0

25

Спасибо отличный пример, теперь разобраться и правильно применить к избранным ссылкам.

0

26

очень интересный пример. А такой вопрос: если я хочу например добавлять (создавать) не только кнопки, но и Label, то мне их в этот же список заносить или отдельный создавать??

0

27

В этот же список

0

28

Вот попытался добавить создание текстового поля и Label, первое добавилось, но с какими-то багами при перемещении и удалении. Там же появляется стандартное контекстное меню, а если создавать Label, то вообще появляется ошибка. Посмотри пожалуйста. Пардон, код забыл:

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration

Structure MyButton
  Gadget.l
  GadgetID.l
EndStructure

Global NewList MyButton.MyButton() ; Динамически связанный список


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 450, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
     
      Frame3DGadget(1, 5, 0, 100, 290, "Гаджеты")
      ButtonGadget(2, 15, 15, 75, 25, "Кнопка")
      ButtonGadget(3, 15, 45, 75, 25, "Текст")
      ButtonGadget(4, 15, 75, 75, 25, "Надпись")
     
      
      
      Count=0
      
    EndIf
  EndIf
EndProcedure


Procedure IsMouseOver(wnd) ; Определяем находится ли курсор мышки в пределах данного окна (гаджета)
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
Result = PtInRect_(re,pt\x|( pt\y<<32)) 
ProcedureReturn Result 
EndProcedure 

Procedure TestButton()
 ForEach MyButton() ; В цикле сканирется динамически связанный список
   If IsMouseOver(MyButton()\GadgetID)
     ProcedureReturn MyButton()\Gadget
   EndIf
 Next
ProcedureReturn -1
EndProcedure

If CreatePopupMenu(1)
  MenuItem(1,"Удалить")
EndIf

ActiveDelButton=-1
Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
   If Event=#PB_Event_Gadget
    If Gadget=2
      Count+1
      AddElement(MyButton())
      MyButton()\Gadget=ButtonGadget(#PB_Any,150, 100, 75,25, "Кнопка № "+Str(Count))
      MyButton()\GadgetID=GadgetID(MyButton()\Gadget)
     Else
       Gadget=2 
      Count+1
      AddElement(MyButton())
      MyButton()\Gadget=StringGadget(#PB_Any,150, 100, 75,25, "Текст № "+Str(Count))
      MyButton()\GadgetID=GadgetID(MyButton()\Gadget)
     EndIf
   EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
     Gadget=TestButton()
     If Gadget>-1 
       ResizeGadget(Gadget, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-10, #PB_Ignore, #PB_Ignore)
     EndIf
   EndIf
   
   If Event=#WM_RBUTTONUP ; Нажата правая кнопка мышки
     GetCursorPos_(Cursor.POINT) ; Позиция курсора на экране
     Wnd = WindowFromPoint_(Cursor\X|(Cursor\Y<<32))    ; Хендл окна под курсором
     ActiveDelButton=-1
     ForEach MyButton()
       If MyButton()\GadgetID=Wnd
         ActiveDelButton=MyButton()\Gadget
         DisplayPopupMenu(1,WindowID(#Window_0))
         Break
       EndIf
     Next
   EndIf
   
   If Event=#PB_Event_Menu
     If EventMenu()=1
       If ActiveDelButton>-1 And IsGadget(ActiveDelButton)
           ForEach MyButton() ; В цикле сканирется динамически связанный список 
             If MyButton()\Gadget=ActiveDelButton
               DeleteElement(MyButton())
               FreeGadget(ActiveDelButton)
               Break
             EndIf
           Next
         ActiveDelButton=-1
       EndIf
     EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

Отредактировано daiomik (05.02.2010 13:38:46)

0

29

В проге был не совсем правильно организован обработчик событий от кнопок создания.
Немного исправил, правда сейчас нельзя удалять текстовые надписи, т. к. API функция WindowFromPoint вместо их хендлов, возвращает хендл окна!  :question:

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #String_0
EndEnumeration

Structure MyButton
  Gadget.l
  GadgetID.l
EndStructure

Global NewList MyButton.MyButton() ; Динамически связанный список


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 294, 51, 450, 314, "Создать программу",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
     
      Frame3DGadget(1, 5, 0, 100, 290, "Гаджеты")
      ButtonGadget(2, 15, 15, 75, 25, "Кнопка")
      ButtonGadget(3, 15, 45, 75, 25, "Текст")
      ButtonGadget(4, 15, 75, 75, 25, "Надпись")
     
      
      
      Count=0
      
    EndIf
  EndIf
EndProcedure


Procedure IsMouseOver(wnd) ; Определяем находится ли курсор мышки в пределах данного окна (гаджета)
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
Result = PtInRect_(re,pt\x|( pt\y<<32)) 
ProcedureReturn Result 
EndProcedure 

Procedure TestButton()
 ForEach MyButton() ; В цикле сканирется динамически связанный список
   If IsMouseOver(MyButton()\GadgetID)
     ProcedureReturn MyButton()\Gadget
   EndIf
 Next
ProcedureReturn -1
EndProcedure

If CreatePopupMenu(1)
  MenuItem(1,"Удалить")
EndIf



ActiveDelButton=-1
Open_Window_0()
Repeat
  Event  = WaitWindowEvent()
  Gadget=EventGadget()
   If Event=#PB_Event_Gadget
    If Gadget=2
      Count+1
      AddElement(MyButton())
      MyButton()\Gadget=ButtonGadget(#PB_Any,150, 100, 75,25, "Кнопка № "+Str(Count))
      MyButton()\GadgetID=GadgetID(MyButton()\Gadget)
      
    ElseIf Gadget=3  
      Count+1
      AddElement(MyButton())
      MyButton()\Gadget=TextGadget(#PB_Any,150, 100, 75,16, "Текст № "+Str(Count) )
      MyButton()\GadgetID=GadgetID(MyButton()\Gadget)
      
    ElseIf Gadget=4  
      Count+1
      AddElement(MyButton())
      MyButton()\Gadget=StringGadget(#PB_Any,150, 100, 75,25, "Текст № "+Str(Count))
      MyButton()\GadgetID=GadgetID(MyButton()\Gadget)
    EndIf
   EndIf   

   If GetAsyncKeyState_(#VK_LBUTTON) ; Нажата левая кнопка мышки
     Gadget=TestButton()
     If Gadget>-1 
       ResizeGadget(Gadget, WindowMouseX(#Window_0)-20,  WindowMouseY(#Window_0)-8, #PB_Ignore, #PB_Ignore)
     EndIf
   EndIf
   
   If Event=#WM_RBUTTONDOWN ; Нажата правая кнопка мышки
     GetCursorPos_(Cursor.POINT) ; Позиция курсора на экране
     Wnd = WindowFromPoint_(Cursor\X|(Cursor\Y<<32))    ; Хендл окна под курсором
     ActiveDelButton=-1
     ForEach MyButton()
       If MyButton()\GadgetID=Wnd
         ActiveDelButton=MyButton()\Gadget
         DisplayPopupMenu(1,WindowID(#Window_0))
         Break
       EndIf
     Next
   EndIf
   
   If Event=#PB_Event_Menu
     If EventMenu()=1
       If ActiveDelButton>-1 And IsGadget(ActiveDelButton)
           ForEach MyButton() ; В цикле сканирется динамически связанный список 
             If MyButton()\Gadget=ActiveDelButton
               DeleteElement(MyButton())
               FreeGadget(ActiveDelButton)
               Break
             EndIf
           Next
         ActiveDelButton=-1
       EndIf
     EndIf
   EndIf
     
  
Until Event = #PB_Event_CloseWindow

End

0

30

интересно получилось. То есть, что бы создать хоть малейшее подобие конструктора программ, с минимальным набором функций, типа созданием кнопок, надписей, текстов, таблиц,панелей,галочек,точек, а также изменение програмно их свойств и прикрепление к общей программе компилятора нужно использовать выше описанные примеры, или следовать какого то другово пути. Может отдельно создать для каждого гаджета что то типа dll-ки,где будут все их свойства, а потом при создании этого гаджета просто вызывать эту dll? Или это неправильный способ. Может посоветуешь каким путем идти и с чего начять, чтобы создать максимально упрощенный конструктр программ.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Создатель программ