Fenster als Bildschirmlupe...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Fenster als Bildschirmlupe...

Beitrag von Ghosty1967 »

Hallo zusammen,

folgendes Problem... In einer Anwendung (Fenster, nicht Vollbild) soll ein kleines Toolfenster geöffnet werden, indem der darunter befindliche
Bereich vergrößert angezeigt werden soll. Wenn man das "Lupenfenster" mit der Maus bewegt soll auch der Inhalt darin erneuert werden. Ich habe
bereits im Forum gesucht und auch ein paar Hinweise auf die Lösung gefunden, aber ich bekomme es trotzdem nicht hin.
Könnte mir jemand mit einem Beispiel helfen?!
Ramihyn_
Beiträge: 61
Registriert: 20.06.2007 10:56

Re: Fenster als Bildschirmlupe...

Beitrag von Ramihyn_ »

Code: Alles auswählen

; Samplecode to get the color of a Pixel on the Desktop
; by PureLust for PureBasic-Forum - 18.09.2009 (with thanks to netmaestro)  ;)
; extended by infratec
; windows Vista problem solved by srod

Global Mag = 5
Global ImageDim
NewMag = 5
#BoxPlusMinus = 10


Procedure SetMag(NewMag.i)
Mag = NewMag
ImageDim = #BoxPlusMinus * 2 * Mag
CreateImage(0, ImageDim, ImageDim)
If ImageDim < 100
  WinDim = 100
Else
  WinDim = ImageDim
