Seite 1 von 1

Lupe

Verfasst: 22.02.2005 00:55
von SC
Hallo,

ich möchte eine Lupe mit BP basteln, also wo ich die Möglichkeit habe, einen Bereich auf der sich mein Mauszeiger bewegt bzw befindet zu vergrößern Wie mit einer Lupe/Vergrößerungsglas. Hat jemand schon mal so etawas programmiert, oder hat jemand eine Idee wie man so was bsateln kann?

Gruß: SC

Verfasst: 22.02.2005 01:01
von Ynnus
Im Codearchiv sollte sich soetwas finden lassen. Hab da mal eben was ähnliches gefunden:

Code: Alles auswählen

; English forum:
; Author:
; Date: 21. January 2003

Procedure CaptureScreen(Left.l, Top.l, handle.l,Factor)
  DC.l = GetDC_(0)
  MemDC.l = CreateCompatibleDC_(DC)
  If handle = 0
    BmpID.l = CreateCompatibleBitmap_(DC, 200, 200)
  Else
    BmpID.l = handle
  EndIf
  SelectObject_( MemDC, BmpID)
  StretchBlt_( MemDC, 0, 0,200*Factor,200*Factor, DC,Left, Top, 200, 200, #SRCCOPY )
  DeleteDC_( MemDC)
  ReleaseDC_(0,DC)
  ProcedureReturn BmpID ;same BUG if Bitmap or BmpID is used...
EndProcedure
;
If OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu,"Loupe") : Else : End : EndIf
If CreateGadgetList(WindowID()) : Else : End : EndIf
;
CursorPosition.POINT
hImage = CaptureScreen( CursorPosition\x, CursorPosition\y, 0,1)
hGadget = ImageGadget(0, 0, 0, 200,200, hImage)
;
Repeat
  EventID.l = WindowEvent()
  Delay(10)
  GetCursorPos_(CursorPosition)
  hImage = CaptureScreen( CursorPosition\x, CursorPosition\y, hImage,4)
  SendMessage_(hGadget, #STM_SETIMAGE, #IMAGE_BITMAP, hImage)
Until EventID=#PB_EventCloseWindow
;
End
Gibt aber afaik noch ein anderes Lupenbeispiel im Codearchiv von purearea.net. ;)

Verfasst: 22.02.2005 01:19
von SC
Das hatte ich schon gefunden, aber dennoch danke für die schnelle Hilfe. Was ich jedoch möchte ist, daß unmittelbar auf meinem Mauszeiger sich eine rundes Fenster öffnet und man dort die vergößerung sieht.
Wie eben mit einer Lupe.

Verfasst: 22.02.2005 10:46
von DrShrek
@SC

Für was brauchst Du das?
Aus meiner Sicht macht das nur Sinn für einen statischen Screen/Hintergrund (z.B. Ein Bild vergrössern).

Für einen bewegten Hintergrund must Du immer einen Versatz drin haben!
SOnst vergrösserst Du die Vergrösserung und die wird wieder vergrössert, usw.

Verfasst: 22.02.2005 10:50
von Ynnus
Na dann erstell doch das Fenster randlos und ohne Titelleiste immer genau an der Mausprosition. Dadurch sieht es dann so aus, als wenn deine Maus den Sichtbereich dort vergrößert...

Verfasst: 22.02.2005 15:12
von Kaeru Gaman
@SC

oder brauchst du das für den ScreenMode?

das probiers mal mit GrabSprite() und machn Sprite3D draus und
vergrössers.

Verfasst: 22.02.2005 23:41
von SC
Na dann erstell doch das Fenster randlos und ohne Titelleiste immer genau an der Mausprosition. Dadurch sieht es dann so aus, als wenn deine Maus den Sichtbereich dort vergrößert...
Ja, daß kommt meinem Vorhaben am nähesten, sinnvoll wäre auch, wenn man den Bereich per rechtenmausklick vergrößern und Linkenmausklick verkleinern könnte. Kann mir jemand den folgenden Programm entsprechend ergänzen?

Code: Alles auswählen

; English forum: 
; Author: 
; Date: 21. January 2003 

Procedure CaptureScreen(Left.l, Top.l, handle.l,Factor) 
  DC.l = GetDC_(0) 
  MemDC.l = CreateCompatibleDC_(DC) 
  If handle = 0 
    BmpID.l = CreateCompatibleBitmap_(DC, 500, 500) 
  Else 
    BmpID.l = handle 
  EndIf 
  SelectObject_( MemDC, BmpID) 
  StretchBlt_( MemDC, 0, 0,300*Factor,300*Factor, DC,Left, Top, 200, 200, #SRCCOPY ) 
  DeleteDC_( MemDC) 
  ReleaseDC_(0,DC) 
  ProcedureReturn BmpID ;same BUG if Bitmap or BmpID is used... 
EndProcedure 
; 
If OpenWindow(0,200,200,300,300,#PB_Window_SystemMenu,"Loupe") : Else : End : EndIf
If CreateGadgetList(WindowID()) : Else : End : EndIf 
; 
CursorPosition.POINT 
hImage = CaptureScreen( CursorPosition\x, CursorPosition\y, 0,1) 
hGadget = ImageGadget(0, 0, 0, 300,300, hImage) 
; 
Repeat 
  EventID.l = WindowEvent() 
  Delay(10) 
  GetCursorPos_(CursorPosition) 
  hImage = CaptureScreen( CursorPosition\x, CursorPosition\y, hImage,4) 
  SendMessage_(hGadget, #STM_SETIMAGE, #IMAGE_BITMAP, hImage) 
Until EventID=#PB_EventCloseWindow 
; 
End