PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)


Вопросы новичка (продолжение…)

Сообщений 631 страница 660 из 974

631

lakomet
1 - рисунок один но из него вытаскиваются 32*32.
тоесть - пол - 0,0, стена - 0, 32, вода - 0, 64 и сам игрок 254, 0 (труп игрока 254, 32) ;-)
и нужно это все поместить в *.exe :-)

Код:
images_my(0,0) = images( 0,0 )
images_my(1,0) = images( 0,32 )
images_my(2,0) = images( 32,0 )

;-)

Отредактировано GGGraz (31.10.2011 19:38:50)

0

632

То есть, нужно чтобы в програме был один большой рисунок, содержащий нескоько других рисунков и нужно разобрать этот рисунок на части?
Тогда можно сделать так:

Код:
CatchImage(0, ?images_my1)

GrabImage(0, 1, 0, 0, 32, 32) ; пол.
GrabImage(0, 2, 0, 32, 32, 32) ; стена.
GrabImage(0, 3, 0, 64, 32, 32) ; вода.
GrabImage(0, 4, 254, 0, 32, 32) ; сам игрок.
GrabImage(0, 5, 254, 32, 32, 32) ; труп игрока.
End

DataSection
  images_my1:  IncludeBinary "Image.bmp" ; Путь к рисунку. Допустимы и другие расширения при подключении соответствующих декодеров.
EndDataSection

0

633

GGGraz написал(а):

То есть его не получится срастить с exe

Почему не получается?
Прочитай описание оператора IncludeBinary
http://purebasic.ru/manual.php?id=1086&lng=rus

При компиляции, подключаемый файл будет внедрен в EXE.

0

634

ой, и правдо :-)

0

635

Как узнать какие папки расшаренны на компьютере в локальной сети?
И какие папки с полным доступом, а какие только для чтения?

0

636

Виталий
Так наверное

Код:
Directory$ = "путь до компа на котором будем искать расшареные папки"
If ExamineDirectory(0, Directory$, "*.*")  
     While NextDirectoryEntry(0)
          Debug Directory$+DirectoryEntryName(0) +"----------"+Str(GetFileAttributes(Directory$+DirectoryEntryName(0)))
     Wend
     FinishDirectory(0)
EndIf

0

637

lakomet написал(а):

ВиталийТак наверноеКод:Directory$ = "путь до компа на котором будем искать расшареные папки"
If ExamineDirectory(0, Directory$, "*.*") 
     While NextDirectoryEntry(0)
          Debug Directory$+DirectoryEntryName(0) +"----------"+Str(GetFileAttributes(Directory$+DirectoryEntryName(0)))
     Wend
     FinishDirectory(0)
EndIf

Так пробовал.  ;)  Не чего не выдаёт  :dontknow:

0

638

Виталий написал(а):

Не чего не выдаёт

В окне дебагера пусто? :huh:
А если не пусто то скопируй сюда всё что там есть, и если не секрет, покажи адрес который вставляешь в переменную Directory$

0

639

Всем привет.
Понадобилось сделать "USB-переключатель" для переключения аудио выхода ПК на колонки или телек.
Управлятся будет одной релюхой. НЗ - колонки, НА - телек.
Накидал такую прогу:

Код:
;-----------------------USB-переключатель-------------------------

