AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
ChkDskGui (PureBasic)
Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия
Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)
|
Отправлено: 11-Май-2018 03:24
(спустя 1 день 18 часов)
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 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
- Стаж: 9 лет 4 месяца
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
nikzzzz, Что даёт константа #WS_POPUP , по моему ничего... в пьюрике есть уже функция для создания дочернего окна... Нужно просто указать его, WindowID(99) Сравни значек в панели задач... Зачем создавать два цикла обработки событий? Работает, но по мне как то... и в основном цикле, всё прекрасно обрабатывается...
|
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
Joker-2013,53688Что даёт константа #WS_POPUP , по моему ничего.. Не знаю, я просто взял пример от AZJIO.53688 в пьюрике есть уже функция для создания дочернего окна... Нужно просто указать его, WindowID(99) Приведи пример, я просто написал аналог дочернего окна на Autoit, возможно не правильно понял задачу.53688Зачем создавать два цикла обработки событий? Для удобства, каждое окно на свою задачу. Вообще-то это пример от AZJIO, я всего лишь сделал "дочернее" окно из его кода.
|
Joker-2013
- Стаж: 9 лет 4 месяца
- Сообщений: 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
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
53690 У цикла нет привязки к конкретному окну, но есть приоритет... По мне, так это костыль. Разблокируй родительское окно и нажми на крестик в нем. При первом нажатии, закроется дочернее окно, при втором родительское... Так событие-то одно, щелчок по крестику, а проанализировать, по какому окну щелкнули лень?
|
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
53690При использовании константы, она сдвоенная (и без константы тоже), если использовать предложенный мною вариант (стандартный), она одна (как и должно быть у дочернего окна) Вот, я не правильно понял задачу, я считал, что дочернее окно должно блокировать материнское, а на иконки мне было как-то наплевать.
|
Joker-2013
- Стаж: 9 лет 4 месяца
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
53691Так событие-то одно, щелчок по крестику, а проанализировать, по какому окну щелкнули лень? Так я и говорю, что костыль... Один цикл из примера, что я выложил на том сайте, прекрасно справляется и всё отлавливает. Все равно нумерацию гаджетов нельзя вести раздельную (номер не должен переписывать из другого окна)53692Вот, я не правильно понял задачу, я считал, что дочернее окно должно блокировать материнское, а на иконки мне было как-то наплевать. Так блокируешь его же вручную, а не константой, которая ничего в данном случае не делает...
|
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
53693Так блокируешь его же вручную, а не константой, которая ничего в данном случае не делает... Так в том то и проблема, что дочернее окно хотя и создается, но не блокирует материнское, поэтому и приходится это делать в ручную. Возможно, есть другое решение, но я его не знаю, задача решена, пусть даже через костыль.
|
Отправлено: 11-Май-2018 11:52
(спустя 1 час 27 минут)
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
53688Нужно просто указать его, WindowID(99) Вообще указать идентификатор родителя не значит сделать его всплывающим, дочернее бывает внутри родительского плавает и не вытащишь за границу родителя или является областью родительского окна, когда визуально даже не видно никакого окна, это просто часть внутри которой создаёшь элементы и подчиняются они свойствам этого окна. Именно WS_POPUP в виндовой терминологии создаёт всплывающее дочернее окно, а к нему уже можно подвязывать другие стили, которые делают его изменяемым, сворачиваемым (над панелью задач) и т.д. Например элемент "Вкладки" нельзя создать 2 шт в одном окне (не знаю является ли правило для винды, но для AutoIt3 точно), и чтобы сделать 2 и более нужно делать дочерние окна как часть родительского, тогда в каждом дочернем можно создать свой элемент "Вкладки", а выглядеть будет как в одном окне. nikzzzz не указал его родителем поэтому видимо получается что они как два самостоятельных окна одного процесса. При блокировке окно не получает сообщения в очередь, поэтому при разблокировании он не будет обрабатывать никакие клики, вызванные во время блокировки.
Последний раз редактировалось: AZJIO (2018-05-11 12:04), всего редактировалось 2 раз(а)
|
Joker-2013
- Стаж: 9 лет 4 месяца
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
53697Например элемент "Вкладки" нельзя создать 2 шт в одном окне (не знаю является ли правило для винды, но для AutoIt3 точно), и чтобы сделать 2 и более нужно делать дочерние окна как часть родительского, тогда в каждом дочернем можно создать свой элемент "Вкладки", а выглядеть будет как в одном окне. Пьюр бейсик может... Видел пример... Нужно создать, гаджет-контейнер, а в нем объекты... Так хоть два статус бара, меню бара или разные вкладки, не проблема, да хоть три...
|
AZJIO
- Стаж: 6 лет 8 месяцев
- Сообщений: 1322
- Репутация:127[+] [-]
|
53699Нужно создать, гаджет-контейнер ну это в терминологии винды является дочерним окном. Вообще как ранее мы обсуждали элементы окна являются тоже окнами. Грубо говоря мы оперируем теми же ресурсами винды но в видении/терминологии другого автора. А при тесте пытаемся разгадать как автор интерпретатра кода создал механизмы работы. Например в AutoIt3 при создании окон есть стили по умолчанию и принудительные стили. Принудительные не убираются совсем, умолчальные заменяются в момент указания своих стилей и чтобы они не убирались их нужно доавить как +DefaultStyle (грубо говоря, название конечно другое). Если смотреть гипотетически, то добавляя ID родителя, ты делаешь дочерним окно, а добавляя #PB_Window_SystemMenu ты делаешь его явно отдельно от родительского окна, вот он сам и добавляет остальные стили угадывая намерения.
|
nikzzzz
- Стаж: 9 лет 9 месяцев
- Сообщений: 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
- Стаж: 9 лет 4 месяца
- Сообщений: 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
- Стаж: 9 лет 9 месяцев
- Сообщений: 3114
- Репутация:127[+] [-]
|
Joker-2013, If WaitWindowEvent() =53736А почему программа не закрывается, во время сканирования? Так это демка динамического вывода , замени 42 строку наIf WaitWindowEvent(100) = #PB_Event_CloseWindow:End:EndIf будет закрываться.53736Не появится ли проблем, если завершить работу во время сканирования? Во время сканирования - нет, а вот если она что-нибудь правит - черт его знает, опасно.
|
Joker-2013
- Стаж: 9 лет 4 месяца
- Сообщений: 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
Текущее время: 21-Ноя 19:14
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|