EndIf
ResizeWindow(0, #PB_Ignore, #PB_Ignore, 100 + WinDim, 70 + WinDim)
TextGadget(1, 0, 45 + WinDim, 100 + WinDim, 20, "", #PB_Text_Center)
EndProcedure




OpenWindow(0, 0, 0, 200, 170, "", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Minimize)

ImageGadget(0, 46, 20, 105, 105, 0, #PB_Image_Border)
TextGadget(1, 0, 145, 200, 20, "", #PB_Text_Center)
TrackBarGadget(2, 10, 20, 20, 105, 1, 9, #PB_TrackBar_Vertical)
SetGadgetState(2, 1)

BoxDim = #BoxPlusMinus * 2
ImageDim = #BoxPlusMinus * 2 * Mag

CreateImage(0, ImageDim, ImageDim)

HDC = GetDC_(0)

ShortCuts = 0

Repeat
Event = WaitWindowEvent(100)

x.i = DesktopMouseX()
y.i = DesktopMouseY()
PointColor = GetPixel_(hDC, x, y)
Red = Red(PointColor)
Green = Green(PointColor)
Blue = Blue(PointColor)
PixelColour$ = RSet(Hex(Red), 2, "0") + RSet(Hex(Green), 2, "0") + RSet(Hex(Blue), 2, "0")
If WindowHeight(0) > 10
 
  If ShortCuts = 0
   AddKeyboardShortcut(0, #PB_Shortcut_Left, 1)
   AddKeyboardShortcut(0, #PB_Shortcut_Up, 2)
   AddKeyboardShortcut(0, #PB_Shortcut_Right, 3)
   AddKeyboardShortcut(0, #PB_Shortcut_Down, 4)
   AddKeyboardShortcut(0, #PB_Shortcut_Add, 5)
   AddKeyboardShortcut(0, #PB_Shortcut_Subtract, 6)
   AddKeyboardShortcut(0, #PB_Shortcut_F1, 7)
   SetWindowTitle(0, "GetPixelColour")
   ShortCuts = 1
  EndIf
 
  SetGadgetText(1, "Colour at " + Str(x) + ","+ Str(y) +" is: " + PixelColour$)
 
  SD = StartDrawing(ImageOutput(0))
 
  If SD
   
   ExamineDesktops()
   DeskHeight = DesktopHeight(0)
   DeskWidth = DesktopWidth(0)
   
   ; calculations for the 'borders'
   If x - #BoxPlusMinus < 0
    ScreenX1 = 0
    ImageX1 = (#BoxPlusMinus - x) * Mag
   Else
    ScreenX1 = x - #BoxPlusMinus
    ImageX1 = 0
   EndIf
   
   If x + #BoxPlusMinus > DeskWidth
    ImageX2 = (#BoxPlusMinus * 2 - (x + #BoxPlusMinus - DeskWidth)) * Mag
   Else
    ImageX2 = ImageDim
   EndIf
   
   If y - #BoxPlusMinus < 0
    ScreenY1 = 0
    ImageY1 = (#BoxPlusMinus - y) * Mag
   Else
    ScreenY1 = y - #BoxPlusMinus
    ImageY1 = 0
   EndIf
   
   If y + #BoxPlusMinus > DeskHeight
    ImageY2 = (#BoxPlusMinus * 2 - (y + #BoxPlusMinus - DeskHeight)) * Mag
   Else
    ImageY2 = ImageDim
   EndIf
   
   ; do the magnification
   StretchBlt_(SD, ImageX1, ImageY1, ImageDim, ImageDim, HDC, ScreenX1, ScreenY1, BoxDim, BoxDim, #SRCCOPY)
   
   ; fill the borders if neccessary
   If ImageX1 > 0
    Box(0, 0, ImageX1, ImageDim, 0)
   EndIf
   
   If ImageY1 > 0
    Box(0, 0, ImageDim, ImageY1, 0)
   EndIf
   
   If ImageX2 < ImageDim
    Box(ImageX2, 0, ImageDim - ImageX2, ImageDim, 0)
   EndIf
   
   If ImageY2 < ImageDim
    Box(0, ImageY2, ImageDim, ImageDim - ImageY2, 0)
   EndIf
   
   
   ; draw the crosshairs
CompilerIf #PB_Compiler_Version >= 440
   Line((ImageDim + Mag) / 2, 0, 1, ImageDim + Mag , ~PointColor)
   Line(0, (ImageDim + Mag) / 2, ImageDim + Mag, 1 , ~PointColor)
CompilerElse
   PointColor = $FFFFFF - PointColor
   Line((ImageDim + Mag) / 2, 0, 0, ImageDim + Mag , PointColor)
   Line(0, (ImageDim + Mag) / 2, ImageDim + Mag, 0 , PointColor)
CompilerEndIf

   StopDrawing()
   SetGadgetState(0, ImageID(0))
  EndIf
 
  If Event = #PB_Event_Gadget
   If EventGadget() = 2
    NewMag = 4 + (GetGadgetState(2) * 2 - 1)
    If Mag <> NewMag
     SetMag(NewMag)
    EndIf
   EndIf
  EndIf
 
  If Event = #PB_Event_Menu
   Select EventMenu()
    Case 1:
     mouse_event_(1, -1, 0, 0, 0)
    Case 2:
     mouse_event_(1, 0, -1, 0, 0)
    Case 3:
     mouse_event_(1, 1, 0, 0, 0)
    Case 4:
     mouse_event_(1, 0, 1, 0, 0)
    Case 5:     
     If Mag < 21
      Mag + 2
      SetMag(Mag)
      SetGadgetState(2, (Mag - 3) / 2 )
     EndIf     
    Case 6:
     If Mag > 5
      Mag - 2
      SetMag(Mag)
      SetGadgetState(2, (Mag - 3) / 2 )
     EndIf
    Case 7:
     Text$ = "                  Getpixelcolour" + Chr(13)
     Text$ + Chr(13)
     Text$ + "                 2009 by Infratec" + Chr(13)
     Text$ + Chr(13)
     Text$ + "Use the cursor keys for fine adjustment" + Chr(13)
     Text$ + "Plus and minus to set the magnification" + Chr(13)
     Text$ + Chr(13)
     Text$ + "                      Have fun!"
     MessageRequester("Info", Text$)
   EndSelect
  EndIf
 
Else
  SetWindowTitle(0, PixelColour$)
  If ShortCuts = 1
   RemoveKeyboardShortcut(0, #PB_Shortcut_All)
   ShortCuts = 0
  EndIf
EndIf

Until Event = #PB_Event_CloseWindow

ReleaseDC_(0,HDC)

Sowas? :)
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: Fenster als Bildschirmlupe...

Beitrag von Ghosty1967 »

Dieses Beispiel hatte ich auch gefunden, bekomme es aber irgendwie nicht hin, es an mein Proggi anzupassen.
Ich werde jetzt nochmal tiiiief durchatmen und es erneut versuchen ;)

Danke erstmal für Deine Mühe!
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Re: Fenster als Bildschirmlupe...

Beitrag von Ghosty1967 »

Also, ich habe hier mal einen kleines Beispiel zu dem Verhalten, welches ich brauche gebastelt.
Aber auch hier habe ich ein paar Probleme.
1. Wenn ich den "Delay(50)" rausnehme, dann bleibt die Bitmap leer... warum?
2. Ich hätte ganz gerne, das der Inhalt des "Lupenfensters" während der Bewegung refresht wird.
3. Darf das "Lupenfenster sich nie selber vergrößern; d.h, das es eigentlich während des koperens
des Desktopausschnittes unsichtbar sein muss.

Code: Alles auswählen

Enumeration
  #WindowUSR
  #GadgetMAG
  #ImageMAG
EndEnumeration

Procedure RepaintWindow()
  coorX    = WindowX(#WindowUSR) + 3
  coorY    = WindowY(#WindowUSR) + 24
  HideWindow(#WindowUSR, #True)
 ;Eine kleine Pause scheint hier von Nöten zu sein, da sonst der Inhalt nicht aktualisiert wird
  Delay(50)
  hDC_Draw = StartDrawing(ImageOutput(#ImageMAG))  
  DC_Desk  = GetDC_(GetDesktopWindow_())  
  StretchBlt_(hDC_Draw, 0, 0, 200, 200, DC_Desk, coorX, coorY, 200, 200, #SRCCOPY); Erstmal ohne Vergrößerung
  StopDrawing()
  HideWindow(#WindowUSR, #False)
  SetGadgetState(#GadgetMAG, ImageID(#ImageMAG))
  ReleaseDC_(GetDesktopWindow_(), DC_Desk)
EndProcedure  

If OpenWindow(#WindowUSR, 0, 0, 200, 200, "Close with ALT+F4", #PB_Window_ScreenCentered|#PB_Window_Tool)
  ImageGadget(#GadgetMAG, 0, 0, 200, 200, #PB_Image_Border)
  hDC_Image = CreateImage(#ImageMAG, 200, 200)  
  RepaintWindow()
  
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
      Case #PB_Event_MoveWindow
         RepaintWindow()
     EndSelect
  Until EventID = #PB_Event_CloseWindow
EndIf

FreeImage(#ImageMAG)
End
Sicherlich kommen da noch mehr Fragen auf euch zu, aber so kann man ja nur lernen ;) :D
Antworten