;{---------Запрет на запуск программы более одного раза-----------  
a = CreateSemaphore_(#Null,0,1,"USB-переключатель") 
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS 
  CloseHandle_(a) 
  End 
EndIf 
;}---------------------------------------------------------------

;{----------------------Глобальные переменные---------------------
#NO_Device="Нет связи с USB-переключателем"               ;сообщения программы
Global IN_TV.s="телевизор"                               ;сообщения программы
Global IN_Speakers.s="колонки"                           ;сообщения программы
#USB_PID=$EF02                                            ;идентификатор PID
#USB_VID=$AAAA                                            ;идентификатор VID
;}

Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
valueName$=ProgramFilename() 
 GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
 If GetHandle = #ERROR_SUCCESS
  If State=1
   RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
  Else
   RegDeleteValue_(hKey, @ProgName)
  EndIf
  RegCloseKey_(hKey)
 EndIf
EndProcedure

Procedure FindDevice_Timer() ; таймер - процедура проверки подключения нашего устройства
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID)
 If Test<>Old_Test
  Old_Test=Test 
  If Test 
     HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
     W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
     R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
      SetGadgetText(56, "USB-переключатель подключён")
      ;SetGadgetColor(56, #PB_Gadget_FrontColor, $00FF0F) 
    Else
     HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
     R_DeviceHandle=0 : W_DeviceHandle=0
      SetGadgetText(56, #NO_Device)
      ;SetGadgetColor(56, #PB_Gadget_FrontColor, $0000FF)
    EndIf
  EndIf
  
EndProcedure

Procedure DateStatusBar() 
  ; Эта процедура вызывается по таймеру два раза в секунду.
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  Date.s = FormatDate("%dd.%mm.%yyyy", Date() ) ; узнаем дату
  StatusBarText(0, 0,Date, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 0.
  StatusBarText(0, 2,Time, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 2.
  
EndProcedure 

OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
StickyWindow(0,1);поверх всех открытых окон 
TextGadget(56,0,0,230,15,#NO_Device, #PB_Text_Center)

TextGadget(53, 33, 17, 50 ,15,"Выход на ")
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)

;--------------------Кнопка-------------------
ButtonGadget(21,65,33,100,23,"Переключить",#PB_Button_Toggle)

;-----------Создаём строку состояния-----------
   CreateStatusBar(0, WindowID(0))
   ; Делим её на области
   AddStatusBarField(70)
   AddStatusBarField(90)
   AddStatusBarField(70)
  StatusBarText(0, 1,"Дата и время", #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 1.
  OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
  CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"

;-----------Системный трей----------- 
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "USB-переключатель") 
;Добавим к иконке меню
CreatePopupMenu(68) 
MenuItem(1, "Развернуть") 
MenuItem(2, "Свернуть") 
MenuItem(3, "Колонки") 
MenuItem(4, "Телевизор")
MenuBar() 
MenuItem(10, "Выход")   

;--------------------Главный цикл---------------------
Repeat 
  
  Event= WaitWindowEvent() 
  Window=EventWindow() 
  Gadget=EventGadget()
  
  If Event = #PB_Event_SysTray     
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
         DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню 
    EndIf     
  EndIf 
  
If Event = #PB_Event_Menu 
Select EventMenu() 
Case 1 ;"Развернуть"  
HideWindow(0, 0)
SetWindowState(0, #PB_Window_Normal)     
Case 2 ;"Свернуть" 
  HideWindow(0, 1)
Case 3 ;"Колонки"  
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)   
Case 4 ;"Телевизор" 
 TextGadget(54, 83, 17, 80 ,15, IN_TV)
Case 10 ;"Выход"
  Break
    EndSelect 
  EndIf 
  
  If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
    HideWindow(0,1) ;свернуть окно
  EndIf
  
  ;{----------События компонентов----------
  
If Event=#PB_Event_Gadget
    
  Select EventGadget()
    Case 21
          Select GetGadgetState(21)
            Case 0   
        TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
      Case 1
      TextGadget(54, 83, 17, 80 ,15, IN_TV)
          EndSelect        
    EndSelect    
    
  EndIf 
  ;}-------------------------------------
  
Until Event = #PB_Event_CloseWindow ;Конец главного цикла
  ; Вызываем функцию "KillTimer"
  CallFunction(0,"KillTimer",WindowID(0),1)
   ; Закрываем файл "user32.dll".
  CloseLibrary(0)

А как организовать передачу команды в USB я, честно говоря, не особо представляю.
Падскажите как это сделать?

0

640

Вопрос снят. Разобрался.

0

641

max написал(а):

А как организовать передачу команды в USB

С помощью функции HID_Lib_WriteDevice().

0

642

Еще раз привет.

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

С помощью функции HID_Lib_WriteDevice().

Так и сделал.
Теперь другая проблема: девайс не определяется. В чем межет быть дело?

Код:
;-----------------------USB-переключатель-------------------------

;{---------Запрет на запуск программы более одного раза-----------  
a = CreateSemaphore_(#Null,0,1,"USB-переключатель") 
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS 
  CloseHandle_(a) 
  End 
EndIf 
;}---------------------------------------------------------------

;{----------------------Глобальные переменные---------------------
#Name="USB-переключатель"
#NO_Device="Нет связи с USB-переключателем"               ;сообщения программы
Global IN_TV.s="телевизор"                               ;сообщения программы
Global IN_Speakers.s="колонки"                           ;сообщения программы
Global R_DeviceHandle, W_DeviceHandle
#USB_PID=$EF02                                            ;идентификатор PID
#USB_VID=$AAAA                                            ;идентификатор VID
;}

Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
valueName$=ProgramFilename() 
 GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
 If GetHandle = #ERROR_SUCCESS
  If State=1
   RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
  Else
   RegDeleteValue_(hKey, @ProgName)
  EndIf
  RegCloseKey_(hKey)
 EndIf
EndProcedure

Procedure FindDevice_Timer()
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID)
 If Test<>Old_Test
  Old_Test=Test 
  If Test 
     HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
     W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
     R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
     SetGadgetText(56, "USB-переключатель подключён")
  Else
     HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
     R_DeviceHandle=0 : W_DeviceHandle=0
     SetGadgetText(56, #NO_Device)
  EndIf
 EndIf
EndProcedure

Procedure SendDevice()
Command.a=0
Dim OutBytes.a(2)  
;For i=4 To 1 Step -1
  If GetGadgetState(1)=1
    Command | 1
  Else
    Command & %11111110
  EndIf
  Command << 1
;Next i
If W_DeviceHandle
  OutBytes(0) = 0
  OutBytes(1) = Command
  HID_Lib_WriteDevice(W_DeviceHandle, @OutBytes(), 2)
Else
  MessageRequester(#Name, #NO_Device, 16)
EndIf
EndProcedure

Procedure DateStatusBar() 
  ; Эта процедура вызывается по таймеру два раза в секунду.
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  Date.s = FormatDate("%dd.%mm.%yyyy", Date() ) ; узнаем дату
  StatusBarText(0, 0,Date, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 0.
  StatusBarText(0, 2,Time, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 2.
  
EndProcedure 

OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
StickyWindow(0,1);поверх всех открытых окон 
TextGadget(56,0,0,230,15,#NO_Device, #PB_Text_Center)

TextGadget(53, 33, 17, 50 ,15,"Выход на ")
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)

;--------------------Кнопка-------------------
ButtonGadget(1,65,33,100,23,"Переключить",#PB_Button_Toggle)

HideWindow(0,0)

FindDevice_Timer()
AddWindowTimer(0, 2, 400)

;-----------Создаём строку состояния-----------
   CreateStatusBar(0, WindowID(0))
   ; Делим её на области
   AddStatusBarField(70)
   AddStatusBarField(90)
   AddStatusBarField(70)
  StatusBarText(0, 1,"Дата и время", #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 1.
  OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
  CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"

;-----------Системный трей----------- 
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "USB-переключатель") 
;Добавим к иконке меню
CreatePopupMenu(68) 
MenuItem(1, "Развернуть") 
MenuItem(2, "Свернуть") 
MenuItem(3, "Колонки") 
MenuItem(4, "Телевизор")
MenuBar() 
MenuItem(10, "Выход")   

;--------------------Главный цикл---------------------
Repeat 
  
  Event= WaitWindowEvent() 
  Window=EventWindow() 
  Gadget=EventGadget()
  
  If Event=#PB_Event_Timer
       If EventTimer()=2
         FindDevice_Timer()
        EndIf
     EndIf
  
  If Event = #PB_Event_SysTray     
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
         DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню 
    EndIf     
  EndIf 
  
If Event = #PB_Event_Menu 
Select EventMenu() 
Case 1 ;"Развернуть"  
HideWindow(0, 0)
SetWindowState(0, #PB_Window_Normal)     
Case 2 ;"Свернуть" 
  HideWindow(0, 1)
Case 3 ;"Колонки"  
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)   
Case 4 ;"Телевизор" 
 TextGadget(54, 83, 17, 80 ,15, IN_TV)
Case 10 ;"Выход"
  Break
    EndSelect 
  EndIf 
  
  If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
    HideWindow(0,1) ;свернуть окно
  EndIf
  
  ;{----------События компонентов----------
  
If Event=#PB_Event_Gadget
  
  Select EventGadget()
    Case 1
          Select GetGadgetState(1)
            Case 0   
                SendDevice()
        TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
      Case 1
        TextGadget(54, 83, 17, 80 ,15, IN_TV)
          SendDevice()
          EndSelect        
    EndSelect    
    
  EndIf 
  ;}-------------------------------------
  
Until Event = #PB_Event_CloseWindow ;Конец главного цикла
  ; Вызываем функцию "KillTimer"
  CallFunction(0,"KillTimer",WindowID(0),1)
   ; Закрываем файл "user32.dll".
  CloseLibrary(0)

И еще. Как добавить программу в автозагрузку по умолчанию?

Отредактировано max (05.11.2011 20:46:41)

0

643

max написал(а):

Теперь другая проблема: девайс не определяется.

PID и VID правильные?

max написал(а):

И еще. Как добавить программу в автозагрузку по умолчанию?

Вызвать процедуру ProgramAtStartup() при запуске программы.
Она добавит программу в автозагрузку.

0

644

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

PID и VID правильные?

Как всегда :blush:

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

Вызвать процедуру ProgramAtStartup() при запуске программы.

То есть так:

Код:
OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
ProgramAtStartup(1, "USB-переключатель");"Добавить в автозагрузку"

0

645

max написал(а):

То есть так:

Можно и так, но нужно учитывать тот факт, что запускать программу нужно в той папке, в которой она будет работать, ведь она сразу прописывается в автозагрузку.
Чтобы прога не лезла в автозагрузку во время запуска из среды PureBasic, нужно использовать условную компиляцию:

Код:
OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
CompilerIf #PB_Editor_CreateExecutable
  ProgramAtStartup(1, "USB-переключатель");"Добавить в автозагрузку"
CompilerEndIf

На вкладке "Константы" свойств проекта, нужно разрешить константу #PB_Editor_CreateExecutable.

0

646

Ну и, наверное, последние. По кнопке светодиод загорается, а как сделать чтобы из всплывающего меню?

0

647

max написал(а):

а как сделать чтобы из всплывающего меню?

Обработать события меню и если кликнули по требуемому пункту, то включить светодиод.
Пример из справки:

Код:
  If OpenWindow(0, 200, 200, 200, 120, "Popup-Menu Example")
    If CreatePopupMenu(0)      ; creation of the pop-up menu begins...
      MenuItem(1, "Open")      ; You can use all commands for creating a menu
      MenuItem(2, "Save")      ; just like in a normal menu...
      MenuItem(3, "Save as")
      MenuItem(4, "Quit")
      MenuBar()
      OpenSubMenu("Recent files")
        MenuItem(5, "PureBasic.exe")
        MenuItem(6, "Test.txt")
      CloseSubMenu()
    EndIf
    Repeat
      Select WaitWindowEvent()     ; check for window events
        Case #WM_RBUTTONDOWN       ; right mouse button was clicked =>
          DisplayPopupMenu(0, WindowID(0))  ; now display the popup-menu
        Case #PB_Event_Menu        ; an item of the popup-menu was clicked
          Select EventMenu()     ; get the clicked menu item...
            Case 1 : Debug "Menu: Open"
            Case 2 : Debug "Menu: Save"
            Case 3 : Debug "Menu: Save as"
            Case 4 : Quit = 1
            Case 5 : Debug "Menu: PureBasic.exe"
            Case 6 : Debug "Menu: Text.txt"
          EndSelect
        Case #PB_Event_CloseWindow
          Quit = 1
      EndSelect
    Until Quit = 1
  EndIf

0

648

Это все понятно. Вся проблема в том, что я не нашел как это сделать.
Вот все, что я сейчас сделал:

Код:
;-----------------------USB-переключатель-------------------------

;{---------Запрет на запуск программы более одного раза-----------  
a = CreateSemaphore_(#Null,0,1,"USB-переключатель") 
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS 
  CloseHandle_(a) 
  End 
EndIf 
;}---------------------------------------------------------------

;{----------------------Глобальные переменные------------------
#USB_PID=$EF22
#USB_VID=$AAAA
#Name="USB-переключатель"
#NO_Device="Нет связи с USB-переключателем"
Global IN_TV.s="телевизор"                               ;сообщения программы
Global IN_Speakers.s="колонки"                           ;сообщения программ
Global R_DeviceHandle, W_DeviceHandle
;}---------------------------------------------------------------

Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
valueName$=ProgramFilename() 
 GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
 If GetHandle = #ERROR_SUCCESS
  If State=1
   RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
  Else
   RegDeleteValue_(hKey, @ProgName)
  EndIf
  RegCloseKey_(hKey)
 EndIf
EndProcedure

Procedure FindDevice_Timer()
Static Old_Test
Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID)
 If Test<>Old_Test
  Old_Test=Test 
  If Test 
     HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
     W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
     R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
     SetGadgetText(0,"USB-переключатель подключён")
  Else
     HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
     R_DeviceHandle=0 : W_DeviceHandle=0
     SetGadgetText(0,#NO_Device)
  EndIf
 EndIf
EndProcedure

Procedure SendDevice()
Command.a=0
Dim OutBytes.a(2)  
If GetGadgetState(5)=1
    Command | 1
       TextGadget(54, 83, 17, 80 ,15, IN_TV)
  Else
    Command & %11111110
    TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
  EndIf
  Command << 1
If W_DeviceHandle
  OutBytes(0) = 0
  OutBytes(1) = Command
  HID_Lib_WriteDevice(W_DeviceHandle, @OutBytes(), 2)
Else
  MessageRequester(#Name, #NO_Device, 16)
EndIf
EndProcedure

Procedure DateStatusBar() 
  ; Эта процедура вызывается по таймеру два раза в секунду.
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  Date.s = FormatDate("%dd.%mm.%yyyy", Date() ) ; узнаем дату
  StatusBarText(0, 0,Date, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 0.
  StatusBarText(0, 2,Time, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 2.
  
EndProcedure

OpenWindow(0,0,0,230,83,#Name,#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
CompilerIf #PB_Editor_CreateExecutable
  ProgramAtStartup(1, "USB-переключатель");"Добавить в автозагрузку"
CompilerEndIf
StickyWindow(0,1);поверх всех открытых окон 
  TextGadget(0,0,0,230,15,#NO_Device, #PB_Text_Center)
   ButtonGadget(5,65,33,100,23,"Переключить",#PB_Button_Toggle)
   TextGadget(2, 33, 17, 50 ,15,"Выход на ")
   TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
   
   ;-----------Создаём строку состояния-----------
   CreateStatusBar(0, WindowID(0))
   ; Делим её на области
   AddStatusBarField(70)
   AddStatusBarField(90)
   AddStatusBarField(70)
  StatusBarText(0, 1,"Дата и время", #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 1.
  OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
  CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"
  
  ;-----------Системный трей----------- 
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "USB-переключатель") 
;Добавим к иконке меню
CreatePopupMenu(68) 
MenuItem(1, "Развернуть") 
MenuItem(2, "Свернуть") 
MenuItem(3, "Колонки") 
MenuItem(4, "Телевизор")
MenuBar() 
MenuItem(10, "Выход")   

HideWindow(0,0)

FindDevice_Timer()
AddWindowTimer(0, 2, 400)

Repeat
   Event=WaitWindowEvent()
   If Event=#PB_Event_Timer
       If EventTimer()=2
         FindDevice_Timer()
       EndIf
       
   ElseIf Event=#PB_Event_Gadget
     Select EventGadget()
       Case 5
         SendDevice()
     EndSelect
   EndIf
   
   If Event = #PB_Event_SysTray     
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
         DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню 
    EndIf     
  EndIf   
  
If Event = #PB_Event_Menu 
Select EventMenu() 
Case 1 ;"Развернуть"  
HideWindow(0, 0)
SetWindowState(0, #PB_Window_Normal)     
Case 2 ;"Свернуть" 
  HideWindow(0, 1)
Case 3 ;"Колонки"  
  SendDevice()
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)   
Case 4 ;"Телевизор" 
  SendDevice()
 TextGadget(54, 83, 17, 80 ,15, IN_TV)
Case 10 ;"Выход"
  Break
    EndSelect 
  EndIf   
  
    If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
    HideWindow(0,1) ;свернуть окно
  EndIf
   
 Until Event=#PB_Event_CloseWindow
   ; Вызываем функцию "KillTimer"
  CallFunction(0,"KillTimer",WindowID(0),1)
   ; Закрываем файл "user32.dll".
  CloseLibrary(0)

При нажатии нужного пункта в сплывающем меню текст в окне меняется, но данные в USB не передаются.

0

649

max написал(а):

При нажатии нужного пункта в сплывающем меню текст в окне меняется, но данные в USB не передаются.

Данные  скорее всего передаются, только вот, передаваемые данные не зависят от выбора пункта меню.
Посмотри, в процедуре SendDevice(), при передаче команды, анализируется состояние кнопки, а оно меняется при выборе пункта меню?
С минимальными переделками кода, можно сделать так:

Код:
;-----------------------USB-переключатель-------------------------

;{---------Запрет на запуск программы более одного раза-----------  
a = CreateSemaphore_(#Null,0,1,"USB-переключатель") 
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS 
  CloseHandle_(a) 
  End 
EndIf 
;}---------------------------------------------------------------

;{----------------------Глобальные переменные------------------
#USB_PID=$EF22
#USB_VID=$AAAA
#Name="USB-переключатель"
#NO_Device="Нет связи с USB-переключателем"
Global IN_TV.s="телевизор"                               ;сообщения программы
Global IN_Speakers.s="колонки"                           ;сообщения программ
Global R_DeviceHandle, W_DeviceHandle
;}---------------------------------------------------------------

Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
  valueName$=ProgramFilename() 
  GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
  If GetHandle = #ERROR_SUCCESS
    If State=1
      RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
    Else
      RegDeleteValue_(hKey, @ProgName)
    EndIf
    RegCloseKey_(hKey)
  EndIf
EndProcedure

Procedure FindDevice_Timer()
  Static Old_Test
  Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID)
  If Test<>Old_Test
    Old_Test=Test 
    If Test 
      HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
      W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
      R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
      SetGadgetText(0,"USB-переключатель подключён")
    Else
      HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
      R_DeviceHandle=0 : W_DeviceHandle=0
      SetGadgetText(0,#NO_Device)
    EndIf
  EndIf
EndProcedure

Procedure SendDevice()
  Command.a=0
  Dim OutBytes.a(2)  
  If GetGadgetState(5)=1
    Command | 1
    TextGadget(54, 83, 17, 80 ,15, IN_TV)
  Else
    Command & %11111110
    TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
  EndIf
  Command << 1
  If W_DeviceHandle
    OutBytes(0) = 0
    OutBytes(1) = Command
    HID_Lib_WriteDevice(W_DeviceHandle, @OutBytes(), 2)
  Else
    MessageRequester(#Name, #NO_Device, 16)
  EndIf
EndProcedure

Procedure DateStatusBar() 
  ; Эта процедура вызывается по таймеру два раза в секунду.
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  Date.s = FormatDate("%dd.%mm.%yyyy", Date() ) ; узнаем дату
  StatusBarText(0, 0,Date, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 0.
  StatusBarText(0, 2,Time, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 2.
  
EndProcedure

OpenWindow(0,0,0,230,83,#Name,#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
CompilerIf #PB_Editor_CreateExecutable
  ProgramAtStartup(1, "USB-переключатель");"Добавить в автозагрузку"
CompilerEndIf
StickyWindow(0,1);поверх всех открытых окон 
TextGadget(0,0,0,230,15,#NO_Device, #PB_Text_Center)
ButtonGadget(5,65,33,100,23,"Переключить",#PB_Button_Toggle)
TextGadget(2, 33, 17, 50 ,15,"Выход на ")
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)

;-----------Создаём строку состояния-----------
CreateStatusBar(0, WindowID(0))
; Делим её на области
AddStatusBarField(70)
AddStatusBarField(90)
AddStatusBarField(70)
StatusBarText(0, 1,"Дата и время", #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 1.
OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"

;-----------Системный трей----------- 
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "USB-переключатель") 
;Добавим к иконке меню
CreatePopupMenu(68) 
MenuItem(1, "Развернуть") 
MenuItem(2, "Свернуть") 
MenuItem(3, "Колонки") 
MenuItem(4, "Телевизор")
MenuBar() 
MenuItem(10, "Выход")   

HideWindow(0,0)

FindDevice_Timer()
AddWindowTimer(0, 2, 400)

Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_Timer
    If EventTimer()=2
      FindDevice_Timer()
    EndIf
    
  ElseIf Event=#PB_Event_Gadget
    Select EventGadget()
      Case 5
        SendDevice()
    EndSelect
  EndIf
  
  If Event = #PB_Event_SysTray     
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
      DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню 
    EndIf     
  EndIf   
  
  If Event = #PB_Event_Menu 
    Select EventMenu() 
      Case 1 ;"Развернуть"  
        HideWindow(0, 0)
        SetWindowState(0, #PB_Window_Normal)     
      Case 2 ;"Свернуть" 
        HideWindow(0, 1)
      Case 3 ;"Колонки" 
        SetGadgetState(5, 0)
        SendDevice()
        TextGadget(54, 83, 17, 80 ,15, IN_Speakers)   
      Case 4 ;"Телевизор" 
        SetGadgetState(5, 1)
        SendDevice()
        TextGadget(54, 83, 17, 80 ,15, IN_TV)
      Case 10 ;"Выход"
        Break
    EndSelect 
  EndIf   
  
  If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
    HideWindow(0,1) ;свернуть окно
  EndIf
  
Until Event=#PB_Event_CloseWindow
; Вызываем функцию "KillTimer"
CallFunction(0,"KillTimer",WindowID(0),1)
; Закрываем файл "user32.dll".
CloseLibrary(0)

PS.
В процедуре SendDevice() есть много лишнего кода, который просто не нужен в данном случае.

0

650

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

С минимальными переделками кода, можно сделать так:

Спасибо, Петр. Теперь как надо.
А можно ли сделать галочку как на картинке

http://uploads.ru/t/C/A/Q/CAQmc.png

только, чтобы галка была на том пункте меню, который нажали?

0

651

max написал(а):

А можно ли сделать галочку как на картинке

Галочка устанавливается функцией SetMenuItemState().

Код:
Result = SetMenuItemState(#Menu, MenuItem, State)

С ее помощью можно указать будет ли галка в требуемом пункте или нет.

0

652

lakomet написал(а):

Виталий написал(а):Не чего не выдаётВ
окне дебагера пусто? А если не пусто то скопируй сюда всё что там есть, и если не секрет, покажи адрес который вставляешь в переменную Directory$

Я расшариваю на своём компе пару папок и пишу вот так:
Directory$ = "\\192.168.8.217"
If ExamineDirectory(0, Directory$, "*.*") 
     While NextDirectoryEntry(0)
          Debug Directory$+DirectoryEntryName(0) +"----------"+Str(GetFileAttributes(Directory$+DirectoryEntryName(0)))
     Wend
     FinishDirectory(0)
EndIf

192.168.8.217 - это мой локальный IP, 127.0.0.1 - тоже не работает. Ну и на чужих компьютерах тоже не показывает шары
Окно debug вообще не показывается

Подскажите, как исправить?

Отредактировано Виталий (06.11.2011 15:58:01)

0

653

Спасибо. Теперь работает как надо. Хотел было успокоится на этом, но меня опять "осенило": а возможно ли в зависимомти от выбранного пункта меню менять иконку в трее?

0

654

Виталий
Адрес пишешь неправильно! Перед обратными слешами должно быть что-то ещё(незнаю что именно должно быть в винде, в лине "smb://192.168.8.217"). Попробуй так

Код:
Directory$ = PathRequester("Выбери комп на котором находится шара","C:\")
Debug Directory$
If ExamineDirectory(0, Directory$, "*.*")  
     While NextDirectoryEntry(0)
          Debug Directory$+DirectoryEntryName(0) +"----------"+Str(GetFileAttributes(Directory$+DirectoryEntryName(0)))
     Wend
     FinishDirectory(0)
EndIf

0

655

lakomet написал(а):

Адрес пишешь неправильно! Перед обратными слешами должно быть что-то ещё(незнаю что именно должно быть в винде, в лине "smb://192.168.8.217"). Попробуй такКод:Directory$ = PathRequester("Выбери комп на котором находится шара","C:\")
Debug Directory$
If ExamineDirectory(0, Directory$, "*.*") 
     While NextDirectoryEntry(0)
          Debug Directory$+DirectoryEntryName(0) +"----------"+Str(GetFileAttributes(Directory$+DirectoryEntryName(0)))
     Wend
     FinishDirectory(0)
EndIf

Так тоже не работает. :flag:

0

656

В винде адрес начинается так: http://.

0

657

Виталий
Ты скопировал код из 654 топика вставил в IDE запустил и окно дебагера не появилось, и ошибок не выдало?  :huh: о_О
Видео с экрана снимать умеешь? Если да то сними и скинь куда нибудь.

0

658

max написал(а):

В винде адрес начинается так: http://.

Ну http - это интернет адреса, а мне надо попасть на шару коспьютера, который у меня в локальной сети

0

659

max написал(а):

но меня опять "осенило"

Нет предела совершенству. :D

max написал(а):

возможно ли в зависимомти от выбранного пункта меню менять иконку в трее?

Можно.
Для этого можно использовать функцию ChangeSysTrayIcon(), описание которой можно найти в разделе SysTray. :)

0

660

Что-то наверное не так делаю, выскакивает ошибка:
http://uploads.ru/t/3/F/6/3F6Kp.jpg
Вот полный код:

Код:
;-----------------------USB-переключатель-------------------------

;{---------Запрет на запуск программы более одного раза-----------  
a = CreateSemaphore_(#Null,0,1,"USB-переключатель") 
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS 
  CloseHandle_(a) 
  End 
EndIf 
;}---------------------------------------------------------------

;{----------------------Глобальные переменные------------------
#USB_PID=$EF22                                            ;идентификатор PID
#USB_VID=$AAAA                                            ;идентификатор VID
#Name="USB-переключатель"                                 ;сообщения программы
#NO_Device="Нет связи с USB-переключателем"               ;сообщения программы
Global IN_TV.s="телевизор"                               ;сообщения программы
Global IN_Speakers.s="колонки"                           ;сообщения программы
Global R_DeviceHandle, W_DeviceHandle
;}---------------------------------------------------------------

Procedure ProgramAtStartup(State, ProgName.s) ; Управление автозагрузкой программы
  valueName$=ProgramFilename() 
  GetHandle = RegOpenKeyEx_(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Run", 0, #KEY_ALL_ACCESS, @hKey)
  If GetHandle = #ERROR_SUCCESS
    If State=1
      RegSetValueEx_(hKey, @ProgName, 0, #REG_SZ, @valueName$, Len(valueName$))
    Else
      RegDeleteValue_(hKey, @ProgName)
    EndIf
    RegCloseKey_(hKey)
  EndIf
EndProcedure

Procedure FindDevice_Timer(); таймер - процедура проверки подключения нашего устройства
  Static Old_Test
  Test=HID_Lib_DeviceTest(#USB_PID, #USB_VID)
  If Test<>Old_Test
    Old_Test=Test 
    If Test 
      HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
      W_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
      R_DeviceHandle=HID_Lib_OpenDevice(#USB_PID, #USB_VID)
      SetGadgetText(0,"USB-переключатель подключён")
    Else
      HID_Lib_CloseDevice(R_DeviceHandle) : HID_Lib_CloseDevice(W_DeviceHandle)
      R_DeviceHandle=0 : W_DeviceHandle=0
      SetGadgetText(0,#NO_Device)
    EndIf
  EndIf
EndProcedure

Procedure SendDevice()
  Command.a=0
  Dim OutBytes.a(2)  
  If GetGadgetState(5)=1
    Command | 1
    TextGadget(54, 83, 17, 80 ,15, IN_TV)
    SetMenuItemState(68,4,1)
    SetMenuItemState(68,3,0)
  Else
    Command & %11111110
    TextGadget(54, 83, 17, 80 ,15, IN_Speakers)
    SetMenuItemState(68,3,1)
    SetMenuItemState(68,4,0)
  EndIf
  Command << 1
  If W_DeviceHandle
    OutBytes(0) = 0
    OutBytes(1) = Command
    HID_Lib_WriteDevice(W_DeviceHandle, @OutBytes(), 2)
  Else
    MessageRequester(#Name, #NO_Device, 16)
  EndIf
EndProcedure

Procedure DateStatusBar(); Эта процедура вызывается по таймеру два раза в секунду.  
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  Date.s = FormatDate("%dd.%mm.%yyyy", Date() ) ; узнаем дату
  StatusBarText(0, 0,Date, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 0.
  StatusBarText(0, 2,Time, #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 2.
  
EndProcedure

    IconName$ = "F:\USB-переключатель\Колонки.ico"
    IconName1$ = "F:\USB-переключатель\Телек.ico"

OpenWindow(0,0,0,230,83,#Name,#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindow(0, 0, 0, 230, 83, "USB-переключатель", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered);|#PB_Window_Invisible)
CompilerIf #PB_Editor_CreateExecutable
  ProgramAtStartup(1, "USB-переключатель");"Добавить в автозагрузку"
CompilerEndIf
StickyWindow(0,1);поверх всех открытых окон 
TextGadget(0,0,0,230,15,#NO_Device, #PB_Text_Center)
ButtonGadget(5,65,33,100,23,"Переключить",#PB_Button_Toggle)
TextGadget(2, 33, 17, 50 ,15,"Выход на ")
TextGadget(54, 83, 17, 80 ,15, IN_Speakers)

;-----------Создаём строку состояния-----------
CreateStatusBar(0, WindowID(0))
; Делим её на области
AddStatusBarField(70)
AddStatusBarField(90)
AddStatusBarField(70)
StatusBarText(0, 1,"Дата и время", #PB_StatusBar_Center) ; Выводим строку в область с идентификатором 1.
OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"

;-----------Системный трей----------- 
AddSysTrayIcon(67, WindowID(0), ExtractIcon_(0,ProgramFilename(),0))
SysTrayIconToolTip(67, "USB-переключатель") 
;Добавим к иконке меню
CreatePopupMenu(68) 
;MenuItem(1, "Развернуть") 
;MenuItem(2, "Свернуть") 
MenuItem(3, "Колонки") 
SetMenuItemState(68,3,1)
MenuItem(4, "Телевизор")
MenuBar() 
MenuItem(10, "Выход")   

HideWindow(0,0)

FindDevice_Timer()
AddWindowTimer(0, 2, 400)

Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_Timer
    If EventTimer()=2
      FindDevice_Timer()
    EndIf
    
  ElseIf Event=#PB_Event_Gadget
    Select EventGadget()
      Case 5
        SendDevice()
    EndSelect
  EndIf
  
    If Event = #PB_Event_SysTray 
    
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
      DisplayPopupMenu(68, WindowID(0)) ; показ вспывающего меню 
        ; Break
    EndIf 
    
    If EventType() = #PB_EventType_LeftClick ; Обработка левой кнопки мышки     
      HideWindow(0, 1)
    EndIf
    
       If EventType() = #PB_EventType_LeftDoubleClick  ; Обработка двойного нажатия левой кнопки мышки    
       HideWindow(0, 0)
      SetWindowState(0, #PB_Window_Normal) 
    EndIf
    
  EndIf
  
  If Event = #PB_Event_Menu 
    Select EventMenu() 
     ; Case 1 ;"Развернуть"  
      ;  HideWindow(0, 0)
       ; SetWindowState(0, #PB_Window_Normal)     
      ;Case 2 ;"Свернуть" 
       ; HideWindow(0, 1)
      Case 3 ;"Колонки" 
        SetGadgetState(5, 0)
        SendDevice()
        TextGadget(54, 83, 17, 80 ,15, IN_Speakers)   
        SetMenuItemState(68,3,1)
        SetMenuItemState(68,4,0)
        ChangeSysTrayIcon (EventGadget(), LoadImage(30, IconName$))
      Case 4 ;"Телевизор" 
        SetGadgetState(5, 1)
        SendDevice()
        TextGadget(54, 83, 17, 80 ,15, IN_TV)
        SetMenuItemState(68,4,1)
        SetMenuItemState(68,3,0)
        ChangeSysTrayIcon (EventGadget(), LoadImage(31, IconName1$))
      Case 10 ;"Выход"
        Break
    EndSelect 
  EndIf   
  
  If Event=#PB_Event_MinimizeWindow ;Событие при сворачивании окна
    HideWindow(0,1) ;свернуть окно
  EndIf
  
Until Event=#PB_Event_CloseWindow
; Вызываем функцию "KillTimer"
CallFunction(0,"KillTimer",WindowID(0),1)
; Закрываем файл "user32.dll".
CloseLibrary(0)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)