Aktuelle Zeit: 26.05.2020 15:41

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: CamGadget - Module (windows only)
BeitragVerfasst: 06.10.2013 21:37 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Hier mal eine kleine Spielerei, für diejenigen, die eine WebCam haben :wink:
Code:
DeclareModule CamGadget
  Interface ICamGadget
    Free()
    Resize(x, y, width, height)
    GetcaphWnd()
    DlgSettings()
    SnapImage()
  EndInterface
 
  Declare New(x, y, width, height, rate.l = 30, Text.s = "My Capture Window")
EndDeclareModule

Module CamGadget
  EnableExplicit
 
  Structure Class
    *vTable
    ID.i
    hWndC.i
  EndStructure
   
  Define DLL

  Prototype capCreateCaptureWindow(lpszWindowName.p-Unicode, dwStyle.l, x.l, y.l, nWith.l, nHeigth.l, hWnd.i, nID.l)
 
  Global capCreateCaptureWindow.capCreateCaptureWindow
 
  DLL = OpenLibrary(#PB_Any, "avicap32.dll")
 
  If DLL
    capCreateCaptureWindow =  GetFunction(DLL, "capCreateCaptureWindowW")
  EndIf
 
  Procedure New(x, y, width, height, rate.l = 30, Text.s = "My Capture Window")
    Protected *obj.Class
   
    *obj = AllocateMemory(SizeOf(Class))
    If *obj
      With *obj
        \vTable = ?vTable
        \ID = ContainerGadget(#PB_Any, x, y, width, height)
        CloseGadgetList()
        HideGadget(\ID, #True)
        \hWndC = capCreateCaptureWindow(Text,  #WS_CHILD | #WS_VISIBLE, 0, 0, width, height, GadgetID(\ID), \ID)
        If \hWndC
          SendMessage_(\hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_PREVIEWRATE, rate, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_PREVIEW, #True, 0)
          SendMessage_(\hWndC, #WM_CAP_SET_SCALE, #True, 0)
          HideGadget(\ID, #False)
         
          ProcedureReturn *obj
        Else
          FreeGadget(\ID)
          FreeMemory(*obj)
         
          ProcedureReturn #False
        EndIf
      EndWith
    EndIf
  EndProcedure
   
  Procedure Free(*obj.Class)
      If *obj
        With *obj
          SendMessage_(\hWndC, #WM_CAP_STOP, 0, 0)
          SendMessage_(\hWndC, #WM_CAP_DRIVER_DISCONNECT, 0, 0)
          DestroyWindow_(\hWndC)
          FreeGadget(\ID)
        EndWith
        FreeMemory(*obj)
      EndIf
  EndProcedure

  Procedure Resize(*obj.Class, x, y, width, height)
    If *obj
      With *obj
        ResizeGadget(\ID, x, y, width, height)
        MoveWindow_(\hWndC, 0, 0, width, height, #True)
      EndWith
    EndIf
  EndProcedure
 
  Procedure GetcaphWnd(*obj.Class)
    If *obj
      ProcedureReturn *obj\hWndC
    EndIf
  EndProcedure
 
  Procedure DlgSettings(*obj.Class)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_DLG_VIDEOSOURCE, 0, 0)
    EndIf
  EndProcedure
 
  Procedure SnapImage(*obj.Class)
    If *obj
      SendMessage_(*obj\hWndC, #WM_CAP_EDIT_COPY, 0, 0)
      ProcedureReturn GetClipboardImage(#PB_Any, 32)
    EndIf
  EndProcedure
 
  DataSection
    vTable:
    Data.i @Free()
    Data.i @Resize()
    Data.i @GetcaphWnd()
    Data.i @DlgSettings()
    Data.i @SnapImage()
  EndDataSection
EndModule

CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
 
  Enumeration
    #btnSettings
    #btnSnap
    #imgSnap
  EndEnumeration
 
  Define myCam.CamGadget::ICamGadget
  Define img
   
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 800, 410, "Webcam Example", #PB_Window_SizeGadget | #PB_Window_SystemMenu)
  myCam = CamGadget::New(10, 10, 640, 360)
 
  ButtonGadget(#btnSettings, 10, 380, 80, 20, "Settings")
  ButtonGadget(#btnSnap, 100, 380, 80, 20, "Snapshot")
  ImageGadget(#imgSnap, WindowWidth(0) - 105, 10, 100, 100, 0, #PB_Image_Border)
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        myCam\Free()
        Break
     
      Case #PB_Event_SizeWindow
        myCam\Resize(#PB_Ignore, #PB_Ignore, WindowWidth(0) - 120, WindowHeight(0) - 50)
        ResizeGadget(#btnSettings, #PB_Ignore, WindowHeight(0) - 30, #PB_Ignore, #PB_Ignore)
        ResizeGadget(#btnSnap, #PB_Ignore, WindowHeight(0) - 30, #PB_Ignore, #PB_Ignore)
        ResizeGadget(#imgSnap, WindowWidth(0) - 105, #PB_Ignore, #PB_Ignore, #PB_Ignore)
       
      Case #PB_Event_Gadget
       
        Select EventGadget()
          Case #btnSettings
            myCam\DlgSettings()
           
          Case #btnSnap
            img = myCam\SnapImage()
            ResizeImage(img, 100, 100)
            SetGadgetState(#imgSnap, ImageID(img))
           
        EndSelect
    EndSelect
  ForEver
CompilerEndIf

_________________
PureBasic 5.71 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 19.3 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 06.10.2013 21:38 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Ich werds morgen testen.

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 06.10.2013 21:57 
Offline
Benutzeravatar

Registriert: 10.09.2004 20:51
Wohnort: Ansbach
Komisch hat bei mir beim erstmal mal einwandfrei funktioniert ohne dass irgend eine Auswahl nötig gewesen wäre.
Beim zweiten starten kam jetzt aber ein Fenster wo ich meine Webcam auswählen musste, sie wird jedoch nicht angesteuert.

BTW danke dass du mir die Konstante #PB_Compiler_IsMainFile näher gebracht hast, wusste von deren Existenz bisher nicht :D
Hab bisher immer umständlicher meine Includes getestet^^

LG KeyKon

_________________
(\/) (°,,,°) (\/)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 06.10.2013 22:47 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Für diejenigen, die das ganze noch erweitern wollen, bzw. weitere Messages benötigen:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757677%28v=vs.85%29.aspx

_________________
PureBasic 5.71 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 19.3 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 07.10.2013 09:01 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Beim Ausführen erscheint zwar das folgende Fenster:
Bild

Aber nach dem Bestätigen bleibt die Fläche schwarz und ich sehe nichts. Ich versuchs in ein paar Tagen mit einem anderen Laptop mit externer Webcam.

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 07.10.2013 10:39 
Offline
Benutzeravatar

Registriert: 10.09.2004 20:51
Wohnort: Ansbach
RSBasic hat geschrieben:
Aber nach dem Bestätigen bleibt die Fläche schwarz und ich sehe nichts.


Genau wie bei mir, aber das ganze ist erst ab dem zweiten mal so gewesen.
Das erste mal Ausführen ging einwandfrei... (Bin auch am Laptop)

LG KeyKon

_________________
(\/) (°,,,°) (\/)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 07.10.2013 10:43 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Ich hab nur eine WebCam unter Windows, kann somit nicht viel mehr testen. Meine läuft über USB
und benötigt keinerlei Treiber (abgesehen von in Windows integrierten).

_________________
PureBasic 5.71 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 19.3 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 07.10.2013 10:44 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Mit folgendem Code funktioniert es auch bei mir: http://www.purebasic.fr/english/viewtop ... bb#p370293

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 07.10.2013 11:19 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
RSBasic hat geschrieben:
Mit folgendem Code funktioniert es auch bei mir: http://www.purebasic.fr/english/viewtop ... bb#p370293

Der einzige Unterschied ist, das die Rate auf 15 ms steht, in meinem Beispiel auf 30.
(vielleicht schaffen das eure CAMs nicht? (integrierter Sondermüll :mrgreen: ))
Einfach mal testen, ansonsten gibt es keinen Unterschied, abgesehen davon, das ich die Unicode-Version
der API aufrufe.

_________________
PureBasic 5.71 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 19.3 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CamGadget - Module (windows only)
BeitragVerfasst: 07.10.2013 11:33 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Als ich deinen Code einfach mal so getestet hab, hat es jetzt auf Anhieb funktioniert, aber beim zweiten Versuch nicht mehr. Auch das Setzen der Rate bringt nichts.

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye