|
|
Простой лаунчер для запуска портативных программ.
Поддерживает Drag&Drop. Позволяет запускать программы от имени Администратора и от имени Системы с правами TrustedInstaller. Если запускать программу удерживая клавишу Shift она запустится от имени администратора если удерживать CTRL+Shift запустится от имени системы. Если удерживать клавишу ALT - то запустится без ключей командной строки. Позволяет добавлять программы перетаскиванием из проводника Windows. Если вы перетащите файл на правую панель, программа добавится в текущую выделенную категорию. Если перетащите на левую панель, программа добавится в ту категорию на которую вы её бросите. Также чтобы сменить категорию перетащите программы из правой панели на категорию в левую панель. Категории можно сортировать перетаскиванием. Программы сортируется автоматически по алфавиту. Также вы можете добавлять системные утилиты Windows. Но это можно делать только вручную. Выберите "Добавить программу" и для например "Панели управления" впишите "Control". Утилита сама найдёт нужный файл и запустить его. В лаунчере можно использовать в путях переменные окружения (%WINDIR% %USERPROFILE% %SystemRoot% и т.д.). В файлах и папках добавленных в лаунчер проверяются пути, и если в них есть пути из переменных окружения - они подставляются в путь к файлу\папке. Например если добавить папку "Рабочий стол" - то путь будет выглядеть так "%USERPROFILE%\Desktop". Так же переменные окружения можно использовать в параметрах коммандной строки. Например что бы открть файл "Hosts" на любом компьютере заполните поля приложения так: "Путь к программе\файлу" - %SystemRoot%\System32\Notepad.exe "Параметры коммандной строки" - %SystemRoot%\System32\drivers\etc\hosts Для показа окна лаунчера используйте комбинацию клавиш CTRL+пробел или выберите горячую клавишу в настройках. Другие клавиши: CTRL+F - делает активной строку поиска. CTRL+D - дублировать текущую выделенную программу (если нужно добавить одну и ту же прогу в разные группы). CTRL+N - Добавить программу или группу. CTRL+E - Редактировать программу или переименовать группу. CTRL+S - Открыть окно настроек CTRL+I - Открыть окно информации. Shift-F10 - вызов контекстного меню для групп\программ. Стрелка вправо\влево делают активными соответственно правую и левую панель. Клавиши вверх\вниз - перемещение по списку групп\программ. ENTER - запуск текущей выделенной программы. DEL - удалить текущую выделенную программу или группу, очистить строку поиска. Если есть идеи что можно добавить в лаунчер - пишите в комментариях. Постараюсь сделать все на что хватит знаний. История версий - текущая 1.6.9 Версия 1.1 ====================================== Добавлена возможность запуска программ одним щелчком мыши. Добавлена возможность запуска программ без ключей. Добавлено сворачивание лаунчера в трей и горячая клавиша для показа окна (по умолчанию CTRL+пробел но можно изменить в настройках). Добавлена возможность добавления нескольких файлов перетаскиванием из проводника Windows. Добавлена возможность изменить размер шрифта для панелей. Позже попробую сделать изменение размера иконок. Версия 1.2 ====================================== -Добавлено Hover меню в трее. -Добавлен 12 размер шрифта (может кому пригодится). -Теперь в режиме запуска одним щелчком мышки при наведении курсора на прогу показывается описание. -Добавлен запуск без ключей для Администратора и Системы. -Исправлены вылеты и баги при удалении программ клавишей Del. Добавлен фильтр скрытия программ для: -WindowsPE -Windows normal -Windows x86 -Windowsx64 Скрытые программы будут отображаться при поиске и при отображении всех программ. Их фон будет подсвечен красным цветом. Версия 1.3 ===================================== -Добавлена возможность выбора шрифта для панелей и интерфейса. -Добавлена возможность изменять цвет шрифта и фона главного окна. -При первом запуске теперь можно выбрать язык лаунчера. -Добавлена возможность экспорта ярлыков группы. Нажмите правую кнопку мыши на группе удерживая клавишу Shift. -Добавлена возможность добавлять в лаунчер папку с программами. Перетащите папку на список групп. Она добавится в список и в нее будут добавлены все найденные в ней и подпапках .exe,.lnk,.bat,.cmd файлы. -Добавлена возможность поменять местами кнопки мыши для меню в трее. -Добавлена возможность добавлять лаунчер в автозагрузку Windows. -При удалении группы теперь можно удалить все программы из этой группы. -Изменен внешний вид главного окна. Добавлена в список групп, группа "Все программы". -Теперь иконки программ можно сохранять в кеше. Значительно увеличивается скорость загрузки лаунчера. Особенно на медленных флешках или дисках. -Теперь лаунчер идет в двух вариантах х64 и х86. В х86 на 64 битных Windows не загружаются иконки некоторых файлов. В х64 все в порядке. Из за добавления группы "Все программы" при первом запуске продублируются группы "Избранное" и "Без категрии". Просто удалите их. Исправил все баги о которых сообщали пользователи (я надеюсь). Так же добавил почти все о чем просили. Если не будет новых багов, то займусь добавлением функции WPI в лаунчер. Версия 1.4 ===================================== -Теперь в лаунчере можно использовать в путях переменные окружения (%WINDIR% %USERPROFILE% %SystemRoot% и т.д.). В файлах и папках добавленных в лаунчер проверяются пути, и если в них есть пути из переменных окружения - они подставляются в путь к файлу\папке. Например если добавить папку "Рабочий стол" - то путь будет выглядеть так "%USERPROFILE%\Desktop". Так же переменные окружения можно использовать в параметрах коммандной строки. Например что бы открть файл "Hosts" на любом компьютере заполните поля приложения так: "Путь к программе\файлу" - %SystemRoot%\System32\Notepad.exe "Параметры коммандной строки" - %SystemRoot%\System32\drivers\etc\hosts -Добавлен фильтр расширений файлов добавляемых при перетаскивании папки на панель групп. Добавить\убрать расширения можно в настройках. -Изменен поиск программ. Теперь если в строке поиска перва буква заглавня - то поиск будет от начала имени программы (если буквы из строки поиска сопадают с первыми буквами в имени программы). Если строчная - то будет искаться в любом менсте имени программы. -Добавлена возможность включать показ сетки линий в списках и раскраска списка зеброй. Включается в настройках. -Добавлена возможность изменять иконку отображаемую в заголовках окон, панели задач, трее. что бы это работало - поместите иконку с именем "SimpleLauncher.ico" в папке лаунчера. -Теперь описание программы можно редактировать в главном окне. Добавьте или измените описание и нажмите CTRL+S для сохранения. -Теперь лаунчер запоминает стили выбраных шрифтов. -Добавлена возможность выбопа цвета подсветки для списка групп\программ. -Возвращена возможность добавлять папки в список программ. -Исправлены все баги о которых сообщали пользователи и те которые нашел сам. Перенес параментры шрифтов в ini в отдельную группу. Поэтому при первом запуске новой версии лаунчера у вас слетят настройки шрифтов. Версия 1.5 ===================================== -Исправлено отображение раскраски зеброй и разделительных линий в панелях. -Цвет подсветки по умолчанию теперь зеленый -Кастомная подсветка теперь работает и без включения смены цвета для панелей. -Увеличено расстояние между иконкой и названием групп. -Исправлено добавление корневых папок дисков (С:\ D:\ и т.д.) -Добавлена раскраска зеброй панели групп. -Добавлена возможность настраивать контрастность разделительных линий,раскраски зеброй и подсветки. -Добавлен виджет для лаунчера. При запуске лаунчера он появляется на рабочем столе (если включено показывать виджет при запуске лаунчера). Его можно поместить в любом месте рабочего стола. Перемещать его можно левой кнопкой мыши. Двойной клик - показать\скрыть лаунчер. Правый клик - показ hover меню. По умолчанию изображение виджета - иконка лаунчера. Можно использовать свое изображение для виджета. Для этого поместите в папку лаунчера изображение в формате PNG и именем SimpleLauncher.png (!!! В PNG файле обязательно должен быть канал прозрачности иначе виджет не будет отображаться !!!). Размер изображения подбирайте на свое усмотрение. При DPI рабочего стола 125% - размер 64х64 пикселя будет примерно как иконка самого лаунчера. Изображение не обязательно должно быть квадратным. Клики мышки по гаджету срабатывают только в непрозрачных местах гаджета. Но в настройках можно включить срабатывание кликов по всей площади гаджета. !!! Перенес настройки цвета в отдельную группу в INI файле. Поэтому при первом запуске у вас слетят настройки цвета главного окна !!! Версия 1.5.6 ===================================== Исправил невозможность запуска программ с относительными путями при запуске лаунчера из автозагрузки Window. Добавил выбор глубины сканирования папок при добавлении папки в список групп. Теперь если вы добавляете папку в список программ (правая панель) с зажатой клавишей "Shift" будет предложено добавить файлы из этой папки в текущую группу (так же будет предложено выбрать глубину сканирования). Запретил добавление логических дисков в панель групп и при добавлении в панель программ с зажатой клавишей Shift. Добавил возможность выбора показа виджета при запуске в обычной Windows и WinPE. Вернул подсказки по горячим клавишам в менюшки. Добавил возможность указывать рабочую папку для программ (из ярлыков при перетаскивании берется автоматически если есть). Версия 1.6 ===================================== Исправлено: Когда тянешь папку с шифтом в окно прог в папку без категорий, добавляются файлы только во все программы. Редкие вылеты при удалении программ из списка. Добавлено: Добавлен пункт показа виджета "кроме WinPE". Добавлена возможность для перетягивания из программ с низшими правами в проги с высшими правами (Не проверено). При добавлении папки в список групп и в список программ (с Shift-ом), первое окно с сообщением (добавить/отменить) убрано. Добавлены переменные окружения и относительный путь для рабочей папки. Добавлена опция скрывать программу в версии Windows ниже 10. Добавлены пункты в меню лаунчера - "Добавить программы из Меню Пуск" и "Удалить отсутствующие программы". Добавлена возможность изменять размер иконок. (от 16х16 до 64х64). Очистите кеш иконок!. При следующем запуске лаунчер загрузит иконки заново в более высоком качестве(загрузка может быть долгой!). Увеличена на порядок скорость отображения списка программ (через WinApi). Версия 1.6.4 ===================================== Исправлена проблема со шрифтами в главном окне при открытии окна редактирования. Добавлена опция скрытия виджета в полноэкранном режиме (см. в настройках). Переделан код определения полноэкранного режима. Теперь должно работать в WinRE. Исправлены баги с переменными окружения для х64 и х86 приложений. Добавлена опция - отображать отсутствующие программы в конце списка (см. в настройках). Исправлено несколько найденных багов. Оптимизация. Версия 1.6.6 ===================================== В меню лаунчера добавлена опция показать\скрыть виджет. В ховер меню отсутствующие программы теперь не отображаются. Версия 1.6.9 ===================================== Добавлена возможность переименовывать исполняемый файл лаунчера. При этом ini файл лаунчера и файл кеша иконок будут иметь такое же имя как и исполняемый файл. Так же это касается файлов кастомной иконки, кастомного виджета. Для 32 битной версии исполняемого файла - переименуйте его с приставкой "_x86". Пример как переименовывать файлы с кастомными иконкой и виджетом: Soft.exe Soft_x86.exe Soft.ico Soft.png Добавлена возможность разварачивать лаунчер в полноэкранный режим. Так же будет работать "прилипание к краям экрана". Исправлен баг со шрифтами в окне настроек (шрифт становился жирным). https://drive.google.com/file/d/1C5ZZp-WKk_ipl_yAwG...view?usp=sharing https://disk.yandex.ru/d/r2NWFetNhXIfEw Скриншоты ![]() ![]() ![]() ![]() ![]() ![]()
Последний раз редактировалось: motorboy (2026-04-15 23:28), всего редактировалось 39 раз(а) |
|
motorboy поюзал лаунчер,начало хорошее! внесу немного своих предложений к уже озвученным другими форумчанами:
-расширить выбор в настройки "после запуска программы" (свернуть в трей, спрятать слева или справа за границы экрана для примера как TBLauncher); -сделать запуск программ по одиночному щелчку мышки а не по двойному а описание программ перенести в всплывающее окно при наведении курсора на нужную прогу на ули в контекстное меню проги добавить пункт "описание". все таки это лаунчер портативок а не WPI; -раз уж есть в редакторе/добавлении программы "параметры командной строки", не плохо было б тогда и в контекстное меню внести пункт запуск без ключей, для гибкости запуска приложений; -присоединюсь к предложениям форумчан сделать в лаунчере последовательный запуск программ группы с такими предложениями: 1. добавить в контекстное меню группы пункт "запустить программы поочередно" - удобно использовать на живой системе для авто установки нужного набора софта т.д. 2. ну а для установки софта при использовании лаунчера в заливках или автоустановки добавить возможность запуска лаунчера с ключем, к примеру -auto "название группы"; -в настройки редактирования программы добавить функционал выбора отображения программы при запуске лаунчера (отображать в PE системах,на живой системе, отображение по разрядностям систем) для гибкой настройки софта чтоб лишние проги не отображались в списках при запуске на различных системах. Такие вот предложения! |
|
106598motorboy поюзал лаунчер,начало хорошее! внесу немного своих предложений к уже озвученным другими форумчанами: -расширить выбор в настройки "после запуска программы" (свернуть в трей, спрятать слева или справа за границы экрана для примера как TBLauncher); -сделать запуск программ по одиночному щелчку мышки а не по двойному а описание программ перенести в всплывающее окно при наведении курсора на нужную прогу на ули в контекстное меню проги добавить пункт "описание". все таки это лаунчер портативок а не WPI; -раз уж есть в редакторе/добавлении программы "параметры командной строки", не плохо было б тогда и в контекстное меню внести пункт запуск без ключей, для гибкости запуска приложений; -присоединюсь к предложениям форумчан сделать в лаунчере последовательный запуск программ группы с такими предложениями: 1. добавить в контекстное меню группы пункт "запустить программы поочередно" - удобно использовать на живой системе для авто установки нужного набора софта т.д. 2. ну а для установки софта при использовании лаунчера в заливках или автоустановки добавить возможность запуска лаунчера с ключем, к примеру -auto "название группы"; -в настройки редактирования программы добавить функционал выбора отображения программы при запуске лаунчера (отображать в PE системах,на живой системе, отображение по разрядностям систем) для гибкой настройки софта чтоб лишние проги не отображались в списках при запуске на различных системах. Такие вот предложения! Запуск без ключей - сделаю. Запуск программ по одиночному щелчку - сделаю. Описание. Если вам не нужно видеть описание - просто уменьшите поле описания вниз до упора и оно не будет отображаться. Сделать всплывающее описание по наведении мыши на прогу сделать не получится. Хотя возможно я что то придумаю. Через Winapi например. Отображать в PE системах, на живой системе, отображение по разрядностям систем - немного сложнее, но думаю что смогу добавить такой функционал. Прятать за границы экрана - Вы имеете в виду показ окна лаунчера при наведение мыши к правому\левому краю экрана? Последовательный запуск программ из группы - могу сделать. Но это же лаунчер а не WPI . Может лучше сделать отдельную утилиту для установки софта? Но если нужен такой фунционал в лаунчере то сделаю.
|
|
Прятать за границы экрана - Вы имеете в виду показ окна лаунчера при наведение мыши к правому\левому краю экрана? И конечно же как пердложил При такой фиче удобно будет иметь горячую клавишу для показа окна. |
|
Они ограничены размером 16х16. Разве что AZJIO подскажет как это сделать в Pure Basic. If LargeIcon ; 32 ExtractIconEx_(path, IconIndex, @hIcon, 0, 1) ; 32 Else ExtractIconEx_(path, IconIndex, 0, @hIcon, 1) ; 16 EndIf Не помню с какой версии Windows можно указать любой размер, но он будет выполняться масштабированием. Разве что AZJIO подскажет как это сделать в Pure Basic |
|
106607ListIconGadget SetGadgetAttribute(): Со следующим атрибутом: #PB_ListIcon_DisplayMode : Изменяет режим отображения Гаджета. Может быть одной из следующих констант (только для Windows): #PB_ListIcon_LargeIcon: Режим больших иконок #PB_ListIcon_SmallIcon: Режим малых иконок #PB_ListIcon_List : Режим списка #PB_ListIcon_Report : Режим таблицы (столбцы, режим по умолчанию) Define hIcon ; Define NewList hIcons() If OpenWindow(0, 100, 100, 800, 600, "Пример Гаджета Список со значками", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ListIconGadget(0, 5, 5, 790, 590, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) AddGadgetColumn(0, 1, "Address", 250) ExtractIconEx_("Shell32.dll", 3, @hIcon, 0, 1) ; 32 SetGadgetAttribute(0, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon) For i = 0 To 11 AddGadgetItem(0, -1, "ага " + Str(i), hIcon) Next Repeat Event = WaitWindowEvent() Until Event = #PB_Event_CloseWindow DestroyIcon_(hIcon) EndIf |
|
motorboy
Вот пример рисование пункта, но чтобы высота пукнта увеличилась нужно увеличить шрифт, а уж рисовать пункт можно любы другим шрифтом. Global hIcon = 0 Global hIcon2 = 0 ExtractIconEx_("Shell32.dll", 131, @hIcon, 0, 1) ExtractIconEx_("Shell32.dll", 3, @hIcon2, 0, 1) ; ExtractIconEx_("C:\ProgramData\PureBasic\Examples\Sources\Data\CdPlayer.ico", 0, 0, @hIcon, 1) ; Debug hIcon Global g_tRect.RECT With g_tRect \left = 0 \top = 0 \right = 16 \bottom = 16 EndWith Global hDC, MemDC Global hOldBMP Procedure CreateBMP() Protected hBrush, MemBMP, Rect.RECT MemBMP = CreateCompatibleBitmap_(hDC, 16, 16) hOldBMP = SelectObject_(MemDC, MemBMP) hBrush = CreateSolidBrush_($0088FF) SelectObject_(MemDC, hBrush) With Rect \left = 0 \right = 16 \top = 0 \bottom = 16 EndWith FillRect_(MemDC, Rect, hBrush) DeleteObject_(hBrush) DeleteObject_(MemBMP) EndProcedure Procedure LB_CreateSolidBitmap(hWnd, iColor, iWidth, iHeight, bRGB = 1) ; Protected Error_FillRect = 0 Protected hBrush Protected hDC = GetDC_(hWnd) Protected hDestDC = CreateCompatibleDC_(hDC) Protected hBitmap = CreateCompatibleBitmap_(hDC, iWidth, iHeight) Protected hOld = SelectObject_(hDestDC, hBitmap) Protected tRect.RECT With tRect \left = 0 \top = 0 \right = iWidth \bottom = iHeight EndWith If bRGB iColor = ((iColor & $00FF00) | ((iColor & $0000FF) << 16) | ((iColor & $FF0000) >> 16)) EndIf hBrush = CreateSolidBrush_(iColor) FillRect_(hDestDC, tRect, hBrush) ; If Error_FillRect ; DeleteObject_(hBitmap) ; hBitmap = 0 ; EndIf DeleteObject_(hBrush) ReleaseDC_(hWnd, hDC) SelectObject_(hDestDC, hOld) DeleteDC_(hDestDC) If Not hBitmap ProcedureReturn 0 EndIf ProcedureReturn hBitmap EndProcedure #LV0 = 0 Global BackColor = $00FF00 Global ForeColor = $FF0000 Global BackColorHeader = $eeffee Global ForeColorHeader = $2277ff Global BorderColor = $0 Global HightLightBrush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT)) ; Global HightLightBrush = CreateSolidBrush_($ff3926) Global BackColorBrush = CreateSolidBrush_(BackColor) Global BackColorBrushHeader = CreateSolidBrush_(BackColorHeader) Global frmMain_References, hHeader Global Dim Colors(1) Colors(0) = $8080FF Colors(1) = ForeColor ; --------------------------------------------------------------------------------------------------------------------- Procedure GetCharWidth(gad, c$) ProcedureReturn SendMessage_(gad, #LVM_GETSTRINGWIDTH, 0, @c$) EndProcedure ; это подкрашивает части пункта в ListView Procedure Callback_Win(hwnd, msg, wParam, lParam) Protected Result, *nmhdr.NMHDR, *lvCD.NMLVCUSTOMDRAW, subItemRect.RECT, *DrawItem.DRAWITEMSTRUCT, Buffer.s Protected *pnmcd.NMCUSTOMDRAW, hdi.hd_item Protected thisRow, thisCol, idx Protected t$, text$ Protected nNotifyCode Protected *NMITEM.NMITEMACTIVATE Protected SelectedLine Result = #PB_ProcessPureBasicEvents ;;Dim LVColor(0) Select msg Case #WM_NCDESTROY ; удаление кистей, после закрытия программы DeleteObject_(HightLightBrush) DeleteObject_(BackColorBrush) DeleteObject_(BackColorBrushHeader) Case #WM_NOTIFY ; стандартные структуры ListView для перерисовки *nmhdr.NMHDR = lParam *lvCD.NMLVCUSTOMDRAW = lParam *NMITEM.NMITEMACTIVATE = lParam ; если гаджет #LV0 и он пользовательская рисовка, то If *lvCD\nmcd\hdr\hwndFrom = GadgetID(#LV0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW Select *lvCD\nmcd\dwDrawStage Case #CDDS_PREPAINT Result = #CDRF_NOTIFYITEMDRAW Case #CDDS_ITEMPREPAINT Result = #CDRF_NOTIFYSUBITEMDRAW; Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM ; перерисовка пункта thisRow = *lvCD\nmcd\dwItemSpec ; строку thisCol = *lvCD\iSubItem ; колонка If thisCol =0 ; если колонка 0, то ; Определяет прямоугольник для текста subItemRect.RECT\left = #LVIR_BOUNDS ; #LVIR_ICON, #LVIR_LABEL subItemRect.RECT\top = *lvCD\iSubItem ; iSubItem ; Определяет прямоугольник подпункт SendMessage_(GadgetID(#LV0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect) ; в итоге переписываем структуру прямоугольника ; subItemRect.RECT\left = #LVIR_ICON ; SendMessage_(GadgetID(#LV0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect) ; в итоге переписываем структуру прямоугольника ; subItemRect.RECT\left + 160 text$ = GetGadgetItemText(#LV0, thisRow, thisCol) ; получаем текст пункта по строке и колонке If GetGadgetState(#LV0) = thisRow ; если индекс выделенного элемента равен пункту, то ; выделенный пункт, перекрашиваем его фон FillRect_(*lvCD\nmcd\hdc, subItemRect, HightLightBrush) SetTextColor_(*lvCD\nmcd\hdc, $00FFFF) ; Else ; не выделенный пункт, перекрашиваем его другим фоном FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrushHeader) SetTextColor_(*lvCD\nmcd\hdc, ForeColor) ; EndIf CopyStructure(@subItemRect, @g_tRect, RECT) ; Debug subItemRect\left ; Debug subItemRect\right ; Debug subItemRect\top ; Debug subItemRect\bottom ; With g_tRect ; \bottom = \top + 16 ; EndWith InflateRect_(subItemRect, -46, 0) ; изменяет левую границу прямоугольника на 8 пиксел ; SetBkColor_(*lvCD\nmcd\hdc, BackColor) ; фон всегда одинаковый, он вообще не нужен DrawText_(*lvCD\nmcd\hdc, text$, -1, subItemRect, #DT_END_ELLIPSIS | #DT_VCENTER | #DT_SINGLELINE) ; рисуем текст ; DrawIcon_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon) ;LB_CreateSolidBitmap(hWnd, iColor, iWidth, iHeight, bRGB = 1) With g_tRect \left + 0 \right = \left + 12 \top + 6 \bottom = \top + 12 EndWith ; DrawEdge_(*lvCD\nmcd\hdc, @g_tRect, #EDGE_SUNKEN, #BF_RECT) ; FillRect_(*lvCD\nmcd\hdc, g_tRect, BackColorBrush) ; DrawIcon_(*lvCD\nmcd\hdc, subItemRect\left, subItemRect\top, hIcon) If thisRow % 2 DrawIconEx_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon, 32, 32, 0, 0, #DI_NORMAL) Else DrawIconEx_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon2, 32, 32, 0, 0, #DI_NORMAL) EndIf ; With g_tRect ; BitBlt_(*lvCD\nmcd\hdc, \left, \top, \right - \left, \bottom - \top, MemDC, 0, 0, #SRCCOPY) ; EndWith Result = #CDRF_SKIPDEFAULT Else Result = #CDRF_DODEFAULT EndIf EndSelect EndIf EndSelect ProcedureReturn Result EndProcedure ; это подкрашивает заголовок ListView Procedure Callback_Header(hWnd, Message, wParam, lParam) Protected *Header.HD_NOTIFY, SelectedLine, *lvCD.NMLVCUSTOMDRAW Protected *nmhdr.NMHDR, text$, *pnmcd.NMCUSTOMDRAW, hdi.hd_item Protected rc2.RECT, hDC Protected Result = CallWindowProc_(frmMain_References, hWnd, Message, wParam, lParam) *Header = lParam *nmhdr = lParam *lvCD = lParam Select Message Case #WM_NOTIFY Select *Header\hdr\code Case #NM_CUSTOMDRAW If *nmhdr\hwndFrom = hHeader *pnmcd.NMCUSTOMDRAW = lParam Select *pnmcd\dwDrawStage Case #CDDS_PREPAINT result = #CDRF_NOTIFYITEMDRAW Case #CDDS_ITEMPREPAINT text$ = GetGadgetItemText(GetDlgCtrlID_(hWnd), -1, *pnmcd\dwItemSpec) hdi\mask = #HDI_TEXT hdi\psztext = @text$ hdi\cchtextmax = Len(text$) SetBkMode_(*pnmcd\hdc, #TRANSPARENT) FillRect_(*pnmcd\hdc, *pnmcd\rc, BackColorBrushHeader) ; сдвигаем текст после закрашивания прямоуголников If *lvCD\nmcd\dwItemSpec InflateRect_(*pnmcd\rc, -8, 0) ; text$ = LTrimChar(text$, " " + #TAB$) Else InflateRect_(*pnmcd\rc, -4, 0) EndIf SetTextColor_(*pnmcd\hdc, ForeColorHeader) DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_VCENTER | #DT_END_ELLIPSIS) result = #CDRF_SKIPDEFAULT EndSelect EndIf EndSelect EndSelect ProcedureReturn Result EndProcedure ;- ╔═ GUI ═╗ If OpenWindow(0, 0, 0, 420, 400, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ; for BitBlt hDC = GetDC_(WindowID(0)) MemDC = CreateCompatibleDC_(hDC) CreateBMP() If LoadFont(0, "Arial", 26) SetGadgetFont(#PB_Default, FontID(0)) ; Установить загруженный шрифт Arial 16 как новый стандарт EndIf ListIconGadget(#LV0, 10, 10, 400, 380, "Col0", 170, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect) ; SetGadgetAttribute(#LV0 , #PB_ListIcon_DisplayMode , #PB_ListIcon_Report) For a = 0 To 4 AddGadgetItem(#LV0, a, "item" + #LF$ + "item" + #LF$ + "item" + #LF$ + "item") Next ; SetGadgetColor(#LV0, #PB_Gadget_BackColor, BackColorHeader) ; ListViewGadget(0, 10, 10, 400, 380) ; For a = 1 To 12 ; AddGadgetItem(0, -1, "Элемент " + Str(a) + " Списка") ; Определить содержимое списка. ; Next SetWindowCallback(@Callback_Win()) ; hHeader = SendMessage_(GadgetID(#LV0), #LVM_GETHEADER, 0, 0) ; frmMain_References = SetWindowLongPtr_(GadgetID(#LV0), #GWL_WNDPROC, @Callback_Header()) ; SetBkColor_(hHeader, BackColor) ;- Loop Repeat Select WaitWindowEvent() Case #PB_Event_CloseWindow ; for ExtractIconEx DestroyIcon_(hIcon) DestroyIcon_(hIcon2) ; for BitBlt ReleaseDC_(WindowID(0), hDC) SelectObject_(MemDC, hOldBMP) DeleteDC_(MemDC) CloseWindow(0) End EndSelect ForEver EndIf Последний раз редактировалось: AZJIO (2026-03-10 19:39), всего редактировалось 1 раз |
|
Нашел пример попроще. Надо подумать как его прикрутить к лаунчеру.
Global ListIcon_ID, hImgList, Splitter_ID Procedure CreateMyList(Size) ; 1. Если гаджет уже есть — удаляем его и старый список иконок If IsGadget(ListIcon_ID) FreeGadget(ListIcon_ID) If hImgList : ImageList_Destroy_(hImgList) : EndIf EndIf ; 2. Создаем новый гаджет (с тем же номером или через #PB_Any) ListIcon_ID = ListIconGadget(#PB_Any, 0, 0, 0, 0, "Файлы", 200, #PB_ListIcon_FullRowSelect | #LVS_NOCOLUMNHEADER) ; 3. Создаем ImageList НОВОГО размера hImgList = ImageList_Create_(Size, Size, #ILC_COLOR32 | #ILC_MASK, 1, 1) ; Подготовим тестовую иконку (квадрат) нужного размера img = CreateImage(#PB_Any, Size, Size) StartDrawing(ImageOutput(img)) : Box(0, 0, Size, Size, $00FF00) : StopDrawing() ImageList_Add_(hImgList, ImageID(img), 0) SendMessage_(GadgetID(ListIcon_ID), #LVM_SETIMAGELIST, #LVSIL_SMALL, hImgList) FreeImage(img) ; Картинка уже в ImageList, оригинал можно удалить ; 4. Добавляем данные AddGadgetItem(ListIcon_ID, -1, "Размер иконок: " + Str(Size), 0) AddGadgetItem(ListIcon_ID, -1, "Размер иконок: " + Str(Size), 0) AddGadgetItem(ListIcon_ID, -1, "Размер иконок: " + Str(Size), 0) ; 5. КЛЮЧЕВОЙ МОМЕНТ: Обновляем Сплиттер ; #PB_Splitter_FirstGadget - заменяет первый (верхний/левый) гаджет на наш новый If IsGadget(Splitter_ID) SetGadgetAttribute(Splitter_ID, #PB_Splitter_FirstGadget, ListIcon_ID) EndIf EndProcedure ; --- Основное окно --- If OpenWindow(0, 0, 0, 400, 350, "Смена размера на лету", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) btn16 = ButtonGadget(#PB_Any, 10, 310, 80, 30, "16x16") btn48 = ButtonGadget(#PB_Any, 100, 310, 80, 30, "48x48") ; Создаем пустой контейнер снизу для сплиттера txt = TextGadget(#PB_Any, 0, 0, 0, 0, "Нижняя часть", #PB_Text_Center) ; Первый запуск (создаем список и сплиттер) CreateMyList(16) Splitter_ID = SplitterGadget(#PB_Any, 10, 10, 380, 290, ListIcon_ID, txt) Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget Select EventGadget() Case btn16 : CreateMyList(16) ; Пересоздаем с мелким размером Case btn48 : CreateMyList(48) ; Пересоздаем с крупным размером EndSelect EndIf Until Event = #PB_Event_CloseWindow EndIf |
|
Ну вообще-то да, в твоём найденном не нужно вручную рисовать, только значки увеличил и всё.
Я ещё упростил Global hIcon = 0 Global hIcon2 = 0 ExtractIconEx_("Shell32.dll", 161, @hIcon, 0, 1) ExtractIconEx_("Shell32.dll", 0, @hIcon2, 0, 1) ; ExtractIconEx_("C:\ProgramData\PureBasic\Examples\Sources\Data\CdPlayer.ico", 0, 0, @hIcon, 1) ; Debug hIcon Global g_tRect.RECT With g_tRect \left = 0 \top = 0 \right = 32 \bottom = 32 EndWith Global hDC #LV0 = 0 Global BackColor = $00FF00 Global ForeColor = $FF0000 Global BackColorHeader = $eeffee Global ForeColorHeader = $2277ff Global BorderColor = $0 Global HightLightBrush = CreateSolidBrush_(GetSysColor_(#COLOR_HIGHLIGHT)) ; Global HightLightBrush = CreateSolidBrush_($ff3926) Global BackColorBrush = CreateSolidBrush_(BackColor) Global BackColorBrushHeader = CreateSolidBrush_(BackColorHeader) ; --------------------------------------------------------------------------------------------------------------------- Procedure GetCharWidth(gad, c$) ProcedureReturn SendMessage_(gad, #LVM_GETSTRINGWIDTH, 0, @c$) EndProcedure ; это подкрашивает пункты в ListView Procedure Callback_Win(hwnd, msg, wParam, lParam) Protected Result, *nmhdr.NMHDR, *lvCD.NMLVCUSTOMDRAW, subItemRect.RECT Protected thisRow, thisCol Protected text$ Protected *NMITEM.NMITEMACTIVATE ; Protected nNotifyCode Result = #PB_ProcessPureBasicEvents ;;Dim LVColor(0) Select msg Case #WM_NCDESTROY ; удаление кистей, после закрытия программы DeleteObject_(HightLightBrush) DeleteObject_(BackColorBrush) DeleteObject_(BackColorBrushHeader) Case #WM_NOTIFY ; стандартные структуры ListView для перерисовки *nmhdr.NMHDR = lParam *lvCD.NMLVCUSTOMDRAW = lParam *NMITEM.NMITEMACTIVATE = lParam ; если гаджет #LV0 и он пользовательская рисовка, то If *lvCD\nmcd\hdr\hwndFrom = GadgetID(#LV0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW Select *lvCD\nmcd\dwDrawStage Case #CDDS_PREPAINT Result = #CDRF_NOTIFYITEMDRAW Case #CDDS_ITEMPREPAINT Result = #CDRF_NOTIFYSUBITEMDRAW; Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM ; перерисовка пункта thisRow = *lvCD\nmcd\dwItemSpec ; строку thisCol = *lvCD\iSubItem ; колонка If thisCol =0 ; если колонка 0, то ; Определяет прямоугольник для текста subItemRect.RECT\left = #LVIR_BOUNDS ; #LVIR_ICON, #LVIR_LABEL subItemRect.RECT\top = *lvCD\iSubItem ; iSubItem ; Определяет прямоугольник подпункт SendMessage_(GadgetID(#LV0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect) ; в итоге переписываем структуру прямоугольника ; subItemRect.RECT\left + 160 text$ = GetGadgetItemText(#LV0, thisRow, thisCol) ; получаем текст пункта по строке и колонке If GetGadgetState(#LV0) = thisRow ; если индекс выделенного элемента равен пункту, то ; выделенный пункт, перекрашиваем его фон FillRect_(*lvCD\nmcd\hdc, subItemRect, HightLightBrush) SetTextColor_(*lvCD\nmcd\hdc, $00FFFF) ; Else ; не выделенный пункт, перекрашиваем его другим фоном FillRect_(*lvCD\nmcd\hdc, subItemRect, BackColorBrushHeader) SetTextColor_(*lvCD\nmcd\hdc, ForeColor) ; EndIf CopyStructure(@subItemRect, @g_tRect, RECT) InflateRect_(subItemRect, -46, 0) ; изменяет левую границу прямоугольника на 8 пиксел (уже другое) SetBkColor_(*lvCD\nmcd\hdc, BackColorHeader) ; фон всегда одинаковый, он вообще не нужен DrawText_(*lvCD\nmcd\hdc, text$, -1, subItemRect, #DT_END_ELLIPSIS | #DT_VCENTER | #DT_SINGLELINE) ; рисуем текст With g_tRect \left + 0 \right = \left + 12 \top + 1 \bottom = \top + 12 EndWith If thisRow % 2 DrawIconEx_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon, 32, 32, 0, 0, #DI_NORMAL) Else DrawIconEx_(*lvCD\nmcd\hdc, g_tRect\left, g_tRect\top, hIcon2, 32, 32, 0, 0, #DI_NORMAL) EndIf Result = #CDRF_SKIPDEFAULT Else Result = #CDRF_DODEFAULT EndIf EndSelect EndIf EndSelect ProcedureReturn Result EndProcedure ;- ╔═ GUI ═╗ If OpenWindow(0, 0, 0, 420, 400, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) If LoadFont(0, "Segoe UI", 15) SetGadgetFont(#PB_Default, FontID(0)) ; Установить загруженный шрифт Arial 16 как новый стандарт EndIf ListIconGadget(#LV0, 10, 10, 400, 380, "Col0", 250, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_NoHeaders) For a = 1 To 6 AddGadgetItem(#LV0, -1, "Программа " + Str(a) ) Next SetGadgetColor(#LV0, #PB_Gadget_BackColor, BackColorHeader) SetWindowCallback(@Callback_Win()) ;- Loop Repeat Select WaitWindowEvent() Case #PB_Event_CloseWindow ; for ExtractIconEx DestroyIcon_(hIcon) DestroyIcon_(hIcon2) CloseWindow(0) End EndSelect ForEver EndIf Добавлено через 8 минут 10 секунд: Использование ImageList_Create_ не так уж и сложно, наоборот даже лучше, удобней удалять значки когда прога закрыта. Надо только связать индекс изображения с именем программы, чтобы перестраивая список выбирая группы просто брать индекс по имени. Возможно даже лучше использовать карту где для имени присваивается индекс, и получать индекс иконки без поиска по списку или массиву. Добавлено через 1 час 16 минут 27 секунд: Как-то так Global ListIcon_ID, hImgList Define hIcon1, hIcon2, hIcon3 Define Size = 32 ; Добавляем иконки прог ExtractIconEx_("Shell32.dll", 161, @hIcon1, 0, 1) ExtractIconEx_("Shell32.dll", 0, @hIcon2, 0, 1) ExtractIconEx_("Shell32.dll", 3, @hIcon3, 0, 1) Procedure AddItem(idxLV, idxImage, text$, pos = -1) Protected item.LVITEM item\mask = #LVIF_TEXT | #LVIF_PARAM | #LVIF_IMAGE item\iItem = idxLV item\iImage = idxImage item\pszText = @text$ SendMessage_(GadgetID(ListIcon_ID), #LVM_INSERTITEMW, pos, @item) ProcedureReturn 0 EndProcedure If OpenWindow(0, 0, 0, 400, 350, "Пример", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ListIcon_ID = ListIconGadget(#PB_Any, 5, 5, 300, 300, "Файлы", 200, #PB_ListIcon_FullRowSelect | #LVS_NOCOLUMNHEADER) hImgList = ImageList_Create_(Size, Size, #ILC_COLOR32 | #ILC_MASK, 1, 1) ; Подготовим тестовую иконку (квадрат) нужного размера ImageList_AddIcon_(hImgList, hIcon1) ImageList_AddIcon_(hImgList, hIcon2) ImageList_AddIcon_(hImgList, hIcon3) ; Иконки уже в ImageList, оригинал можно удалить DestroyIcon_(hIcon1) DestroyIcon_(hIcon2) DestroyIcon_(hIcon3) SendMessage_(GadgetID(ListIcon_ID), #LVM_SETIMAGELIST, #LVSIL_SMALL, hImgList) ; 4. Добавляем данные For i = 0 To 2 AddItem(i, i, "Программа: " + Str(i)) Next Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow EndIf Последний раз редактировалось: AZJIO (2026-03-10 19:40), всего редактировалось 1 раз |
Страница 2 из 16
Текущее время: 24-Апр 17:06
Часовой пояс: UTC + 3
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы |


Вход
Регистрация
Отправлено: 








. Может лучше сделать отдельную утилиту для установки софта? Но если нужен такой фунционал в лаунчере то сделаю.

.
.