Bildausschneiden vom Desktop

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Bildausschneiden vom Desktop

Beitrag von Velindos »

Hallo,
was soll das
probier doch mal selbst was
. Mach ich ja, so was trägt nichts bei!
(z.b. strg+linkemaustaste)
genau das ist der Ansatz! Habe ja das Beispiel schon mit
Snapshot hereingegeben, nur keine AHNUNG wie ich das mit Maus ausserhalb, sprich am Desktop mache.

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Bildausschneiden vom Desktop

Beitrag von HeX0R »

Velindos hat geschrieben:Hallo,
was soll das
probier doch mal selbst was
. Mach ich ja, so was trägt nichts bei!
So so...
Rings spricht nur aus, was immer mehr hier denken.
Mach nur weiter mit deinen Fragebombardements, du wirst sehen, dass es immer weniger werden, die hilfreich sind.
Mich z.B. nervt diese "Oh ich weiss gerade nicht weiter, fragen wir doch gleich die Jungs im Support-Forum, bevor ich anfange mein eigenes Hirn anzustrengen"-Mentalität ungemein.

Die Lust zu helfen nimmt proportional zu der Unlust des Suchenden selbst kreativ zu werden ab.
Das ist ja das gute daran, mit der Zeit erledigt sich das von selbst.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Bildausschneiden vom Desktop

Beitrag von Macros »

Ich muss da voll zustimmen,
anfangs habe ich versucht, dir zu helfen.
Inzwischen hast du so viel hilfestellungen erhalten, dass durch weitere Fragen nur zwei Schlüsse bleiben:
Entweder du kannst nicht programmieren, oder du bist zu faul weiterzudenken und zu experimentieren.
(Ich denke mal zweiteres)
Wenn du dir die Tipps anschaust, nicht nur kompilierst sondern auch überlegst,
wie du Teile daraus zu dem zusammensetzen könntest, was du brauchst, und dann auf ein Problem stößt,
dann helf ich gerne weiter.

Wenn ich jemand Unbekannten ein Programm nach Wunsch schreiben soll,
lass ich mich im Allgemeinen dafür bezahlen ;)

Edit: Spezifizierung "Fragen":
Fragen der Art: "Kann mir jemand Code geben den ich in mein Programm copy/pasten kann?"
Zuletzt geändert von Macros am 18.02.2011 17:34, insgesamt 2-mal geändert.
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Bildausschneiden vom Desktop

Beitrag von Velindos »

Hallo Leute,
das ist ja starker Tobak! Also zu du läßt dir hefen! Habt ihr beobachtet das ihr im "Anfänger" Forum seit, ist euch entgangen.
Das nächste ist, dann wird dir keiner mehr helfen, dazu kann ich nur sagen das man solche Sprüche für sich behalten soll, denn wie könnt ihr für alle Sprechen???
Wenn es stört das ich fragen stelle, dann wird mir das der Forumchef schon sagen! Also wie gesagt das trägt nichts bei!
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Bildausschneiden vom Desktop

Beitrag von SebastianJu2 »

@velindos

Bin auch Anfänger. Das mit der Maus habe ich auch gerade gesucht. Und das findet man mit F1 im Editor, dann ganz rechts Tab Suchen (ist die hilfreichste suche) dann Maus eingeben und du findest was du suchst.
Jetzt fehlt mir noch das Abfangen von Tastendrücken, weil ich ein geheimes Areal haben will bei dem mit Eingabe eines Codeworts ein versteckter Modus gestartet werden kann, aber das wird sicher auch auf die Art auffindbar sein.

Beispiele gibt es nicht für alles. Meistens sind die Beispiele und Tutorials auch schon alt und man muss sie erst selbst reparieren was für einen Anfänger nicht grad hilfreich ist.

Von daher wirst du kein genau passendes und funktionierendes Beispiel finden sondern selbst coden müssen... bzw dich einlernen...

