[Quote]

    AZJIO
  • 17953
  • Longevity: 4 years 5 months
  • Posts: 1054
  • REPUTATION:127

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


Last edited by AZJIO on 2020-07-19 23:55; edited 41 times in total

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION: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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 7 years 1 month
  • Posts: 2053
  • REPUTATION:118

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION:127

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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 7 years 1 month
  • Posts: 2053
  • REPUTATION:118

    [+] [-]
  • Location: из прошлого
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Для удобства, каждое окно на свою задачу.
Сомнительно это, но работает...
У цикла нет привязки к конкретному окну, но есть приоритет... По мне, так это костыль.
Разблокируй родительское окно и нажми на крестик в нем.
При первом нажатии, закроется дочернее окно, при втором родительское...
То есть выходим в начале из второго цикла, оказываемся в первом...
Если родительское окно заблокировано, то нормально, если нет, то вариант не катит...
Что происходит с первым циклом, мне не понятно...
То ли он останавливается, то ли перезаписывается, но при выходе из второго, он возобновляет свою работу...

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION:127

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION:127

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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 7 years 1 month
  • Posts: 2053
  • REPUTATION:118

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION:127

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 4 years 5 months
  • Posts: 1054
  • REPUTATION:127

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


Last edited by AZJIO on 2018-05-11 12:04; edited 2 times in total

[Quote]

    Joker-2013
  • 1039
  • Longevity: 7 years 1 month
  • Posts: 2053
  • REPUTATION:118

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

[Quote]

    AZJIO
  • 17953
  • Longevity: 4 years 5 months
  • Posts: 1054
  • REPUTATION:127

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

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION: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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 7 years 1 month
  • Posts: 2053
  • REPUTATION:118

    [+] [-]
  • Location: из прошлого
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
А почему программа не закрывается, во время сканирования?
Что этому мешает?
И можно ли закрывать? Не появится ли проблем, если завершить работу во время сканирования?

[Quote]

    nikzzzz
  • 215
  • Longevity: 7 years 6 months
  • Posts: 3115
  • REPUTATION:127

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

[Quote]

    Joker-2013
  • 1039
  • Longevity: 7 years 1 month
  • Posts: 2053
  • REPUTATION:118

    [+] [-]
  • Location: из прошлого
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

Page 3 of 34


Display posts:    

Current time is: 20-Aug 06:14

All times are UTC + 3


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum