Lupe

Für allgemeine Fragen zur Programmierung mit PureBasic.
SC
Beiträge: 18
Registriert: 12.02.2005 01:44

Lupe

Beitrag 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
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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. ;)
SC
Beiträge: 18
Registriert: 12.02.2005 01:44

Beitrag 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.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag 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.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@SC

oder brauchst du das für den ScreenMode?

das probiers mal mit GrabSprite() und machn Sprite3D draus und
vergrössers.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
SC
Beiträge: 18
Registriert: 12.02.2005 01:44

Beitrag 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
Antworten