AZJIO
  - 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
|
 Отправлено: 11-May-2018 03:24
(after 1 day 18 hours)
nikzzzz
  - 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
|
Joker-2013
  - Longevity: 7 years 1 month
- Posts: 2053
- REPUTATION:118[+] [-]
- Location: из прошлого
|
nikzzzz, Что даёт константа #WS_POPUP , по моему ничего... в пьюрике есть уже функция для создания дочернего окна... Нужно просто указать его, WindowID(99) Сравни значек в панели задач... Зачем создавать два цикла обработки событий? Работает, но по мне как то... и в основном цикле, всё прекрасно обрабатывается...
|
nikzzzz
  - Longevity: 7 years 6 months
- Posts: 3115
- REPUTATION:127[+] [-]
|
Joker-2013,53688Что даёт константа #WS_POPUP , по моему ничего.. Не знаю, я просто взял пример от AZJIO.53688 в пьюрике есть уже функция для создания дочернего окна... Нужно просто указать его, WindowID(99) Приведи пример, я просто написал аналог дочернего окна на Autoit, возможно не правильно понял задачу.53688Зачем создавать два цикла обработки событий? Для удобства, каждое окно на свою задачу. Вообще-то это пример от AZJIO, я всего лишь сделал "дочернее" окно из его кода.
|
Joker-2013
  - 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Для удобства, каждое окно на свою задачу. Сомнительно это, но работает... У цикла нет привязки к конкретному окну, но есть приоритет... По мне, так это костыль. Разблокируй родительское окно и нажми на крестик в нем. При первом нажатии, закроется дочернее окно, при втором родительское... То есть выходим в начале из второго цикла, оказываемся в первом... Если родительское окно заблокировано, то нормально, если нет, то вариант не катит... Что происходит с первым циклом, мне не понятно... То ли он останавливается, то ли перезаписывается, но при выходе из второго, он возобновляет свою работу...
|
nikzzzz
  - Longevity: 7 years 6 months
- Posts: 3115
- REPUTATION:127[+] [-]
|
53690 У цикла нет привязки к конкретному окну, но есть приоритет... По мне, так это костыль. Разблокируй родительское окно и нажми на крестик в нем. При первом нажатии, закроется дочернее окно, при втором родительское... Так событие-то одно, щелчок по крестику, а проанализировать, по какому окну щелкнули лень?
|
nikzzzz
  - Longevity: 7 years 6 months
- Posts: 3115
- REPUTATION:127[+] [-]
|
53690При использовании константы, она сдвоенная (и без константы тоже), если использовать предложенный мною вариант (стандартный), она одна (как и должно быть у дочернего окна) Вот, я не правильно понял задачу, я считал, что дочернее окно должно блокировать материнское, а на иконки мне было как-то наплевать.
|
Joker-2013
  - Longevity: 7 years 1 month
- Posts: 2053
- REPUTATION:118[+] [-]
- Location: из прошлого
|
53691Так событие-то одно, щелчок по крестику, а проанализировать, по какому окну щелкнули лень? Так я и говорю, что костыль... Один цикл из примера, что я выложил на том сайте, прекрасно справляется и всё отлавливает. Все равно нумерацию гаджетов нельзя вести раздельную (номер не должен переписывать из другого окна)53692Вот, я не правильно понял задачу, я считал, что дочернее окно должно блокировать материнское, а на иконки мне было как-то наплевать. Так блокируешь его же вручную, а не константой, которая ничего в данном случае не делает...
|
nikzzzz
  - Longevity: 7 years 6 months
- Posts: 3115
- REPUTATION:127[+] [-]
|
53693Так блокируешь его же вручную, а не константой, которая ничего в данном случае не делает... Так в том то и проблема, что дочернее окно хотя и создается, но не блокирует материнское, поэтому и приходится это делать в ручную. Возможно, есть другое решение, но я его не знаю, задача решена, пусть даже через костыль.
|
 Отправлено: 11-May-2018 11:52
(after 1 hour 27 minutes)
AZJIO
  - 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
|
Joker-2013
  - Longevity: 7 years 1 month
- Posts: 2053
- REPUTATION:118[+] [-]
- Location: из прошлого
|
53697Например элемент "Вкладки" нельзя создать 2 шт в одном окне (не знаю является ли правило для винды, но для AutoIt3 точно), и чтобы сделать 2 и более нужно делать дочерние окна как часть родительского, тогда в каждом дочернем можно создать свой элемент "Вкладки", а выглядеть будет как в одном окне. Пьюр бейсик может... Видел пример... Нужно создать, гаджет-контейнер, а в нем объекты... Так хоть два статус бара, меню бара или разные вкладки, не проблема, да хоть три...
|
AZJIO
  - Longevity: 4 years 5 months
- Posts: 1054
- REPUTATION:127[+] [-]
|
53699Нужно создать, гаджет-контейнер ну это в терминологии винды является дочерним окном. Вообще как ранее мы обсуждали элементы окна являются тоже окнами. Грубо говоря мы оперируем теми же ресурсами винды но в видении/терминологии другого автора. А при тесте пытаемся разгадать как автор интерпретатра кода создал механизмы работы. Например в AutoIt3 при создании окон есть стили по умолчанию и принудительные стили. Принудительные не убираются совсем, умолчальные заменяются в момент указания своих стилей и чтобы они не убирались их нужно доавить как +DefaultStyle (грубо говоря, название конечно другое). Если смотреть гипотетически, то добавляя ID родителя, ты делаешь дочерним окно, а добавляя #PB_Window_SystemMenu ты делаешь его явно отдельно от родительского окна, вот он сам и добавляет остальные стили угадывая намерения.
|
nikzzzz
  - 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
|
Joker-2013
  - 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 А почему программа не закрывается, во время сканирования? Что этому мешает? И можно ли закрывать? Не появится ли проблем, если завершить работу во время сканирования?
|
nikzzzz
  - Longevity: 7 years 6 months
- Posts: 3115
- REPUTATION:127[+] [-]
|
Joker-2013, If WaitWindowEvent() =53736А почему программа не закрывается, во время сканирования? Так это демка динамического вывода , замени 42 строку наIf WaitWindowEvent(100) = #PB_Event_CloseWindow:End:EndIf будет закрываться.53736Не появится ли проблем, если завершить работу во время сканирования? Во время сканирования - нет, а вот если она что-нибудь правит - черт его знает, опасно.
|
Joker-2013
  - 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
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
|
|