PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Аналог "панели быстрого запуска" Windows


Аналог "панели быстрого запуска" Windows

Сообщений 1 страница 3 из 3

1

Эта программа создаёт значок в трее, при клике по которому, появляется меню, с помощью которого, можно запускать заранее выбранные программы, или отредактировать спискок уже существующий программ.

Код:
; Программа для быстрого запуска приложений из трея
; Автор - Пётр.
; Компиляция производилась в PB4.00
; Нужны библиотеки PBOSL, XP_Menu_Lib и Droopy


Structure Struct
 Name.s         ; Имя программ
 Path.s         ; Путь к программе
 Key.s          ; Ключи
 ItemMenu.l     ; Здесь будет хранится идентификатор меню
EndStructure

#PrefName="config.ini" 

Global NewList DataProg.Struct() ; Создаём динамический список с прикрученой к нему структурой

Procedure WindowCallback(WindowID, Message, wParam, lParam) ; Системный обработчик событий
XP_Menu_CB(WindowID, Message, wParam, lParam)
ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure

Procedure Create_Menu() ; Постоение меню

If CreatePopupMenu(0)

 ID=MenuID(0)

 ItemMenu=20
 ForEach DataProg()
  MenuItem(ItemMenu, DataProg()\Name)
  x=ExtractIcon_(0,DataProg()\Path,0)
  XP_SetMenuIcon(ID, ItemMenu, ExtractIcon_(0,DataProg()\Path,0) )
  DataProg()\ItemMenu=ItemMenu
  ItemMenu+1
 Next

 MenuBar() 
 OpenSubMenu("Настройки")
  MenuItem(1, "Добавить/удалить...")
  MenuItem(2, "Открыть Файл настроек")
 CloseSubMenu()
 MenuItem(3, "Выход") 
 
 XP_MenuRegister(MenuID(0), #XP_RegMenu, #XP_RegPopupMenu) ; Регистрация меню в библиотеке XP_Menu_Lib
 XP_SetMenuStyle(#XP_Style2003) ; Стиль меню - стиль "Офис  2003"
 
 ForEach DataProg()
  XP_SetMenuIcon(ID, DataProg()\ItemMenu, ExtractIcon_(0,DataProg()\Path,0) ) ; Добавляем значки в меню
 Next
 
EndIf

EndProcedure

Procedure SavePref() ; Сожнаняем данные о файлах
 Result=CreatePreferences(#PrefName)
 If  Result
   ForEach DataProg()
     PreferenceGroup(DataProg()\Name)
     WritePreferenceString("Path", DataProg()\Path)
     WritePreferenceString("Key", DataProg()\Key)
   Next
  ClosePreferences()
 EndIf
ProcedureReturn  Result
EndProcedure

Procedure LoadPref() ; Читаем данные о файлах
If OpenPreferences(#PrefName)
       If ExaminePreferenceGroups()
         Repeat
           If NextPreferenceGroup()<>0
            Name.s=PreferenceGroupName()
             If Name<>""
               ;Name.s=ReadPreferenceString("name", "")
               Path.s=ReadPreferenceString("Path", "")
               If FileSize(Path)>0
                 AddElement( DataProg() )
                 DataProg()\Name=Name
                 DataProg()\Path=Path
                 DataProg()\Key=ReadPreferenceString("Key", "")
               EndIf
             EndIf
           Else
             Break
           EndIf
         ForEver
       EndIf
    ClosePreferences()
Else
 If MessageRequester("ERROR", "Файл config.ini не найден! Создать его?", #PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
  AddElement( DataProg() )
  DataProg()\Name="cmd"
  DataProg()\Path=GetSystemDirectory()+"\cmd.exe"
  DataProg()\Key="?"
  If SavePref()=0
   MessageRequester("Проблема", "Не удалось создать файл!"+Chr(10)+"Работа программы завершена!", #MB_OK|#MB_ICONERROR)
   End
  EndIf
 Else
  End
 EndIf
EndIf
EndProcedure

Procedure UpdateListIcon() ; Заполняем таблицу - ListIconGadget
ClearGadgetItemList(0) ; Очищаем таблицу
x=0 
 ForEach DataProg()
   AddGadgetItem(0,x,DataProg()\Name,ExtractIcon_(0,DataProg()\Path,0))
   SetGadgetItemText(0, x, DataProg()\Path, 1)
   SetGadgetItemText(0, x, DataProg()\Key, 2)
   SetGadgetItemText(0, x, Str(DataProg()\ItemMenu), 3)
   x+1
 Next
 
EndProcedure

Procedure ADD_Window(Title.s, TablNumber, State) ; Окно добавления/редактирования

 If State<>0
  State=1
 EndIf

  If OpenWindow(1, 0, 0, 400, 140, Title, #PB_Window_SystemMenu|#PB_Window_WindowCentered,WindowID(0)) And CreateGadgetList(WindowID(1))
     DisableWindow(0,1) ; Блокируем основное окно
     
     TextGadget(20,4,20,100,15,"Имя программы")
     StringGadget(21,108,16,280,20,"")
     TextGadget(22,4,50,100,15,"Путь к программе")
     StringGadget(23,108,46,250,20,"")
     ButtonGadget(24,364,46,30,20,"...")
     TextGadget(25,4,80,100,15,"Ключи")
     StringGadget(26,108,76,280,20,"")
     ButtonGadget(27,200,108,70,24,"Ок")
     ButtonGadget(28,300,108,70,24,"Отмена")
     
     If State=0
      SetGadgetText(21,GetGadgetItemText(0,TablNumber,0))
      SetGadgetText(23,GetGadgetItemText(0,TablNumber,1))
      SetGadgetText(26,GetGadgetItemText(0,TablNumber,2))
     EndIf
      
     
    Repeat
      Event = WaitWindowEvent() 
      Gadget=EventGadget()
      
       If Event = #PB_Event_SysTray 
         MessageBeep(#MB_OK) ; Ну типа мы сейчас не готовы обрабатывать события трея
         FlashWindow(WindowID(1),50,5)
         ForegroundWindowSet(WindowID(1))
         SetActiveWindow(1)
       EndIf
      
      If Event = #PB_Event_Gadget
        Select Gadget
          Case 24 ; Кнопка "..."
           String.s=GetGadgetText(23)
           If FileSize(String)>0
            Path.s=GetPathPart(String)
           Else
            Path.s=""
           EndIf
           File.s=OpenFileRequester("",Path ,"Исполняемые файлы|*.exe|Все файлы|*.*",0)
            If FileSize(File)>0
             SetGadgetText(23,File)
              If GetGadgetText(21)="" ; Если поле "Имя программы" пустое, то автоматически формируем имя
                Name.s=GetFilePart(File)
                Extension.s=GetExtensionPart(File)
                If LCase(Extension)="exe" ; Если расширение "exe", то убираем его
                 Name=Left(Name,Len(Name)-Len(Extension)-1)
                EndIf
                SetGadgetText(21,Name)
              EndIf
            EndIf
            
          Case 27 ; Кнопка "Ок"
             If GetGadgetText(21)<>"" And FileSize(GetGadgetText(23))>0 ; Убеждаемся в правильности данных
               Count=CountGadgetItems(0)-1 ; Количество строк в списке - ListIconGadget
               Name.s=GetGadgetText(21)
               z=0
               If State=1
                For i=0 To Count ; Проверяем чтобы небыло диблирования имён
                 If Name=GetGadgetItemText(0,i,0)
                   z=1
                   MessageRequester("Повторное имя", "Программа с таким именем уже существует!"+Chr(10)+"Выберите другое ммя", #MB_OK|#MB_ICONWARNING) 
                   Break
                 EndIf
                Next i
               EndIf
             
              
              If z=0
              
                If State=1 ; Добавление программы
                 AddGadgetItem(0,TablNumber+State, Name, ExtractIcon_(0,GetGadgetText(23),0))
                Else ; Редактирование
                 SetGadgetItemText(0, TablNumber+State, Name, 0)
                EndIf
                SetGadgetItemText(0, TablNumber+State, GetGadgetText(23), 1)
                SetGadgetItemText(0, TablNumber+State, GetGadgetText(26), 2)
                
                If State=1
                   y=20
                   Repeat ; Ищем иникальный идентификатор для пунка меню
                    v=0
                     For i=0 To Count
                       If y=Val(GetGadgetItemText(0,i,3))
                        v=1
                        Break
                       EndIf
                     Next i
                     If v=0
                      SetGadgetItemText(0, TablNumber+State, Str(y), 3)
                      Break
                     EndIf
                    y+1
                   ForEver
                 EndIf
              
               Break
              
              EndIf
             Else
              MessageRequester("Упс", "Одно из полей не заполнено"+Chr(10)+"или введены некорректные данные!", #MB_OK|#MB_ICONWARNING)
             EndIf
          Case 28 ; Кнопка "Отмена"
           Break
        EndSelect
      EndIf
      
      
    Until Event = #PB_Event_CloseWindow
    CloseWindow(1)
  EndIf
  DisableWindow(0,0)  
EndProcedure


If OpenWindow(0, 0, 0, 500, 300, "Настройки", #PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  
  ListIconGadget(0,4,4,492,250,"Имя",100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_HeaderDragDrop|#PB_ListIcon_AlwaysShowSelection)
     AddGadgetColumn(0,1,"Путь к программе",248)
     AddGadgetColumn(0,2,"Ключи",88)
     AddGadgetColumn(0,3,"ID",30)
  ButtonGadget(1,10,264,80,28,"Добавить")
  ButtonGadget(2,100,264,80,28,"Удалить")
  ButtonGadget(3,190,264,90,28,"Редактировать")
  ButtonGadget(4,340,264,70,28,"ОК")
  ButtonGadget(5,420,264,70,28,"Отмена")
  
  
  AddSysTrayIcon(1, WindowID(0),ExtractIcon_(0,GetEnvironmentVariable("windir")+"\system32"+"\utilman.exe",0))
  SysTrayIconToolTip(1, "Быстрый запуск программ")
  
  
  SetWindowCallback(@WindowCallback(),0) 
  ;HideWindow(0,0)
  LoadPref()
  UpdateListIcon()
  Create_Menu()

  
 
  
 Repeat
  Event = WaitWindowEvent() 
  Gadget=EventGadget()
  Menu=EventMenu()
  Type=EventType()
  Window=EventWindow()
  
     If Event = #PB_Event_SysTray 
       If Type = #PB_EventType_RightClick
        DisplayPopupMenu(0, WindowID(0))
       EndIf 
     EndIf
     
   
   If Event = #PB_Event_Menu 
     Select  Menu
        Case 1 ; Пункт меню "Добавить/удалить..."
         UpdateListIcon()
         HideWindow(0,0)
        Case 2 ; Пункт меню "Открыть Файл настроек"
         RunProgram(#PrefName)
        Case 3 ; Пункт меню "Выход"
         Break
        Default ; Другие пункты
          ForEach DataProg()
           If DataProg()\ItemMenu=Menu ; Нашли пункт в котором произошло событие
              If DataProg()\Key<>""
               Parameter.s="/"+DataProg()\Key ; Пареметр для проги
              Else
               Parameter.s=""
              EndIf
            RunProgram(DataProg()\Path, Parameter,"C:\",#PB_Program_Open)
            Break
           EndIf
          Next
        
     EndSelect
   EndIf
   
   If Window=0
     If Event = #PB_Event_CloseWindow
       HideWindow(0,1)
     EndIf
     
     
    If Event = #PB_Event_Gadget
       Select Gadget
         Case 0 ; Таблица - ListIconGadget
             If Type=#PB_EventType_LeftDoubleClick ; Двойной колик левой кнопкой мышки
               Goto KlikEdit
             EndIf
         Case 1 ; Кнопка "Добавить"
          x=GetGadgetState(0)
          If x<0 And CountGadgetItems(0)>0
           MessageRequester("Ну и куда добавлять?", "В таблице не выбранна текушая программа!", #MB_OK|#MB_ICONWARNING)
          Else
           ADD_Window("Добавление программы",x, 1)
          EndIf
         Case 2 ; Кнопка "Удалить"
          x=GetGadgetState(0)
          If x<0
           MessageRequester("Ну и что удалить?", "В таблице не выбранна текушая программа!", #MB_OK|#MB_ICONWARNING)
          Else
           RemoveGadgetItem(0, x)
          EndIf
         Case 3 ; Кнопка "Редактировать"
         KlikEdit:
          x=GetGadgetState(0)
          If x<0
           MessageRequester("Ну и что редактировать?", "В таблице не выбранна текушая программа!", #MB_OK|#MB_ICONWARNING)
          Else
           ADD_Window("Редактирование",x, 0)
          EndIf
         Case 4 ; Кнопка "ОК"
            ClearList(DataProg()) ; Очищаем динамический список
            Count=CountGadgetItems(0)-1 ; Количество строк в списке - ListIconGadget
            For i=0 To Count ; Копируем данные из таблицы в динамический список
              AddElement(DataProg())
              DataProg()\Name=GetGadgetItemText(0, i, 0)
              DataProg()\Path=GetGadgetItemText(0, i, 1)
              DataProg()\Key=GetGadgetItemText(0, i, 2)
              DataProg()\ItemMenu=Val(GetGadgetItemText(0, i, 3))
            Next i
            
            XP_MenuRegister(MenuID(0), #XP_DelMenu, #XP_RegPopupMenu) ; Отменяем регистрацию меню в библиотеке XP_Menu_Lib
            FreeMenu(0) ; Удаляем меню
            Create_Menu() ; Заново строим меню
            SavePref() ; Сохраняем данные в файле
            
           HideWindow(0,1)

         Case 5 ; Кнопка "Отмена"
          HideWindow(0,1)
       EndSelect
    EndIf
   EndIf
  
  

  ForEver

  
EndIf
End

0

2

Пётр написал(а):

Нужны библиотеки PBOSL, XP_Menu_Lib и Droopy

а как их подключить в проект?

0

3

Библиотеки дополнительных функций специально подключать не нужно, это уже "головная боль" компилятора.
Их достаточно один раз установить, как правило, просто извлечь из архива в папку с PureBasic.
Найти их можно здесь

0


Вы здесь » PureBasic - форум » OpenSource » Аналог "панели быстрого запуска" Windows