[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2023-01-25 16:21), всего редактировалось 43 раз(а)

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53660на счёт WS_POPUP ждём
Возможно, я не правильно понял задачу, ну как-то так

Дополнительная информация

Declare WinHelp()
#WS_POPUP = $80000000
Global hGUI = OpenWindow(99, 100, 200, 440, 130, "Родительское", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
If hGUI
  ButtonGadget(5, 300, 77, 27, 32, "?")
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case 5 ; ?
          WinHelp()
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
End
Procedure WinHelp()
  DisableWindow(99, #True)
  Protected Event
  hGUI2 = OpenWindow(98, 100, 200, 620, 420, "Справка", #PB_Window_SystemMenu | #WS_POPUP)
  EditorGadget(0, 5, 5, 610, 410)
  SetGadgetText(0, "текст справки")
  SetGadgetState(0, 0)
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  CloseWindow(98)
  DisableWindow(99, #False)
  SetActiveWindow(99)
EndProcedure

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
nikzzzz, Что даёт константа #WS_POPUP , по моему ничего...
в пьюрике есть уже функция для создания дочернего окна...
Нужно просто указать его, WindowID(99)
Сравни значек в панели задач...
Зачем создавать два цикла обработки событий?
Работает, но по мне как то... и в основном цикле, всё прекрасно обрабатывается...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
53688Что даёт константа #WS_POPUP , по моему ничего..
Не знаю, я просто взял пример от AZJIO.
53688
в пьюрике есть уже функция для создания дочернего окна...
Нужно просто указать его, WindowID(99)
Приведи пример, я просто написал аналог дочернего окна на Autoit, возможно не правильно понял задачу.
53688Зачем создавать два цикла обработки событий?
Для удобства, каждое окно на свою задачу.
Вообще-то это пример от AZJIO, я всего лишь сделал "дочернее" окно из его кода.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53689Не знаю, я просто взял пример от AZJIO.
Константа абсолютно ничего не дает.
53689Приведи пример, я просто написал аналог дочернего окна на Autoit, возможно не правильно понял задачу.

Дополнительная информация

Declare WinHelp()
;#WS_POPUP = $80000000
Global hGUI = OpenWindow(99, 100, 200, 440, 130, "Родительское", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
If hGUI
  ButtonGadget(5, 300, 77, 27, 32, "?")
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case 5 ; ?
          WinHelp()
      EndSelect
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
End
Procedure WinHelp()
  DisableWindow(99, #True)
  Protected Event
  hGUI2 = OpenWindow(98, 100, 200, 620, 420, "Справка", #PB_Window_SystemMenu, WindowID(99)); | #WS_POPUP
  EditorGadget(0, 5, 5, 610, 410)
  SetGadgetText(0, "текст справки")
  SetGadgetState(0, 0)
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
  CloseWindow(98)
  DisableWindow(99, #False)
  SetActiveWindow(99)
EndProcedure
Сравнить можно по виду иконки в панели задач...
При использовании константы, она сдвоенная (и без константы тоже), если использовать предложенный мною вариант (стандартный), она одна (как и должно быть у дочернего окна)
53689Для удобства, каждое окно на свою задачу.
Сомнительно это, но работает...
У цикла нет привязки к конкретному окну, но есть приоритет... По мне, так это костыль.
Разблокируй родительское окно и нажми на крестик в нем.
При первом нажатии, закроется дочернее окно, при втором родительское...
То есть выходим в начале из второго цикла, оказываемся в первом...
Если родительское окно заблокировано, то нормально, если нет, то вариант не катит...
Что происходит с первым циклом, мне не понятно...
То ли он останавливается, то ли перезаписывается, но при выходе из второго, он возобновляет свою работу...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53690
У цикла нет привязки к конкретному окну, но есть приоритет... По мне, так это костыль.
Разблокируй родительское окно и нажми на крестик в нем.
При первом нажатии, закроется дочернее окно, при втором родительское...
Так событие-то одно, щелчок по крестику, а проанализировать, по какому окну щелкнули лень?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53690При использовании константы, она сдвоенная (и без константы тоже), если использовать предложенный мною вариант (стандартный), она одна (как и должно быть у дочернего окна)
Вот, я не правильно понял задачу, я считал, что дочернее окно должно блокировать материнское, а на иконки мне было как-то наплевать.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53691Так событие-то одно, щелчок по крестику, а проанализировать, по какому окну щелкнули лень?
Так я и говорю, что костыль...
Один цикл из примера, что я выложил на том сайте, прекрасно справляется и всё отлавливает.
Все равно нумерацию гаджетов нельзя вести раздельную (номер не должен переписывать из другого окна)
53692Вот, я не правильно понял задачу, я считал, что дочернее окно должно блокировать материнское, а на иконки мне было как-то наплевать.
Так блокируешь его же вручную, а не константой, которая ничего в данном случае не делает...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53693Так блокируешь его же вручную, а не константой, которая ничего в данном случае не делает...
Так в том то и проблема, что дочернее окно хотя и создается, но не блокирует материнское, поэтому и приходится это делать в ручную.
Возможно, есть другое решение, но я его не знаю, задача решена, пусть даже через костыль.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
53688Нужно просто указать его, WindowID(99)
Вообще указать идентификатор родителя не значит сделать его всплывающим, дочернее бывает внутри родительского плавает и не вытащишь за границу родителя или является областью родительского окна, когда визуально даже не видно никакого окна, это просто часть внутри которой создаёшь элементы и подчиняются они свойствам этого окна. Именно WS_POPUP в виндовой терминологии создаёт всплывающее дочернее окно, а к нему уже можно подвязывать другие стили, которые делают его изменяемым, сворачиваемым (над панелью задач) и т.д.
Например элемент "Вкладки" нельзя создать 2 шт в одном окне (не знаю является ли правило для винды, но для AutoIt3 точно), и чтобы сделать 2 и более нужно делать дочерние окна как часть родительского, тогда в каждом дочернем можно создать свой элемент "Вкладки", а выглядеть будет как в одном окне.
nikzzzz не указал его родителем поэтому видимо получается что они как два самостоятельных окна одного процесса. При блокировке окно не получает сообщения в очередь, поэтому при разблокировании он не будет обрабатывать никакие клики, вызванные во время блокировки.


Последний раз редактировалось: AZJIO (2018-05-11 12:04), всего редактировалось 2 раз(а)

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
53697Например элемент "Вкладки" нельзя создать 2 шт в одном окне (не знаю является ли правило для винды, но для AutoIt3 точно), и чтобы сделать 2 и более нужно делать дочерние окна как часть родительского, тогда в каждом дочернем можно создать свой элемент "Вкладки", а выглядеть будет как в одном окне.
Пьюр бейсик может...
Видел пример...
Нужно создать, гаджет-контейнер, а в нем объекты...
Так хоть два статус бара, меню бара или разные вкладки, не проблема, да хоть три...

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
53699Нужно создать, гаджет-контейнер
ну это в терминологии винды является дочерним окном. Вообще как ранее мы обсуждали элементы окна являются тоже окнами.
Грубо говоря мы оперируем теми же ресурсами винды но в видении/терминологии другого автора. А при тесте пытаемся разгадать как автор интерпретатра кода создал механизмы работы. Например в AutoIt3 при создании окон есть стили по умолчанию и принудительные стили. Принудительные не убираются совсем, умолчальные заменяются в момент указания своих стилей и чтобы они не убирались их нужно доавить как +DefaultStyle (грубо говоря, название конечно другое).
Если смотреть гипотетически, то добавляя ID родителя, ты делаешь дочерним окно, а добавляя #PB_Window_SystemMenu ты делаешь его явно отдельно от родительского окна, вот он сам и добавляет остальные стили угадывая намерения.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Динамический вывод лога в окно.
Import "user32.lib"
  OemToCharBuffA(*Buff,*Buff1,SizeBuff)
EndImport
Procedure.s ReadProgramStringOem(iPid)
  Protected Ret$=""
  Protected SizeBuff=AvailableProgramOutput(iPid)
  If SizeBuff>0
    Protected *Buff=AllocateMemory(SizeBuff)
    ReadProgramData(iPid,*Buff,SizeBuff)
    OemToCharBuffA(*Buff,*Buff,SizeBuff)
    Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii)
    FreeMemory(*Buff)
  EndIf
  ProcedureReturn Ret$
EndProcedure
Procedure.s Cn(Str$)
  Protected i,j=1,Ret$="",Sym$,Str1$="",Flag=0
  Str$=ReplaceString(Str$,Chr(13)+Chr(10),Chr(12))
  For i=1 To Len(Str$)
    Sym$=Mid(Str$,i,1)
    Select Sym$
      Case Chr(12)
        Ret$+Str1$+Chr(13)+Chr(10)
        Str1$=""
      Case Chr(13)
        Flag=1
      Default
        If Flag:Str1$="":Flag=0:EndIf
        Str1$+Sym$
    EndSelect
  Next
  Ret$+Str1$
  ProcedureReturn Ret$
EndProcedure
Procedure Chkdsk()
;    Protected iPid = RunProgram("cmd.exe", "/c tracert usbtor.ru", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
;    Protected iPid = RunProgram("cmd.exe", "/c chkdsk d: /f /x", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    Protected iPid = RunProgram("cmd.exe", "/c chkdsk c: ", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
    Protected Str$,Text$=""
    If iPid
      While ProgramRunning(iPid)
        WaitWindowEvent(100)
        Str$=ReadProgramStringOem(iPid)
        If Str$
          Text$+Str$
          SetGadgetText(0,Cn(Text$)+Chr(13)+Chr(10))
         EndIf
      Wend
      CloseProgram(iPid) ; Close the connection to the program
    EndIf
  EndProcedure
  OpenWindow(0,  44, 16, 780, 700, "", #PB_Window_SystemMenu)
  EditorGadget(0, 0, 0, 780, 700)
  LoadFont(0, "Courier New", 10)
  SetGadgetFont(0, FontID(0))
  Chkdsk()
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
nikzzzz, Добавил возможность изменения размера окна:

Дополнительная информация

Import "user32.lib"
  OemToCharBuffA(*Buff,*Buff1,SizeBuff)
EndImport
Procedure.s ReadProgramStringOem(iPid)
  Protected Ret$=""
  Protected SizeBuff=AvailableProgramOutput(iPid)
  If SizeBuff>0
    Protected *Buff=AllocateMemory(SizeBuff)
    ReadProgramData(iPid,*Buff,SizeBuff)
    OemToCharBuffA(*Buff,*Buff,SizeBuff)
    Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii)
    FreeMemory(*Buff)
  EndIf
  ProcedureReturn Ret$
EndProcedure
Procedure.s Cn(Str$)
  Protected i,j=1,Ret$="",Sym$,Str1$="",Flag=0
  Str$=ReplaceString(Str$,Chr(13)+Chr(10),Chr(12))
  For i=1 To Len(Str$)
    Sym$=Mid(Str$,i,1)
    Select Sym$
      Case Chr(12)
        Ret$+Str1$+Chr(13)+Chr(10)
        Str1$=""
      Case Chr(13)
        Flag=1
      Default
        If Flag:Str1$="":Flag=0:EndIf
        Str1$+Sym$
    EndSelect
  Next
  Ret$+Str1$
  ProcedureReturn Ret$
EndProcedure
Procedure EditorEndLine(Gadget)
Protected sel.CHARRANGE, GadgetID, LineEnd
GadgetID=GadgetID(Gadget)
LineEnd = SendMessage_(GadgetID, #EM_GETLINECOUNT, 0, 0)-1
sel\cpMin=SendMessage_(GadgetID, #EM_LINEINDEX, LineEnd, 0)
sel\cpMax=sel\cpMin
SendMessage_(GadgetID, #EM_EXSETSEL, 0, @sel)
EndProcedure
Procedure Chkdsk()
  ;    Protected iPid = RunProgram("cmd.exe", "/c tracert usbtor.ru", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  ;    Protected iPid = RunProgram("cmd.exe", "/c chkdsk d: /f /x", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  Protected iPid = RunProgram("cmd.exe", "/c chkdsk c: ", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
  Protected Str$,Text$=""
  If iPid
    While ProgramRunning(iPid)
      If WaitWindowEvent(100) = #PB_Event_CloseWindow
        If MessageRequester("Внимание!", "Идет сканирование диска..."+Chr(10)+"Закрыть программу?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)=6
          CloseProgram(iPid)
          End
        EndIf
      EndIf
      Str$=ReadProgramStringOem(iPid)
      If Str$
        Text$+Str$
        SetGadgetText(0,Cn(Text$)+Chr(13)+Chr(10))
        EditorEndLine(0)
      EndIf
    Wend
    CloseProgram(iPid) ; Close the connection to the program
  EndIf
EndProcedure
Procedure SizeWindowHandler()
  ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0))
EndProcedure
OpenWindow(0,  44, 16, 700, 300, "CHKDSK GUI", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
SendMessage_(WindowID(0),#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",270))
BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler())
SmartWindowRefresh(0, #True)
WindowBounds(0, 700, 200, #PB_Ignore, #PB_Ignore)
EditorGadget(0, 0, 0, 700, 300, #PB_Editor_ReadOnly)
LoadFont(0, "Courier New", 10)
SetGadgetFont(0, FontID(0))
Chkdsk()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
А почему программа не закрывается, во время сканирования?
Что этому мешает?
И можно ли закрывать? Не появится ли проблем, если завершить работу во время сканирования?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Joker-2013,
If WaitWindowEvent() =
53736А почему программа не закрывается, во время сканирования?
Так это демка динамического вывода , замени 42 строку на
If WaitWindowEvent(100) = #PB_Event_CloseWindow:End:EndIf
будет закрываться.
53736Не появится ли проблем, если завершить работу во время сканирования?
Во время сканирования - нет, а вот если она что-нибудь правит - черт его знает, опасно.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO, Дочки, матери...
Может это нужно:

Дополнительная информация

hwnd = OpenWindow(0, 0, 0, 400, 300, "MDIGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
CreateMenu(0, WindowID(0))
MenuTitle("Menu index 0")
MenuTitle("MDI windows menu")
MenuItem(0, "self created item")
MenuItem(1, "self created item")
MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
mhwnd = AddGadgetItem(0,1, "child window")
mhwnd2 = AddGadgetItem(0,2, "child window 2")
; add gadgets here...
UseGadgetList(WindowID(0)) ; go back to the main window gadgetlist
SendMessage_(hwnd,#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",13))
SendMessage_(mhwnd,#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",23))
SendMessage_(mhwnd2,#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",188))
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow

Страница 3 из 34


Показать сообщения:    

Текущее время: 28-Мар 17:46

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


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