PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Диалоговое окно


Диалоговое окно

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

1

Решил значит создать диалоговое окно в процедуре(функции)ну типа шрифт выбирать смотреть что выбрал.
И тут бах не понял ,почему по окончании этой процедуры с закрытием окна вся программа завершается?я как бы процедуру с дополнительным окном типа диалога завершал.
Это ошибка или что?

Код:

Procedure.i Test_metrika()
Protected window_hwnd.i
Protected canvas_hwnd.i




 window_hwnd=OpenWindow(#PB_Any, 0, 0, 600, 600, "Выбор шрифта",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
 canvas_hwnd=CanvasGadget(#PB_Any,300,200,300,300)
 
 
 
Repeat
 Select WaitWindowEvent()
  Case #PB_Event_CloseWindow
     
    ;DestroyWindow_(canvas_hwnd)
    ;DestroyWindow_(window_hwnd)
    Break
  
EndSelect
ForEver
ProcedureReturn 
EndProcedure

OpenWindow(0, 0, 0, 800, 400, "Testhrift",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)


Test_metrika()


Repeat
Event = WaitWindowEvent()
 
Until Event = #PB_Event_CloseWindow

0

2

И ещё не понятно в чём различие такое в функциях api CloseWindow_() и пурика CloseWindow(),первая всю программу закрывает а вторая только  своё окно,как так?

Код:

Procedure.i Test_metrika()
Protected window_hwnd.i
Protected canvas_hwnd.i

 window_hwnd=OpenWindow(#PB_Any, 0, 0, 600, 600, "Выбор шрифта",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
 canvas_hwnd=CanvasGadget(#PB_Any,300,200,300,300)
 
Repeat
 Select WaitWindowEvent()
  Case #PB_Event_CloseWindow
    CloseWindow(window_hwnd)
    ;CloseWindow_(window_hwnd)
    ;DestroyWindow_(canvas_hwnd)
    ;DestroyWindow_(window_hwnd)
    Break
  
EndSelect
ForEver
ProcedureReturn 
EndProcedure

OpenWindow(0, 0, 0, 800, 400, "Testhrift",#PB_Window_SystemMenu| #PB_Window_SizeGadget | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)


Test_metrika()


Repeat
Event = WaitWindowEvent()
 
Until Event = #PB_Event_CloseWindow

Отредактировано Sergeihik (26.04.2022 17:45:46)

0

3

Обработчик событий должен быть один (общий для всех окон).
Функция EventWindow() позволяет узнать в каком окне произошло событие.

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

в чём различие такое в функциях api CloseWindow_() и пурика CloseWindow()

Не стоит окна PB закрывать через WinAPI.

0

4

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

Обработчик событий должен быть один (общий для всех окон).
Функция EventWindow() позволяет узнать в каком окне произошло событие.

Не стоит окна PB закрывать через WinAPI.

Так а как же классы api создаются?что прям у всех классов один обработчик и в нём типа все окно определять с принадлежностью?
Вопрос вот возник а как можно скомпилить процедуру в длл что бы она не публичной была и не отображалась в прасмоторщиках dll?

0

5

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

не понятно в чём различие такое в функциях api CloseWindow_() и пурика CloseWindow()

Я думаю PureBasic хранит информацию о всех созданных элементах (внутренние идентификаторы окон, гаджетов, рисунков) в виде списка, и каждый список отдельный со своей нумерацией. Если программа закрывается, то PureBasic по возможности освободит ресурсы, закрыв все элементы созданные программой, точнее элементы имеющие внутренний идентификатор. Функция CloseWindow() закрывает окно и освобождает идентификатор в списке. Если использовать CloseWindow_(), то PureBasic не освободит идентификатор в списке и будет продолжает его обслуживать, думая что окно существует. Возможно это не критично, так как при попытке закрыть окно PureBasic скорее всего воспользуется функцией CloseWindow_(), а она просто выдаст ошибку в пустоту и ничего страшного. Но проблема если PureBasic например перерисовывает окно или ещё что-либо, что может вызывать сбои, который не известно чем могут закончится. Вот поэтому и не желательно ставить PureBasic в неловкое положение.

0

6

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

Вопрос вот возник а как можно скомпилить процедуру в длл что бы она не публичной была и не отображалась в прасмоторщиках dll?

Именно скомпилировать? Да, наверное, никак. Если вы хотите скомпилировать длл, то компилятор это сделает самым обычным образом. Все процедуры или функции будут вполне себе публичные))) Да собственно, для этого дллки обычно и пишутся. Ещё и мануалы рисуют и раздают с описанием как всем этим пользоваться  8-)
Вы напишите более детально что вы хотите, для чего это нужно (от кого скрыть) и где будете использовать эту длл. Может что-то можно будет посоветовать.

0

7

Ну с индификаторами та да понятно.так и подумал

А вот приватные процедуры в dll вполне себе встречаются.
И нужно допустим обработчик сделать как приватный,зачем он пользователю публичный?
Если только типа как у sсintilly в нем описать
вызов процедур или участок исполняемого кода
Или это такая процедура которая много раз в коде
встречается в других процедурах но она не для
публичного использования так как не имеет ни какого смысла.

Отредактировано Sergeihik (28.04.2022 08:55:35)

0

8

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

Вопрос вот возник а как можно скомпилить процедуру в длл что бы она не публичной была и не отображалась в прасмоторщиках dll?

Скомпилируйте код и найдите процедуру в dll.

Код:
Procedure Test()
EndProcedure

0

9

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

Procedure Test()
EndProcedure

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

Скомпилируйте код и найдите процедуру в dll.

В принципе да работает,получается если нет в названии dll то процедура тоже компилится но как приватная.
Ps: вот ещё вопросик,есть константа #PB_2DDrawing_Transparent а с #OPAQUE у меня нет.это только у меня в ранней версии?
и можно ли тогда сделать так DrawingMode(2)?
и вопросик если константа (PB_Any) hwnd=ButtonGadget(#PB_Any,0,0,55,15,"") то тоже окно разрушать не надо и оно само пуриком удалится,как бы hwnd=id будет?

Отредактировано Sergeihik (28.04.2022 15:18:32)

0

10

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

hwnd=id будет?

на сколько я знаю нет. Если использовать id, то возвращает hwnd, а если использовать #PB_Any, то возвращает id. Но возврат hwnd не документировано, в справке указано что возвращает результат успешного выполнения, фактически hwnd не может быть нулём и поэтому используется как флаг успешности. Вообще #PB_Any удобен для модуля, так как неизвестно кем будет использован модуль и имеются ли занятые id, поэтому он генерируется. А программе удобнее указывать кнопки через "перечисление" с именными константами.

Отредактировано AZJIO (28.04.2022 16:44:44)

0

11

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

как бы hwnd=id будет?

https://www.purebasic.com/documentation … ndles.html

0

12

если гаджету давать просто номер, то гаджет возвращает gadgetId
если гаджету давать #pb_any, то гаджет возвращает номер и потом нужно gadgetId использовать
это нередко в примерах встречается\используется
с недавних пор пользуюсь этой особонностью, в структуре оба числа для каждого гаджета хранятся
оказалось очень удобно
это не документировано, но судя по примерам, это работает с первых версий

0

13

Да я так и понял что с #PB_Any возвращает сгенерированный id.,для диалогового окна думаю удобно так как не будет конфликтов с ранее уже созданными гаджетами.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Диалоговое окно