Ist nicht böse gemeint... :)
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Bildausschneiden vom Desktop

Beitrag von Velindos »

Hallo,
wenn der Aufruf der anderen Früchte trägt, dann sind wir fast am Ende!

Also hier meine Lösung, bin natürlich für Verbesserungsvorschläge dankbar!

Code: Alles auswählen

; Bildausschneiden am Desktop
; Dient zum Ausschneiden von Bilder am Desktop
; Velindos 2011-02 
; Datei mit Velindos Start muss noch angepasst werden, ein Bild mit 230x230
; Mittels ESC kann abgebrochen werden 


Enumeration
  #FrameMain
  #ParentWindow
  #ChildWindow
EndEnumeration

;{-Image Plugin
UsePNGImageDecoder()
UsePNGImageEncoder()
;}

Enumeration
  #XI_Umschalten
  #XI_ChildButton
  #XI_SnipperEinAus
  #XI_Image
  #XI_StartP
  #XI_EndeP
  #XI_VirtStartP
  #XI_VirtStartP2
  #XI_VirtEndeP
  #XI_SchnittP
EndEnumeration

Enumeration
  #imgCapture
  #DesktopImage
  #myImage
  #myImage2
  #Grabimage
  #VelindosImageKlein
EndEnumeration

Procedure CaptureWindow()
  GetWindowRect_(GetDesktopWindow_(), @r.rect)
  CreateImage(#imgCapture, r\right - r\left, r\bottom - r\top)
  DC = StartDrawing(ImageOutput(#imgCapture))
  BitBlt_(DC, 0, 0, r\right - r\left, r\bottom - r\top, GetWindowDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
  StopDrawing()
EndProcedure

SnipperEinAus=0

Procedure SetWinTransparency(win,level)
  If level>=0 And level<=100
    SetWindowLong_(WindowID(win),#GWL_EXSTYLE,GetWindowLong_(WindowID(win),#GWL_EXSTYLE)|$00080000) ; #WS_EX_LAYERED = $00080000
    SetLayeredWindowAttributes_(WindowID(win),0,255*level/100,2)
  EndIf
  
EndProcedure


Procedure SnipperWindow() 
  ;If OpenWindow(#ChildWindow,100,150,250,200,"OtherWindow",#PB_Window_SystemMenu) 
  ;ButtonGadget(#XI_ChildButton,100,100,50,25,"Test") 
  Childstatus=1
  ExamineDesktops()
  yy=DesktopHeight(0)
  ww=DesktopWidth(0)
    ;ParentWindow damit nichts in der Taskleiste erscheint
  OpenWindow(#ParentWindow,0,0,DesktopWidth(0),DesktopHeight(0),"Snipping Test",#PB_Window_Invisible)
  ;Unser Fenster mit dem wir auf den Desktop malen wollen
  OpenWindow(#ChildWindow,0,0,DesktopWidth(0),DesktopHeight(0),"Snipping Test",#PB_Window_BorderLess|#PB_Window_Invisible,GetDesktopWindow_())
  ;Window auf Layered Window umschalten
  SetWindowLong_(WindowID(#ChildWindow),#GWL_HWNDPARENT,WindowID(#ParentWindow))
  ;SetWinTransparency(#ParentWindow,40)
  SetWinTransparency(#ChildWindow,40)
  ;Fenster fixieren
  SetWindowPos_(WindowID(#ChildWindow),#HWND_BOTTOM,0,0,0,0,#SWP_NOMOVE|#SWP_NOREPOSITION|#SWP_NOSIZE)
  ;Fenster anzeigen
  HideWindow(#ChildWindow,0)
  ;StickyWindow(#ChildWindow,0)
  
  AddKeyboardShortcut(#ChildWindow, #PB_Shortcut_Escape, 15) ; Escape einschalten
  ;EndIf 
  
EndProcedure 

OpenWindow(#FrameMain,0,0,650,300,"Test",#PB_Window_SystemMenu) 
TextGadget(#XI_SnipperEinAus,150,250,150,25,Str(SnipperEinAus))
ButtonGadget(#XI_Umschalten,150,270,150,25,"Open another window") 
TextGadget(#XI_StartP, 250, 6, 290, 20, "Start")
TextGadget(#XI_EndeP, 250, 26, 290, 20, "Ende")
TextGadget(#XI_VirtStartP, 250, 66, 290, 20, "VirtualStart")
TextGadget(#XI_VirtEndeP, 250, 86, 290, 20, "VirtualEnde")

TextGadget(#XI_VirtStartP2, 250, 126, 290, 20, "VirtualStart")
TextGadget(#XI_SchnittP, 250, 146, 290, 20, "Bildausschnitt")


If LoadImage(#myImage2, "C:\Velindos\VelindosStart.bmp")    
  ImageGadget(#XI_Image,10,10,300,300,ImageID(#myImage2)) 
EndIf

Repeat 
  
  EventID=WaitWindowEvent() 
  
  Select EventID 
      
    Case #PB_Event_CloseWindow:Break
      
      
    Case #PB_Event_Gadget 
      Select EventGadget() 
        Case #XI_Umschalten 
          SnipperEinAus=1
          Childstatus=1
          SetGadgetText(#XI_SnipperEinAus,"1")
          SnipperWindow() 
          
        Case #XI_ChildButton;The gadget from the other window must have DIFFERENT ids 
          MessageRequester("click","Button from 2nd window",0) 
      EndSelect 
      
    Case #PB_Event_CloseWindow 
      If EventWindow()= #ParentWindow ;Here you detect if the window to close is your additional window 
        CloseWindow(#ParentWindow) 
        SnipperEinAus=0
        SetGadgetText(#XI_SnipperEinAus,"0")
      Else 
        Quit = #ParentWindow 
      EndIf 
      
      
    Case #WM_MOUSEMOVE
      
      If Childstatus=1
        
        If EventwParam() = #MK_LBUTTON
          ;- Maus Move (in Bewegung)
          ;MX=0:MY=0
          MX = DesktopMouseX() : MY = DesktopMouseY()
          
          Bildauschnitt=A
          hdc = GetDC_(WindowID(#ChildWindow))
          DrawFocusRect_(hdc,frc.RECT)
          If ((IX < MX) And (IY > MY))
            SetRect_(frc,IX,MY, MX,IY)
          ElseIf ((IX > MX) And (IY > MY))
            SetRect_(frc,MX, MY, IX,IY)
          ElseIf ((IX > MX) And (IY < MY))
            SetRect_(frc,MX,IY, IX, MY)
          Else
            SetRect_(frc,IX,IY,MX,MY)         
            ;ClearRect_(frc,IX,IY,MX,MY)
          EndIf
          DrawFocusRect_(hdc,frc)
          ReleaseDC_(WindowID(#ChildWindow),hdc)   
          
        EndIf
        
      EndIf
      
    Case #WM_LBUTTONUP
      ;- Maus Up (Losgelassen)
      If Childstatus=1
        ; Mauswert in X/Y(2)
        X2 = DesktopMouseX()
        Y2 = DesktopMouseY()
        SetGadgetText(#XI_StartP, "Start Maus-Klick-Position:                    X1= "+Str(X1)+", Y1= "+Str(Y1))
        SetGadgetText(#XI_EndeP,  "Stop Maus-Klick-Position:                    X1= "+Str(X2)+", Y1= "+Str(Y2))
        ; Festlegen des Ausschnitts 
        ;Bildausschnitt RECHTS UNTEN
        If X2>X1 And Y2>Y1 
          BX1=X1
          BY1=Y1
          BX2=X2
          BY2=Y2
          Delay(20)
        EndIf
        ;Bildausschnitt RECHTS OBEN
        If X2>X1 And Y2<Y1  
          BX1=X1
          BY1=Y2
          BX2=X2
          BY2=Y1
          Delay(20)
        EndIf
        ;Bildausschnitt LINKS UNTEN
        If X2<X1 And Y2>Y1  
          BX1=X2
          BY1=Y1
          BX2=X1
          BY2=Y2
          Delay(20)
        EndIf
        ;Bildausschnitt LINKS OBEN
        If X2<X1 And Y2<Y1  
          BX1=X2
          BY1=Y2
          BX2=X1
          BY2=Y1
          Delay(20)
        EndIf
        SetGadgetText(#XI_VirtStartP, "VirtualStart Maus-Klick-Position:          X1= "+Str(BX1)+", Y1= "+Str(BY1))
        SetGadgetText(#XI_VirtEndeP, "VirtualStop Maus-Klick-Position:          X2= "+Str(BX2)+", Y2= "+Str(BY2))
        ; Berechnen des Bildauschnittes
        Speicherbild_Breite = BX2-BX1    
        Speicherbild_Hoehe = BY2-BY1
        SetGadgetText(#XI_VirtStartP2, "Bildausschnitt STARTPunkt               BX1="+Str(BX1)+", BY1= "+Str(BY1))
        SetGadgetText(#XI_SchnittP, "Desktop Bildausschnitt                 Width="+Str(Speicherbild_Breite)+", Height= "+Str(Speicherbild_Hoehe))
        
        GrabImage(#imgCapture,#myImage2, BX1, BY1, Speicherbild_Breite, Speicherbild_Hoehe)
        ResizeImage(#myImage2,230,230)
        SetGadgetState(#XI_Image,ImageID(#myImage2)) 
        SetClipboardImage(#myImage2)
        ; Ausschneiden Beendet Snipping benden
        SnipperEinAus=0
        ; Childfenster ausschalten
        SetGadgetText(#XI_SnipperEinAus,"0")
        CloseWindow(#ChildWindow) 
        CloseWindow(#ParentWindow) 
        Childstatus=0
        SetRect_(frc,0,0,0,0)
        ; Zurück in Hauptfenster, Child geschlossen
      EndIf
      
      
      
    Case #WM_LBUTTONDOWN
      ;- Maus Down(gedrückt)
      If Childstatus=1
        IX = DesktopMouseX() : IY = DesktopMouseY()  
        ; Mauswert in X/Y(1)
        X1 = DesktopMouseX()
        Y1 = DesktopMouseY()
        CaptureWindow()
        SetClipboardImage(#imgCapture)
        GetClipboardImage(#myImage2,32)
        ResizeImage(#myImage2,230,230)
        SetGadgetState(#XI_Image,ImageID(#myImage2)) 
        SetActiveWindow(#FrameMain)
      EndIf
      
      
  EndSelect 
  
  Gadget = EventGadget()
  
  Select Gadget
    Case 15 ;Escape Taste gedrückt
      SetRect_(frc,0,0,0,0)
      SnipperEinAus=0
      SetGadgetText(#XI_SnipperEinAus,"0")
      CloseWindow(#ChildWindow) 
      CloseWindow(#ParentWindow) 
      Childstatus=0
      
  EndSelect
  
Until event = #PB_Event_CloseWindow  

; IDE Options = PureBasic v4.61 (Windows - x64)
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Bildausschneiden vom Desktop

Beitrag von rolaf »

; IDE Options = PureBasic v4.61 (Windows - x64)
Hab ich was verpasst? :shock:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Bildausschneiden vom Desktop

Beitrag von Velindos »

Hallo,
jetzt bin ich so in fahrt das ich meiner Zeit voraus bin! Ich kann dich beruhigen, das war mal wieder ich!
; IDE Options = PureBasic v4.51 (Windows - x64)
Natürlich schon verbessert, Danke!
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten