Lupe sieht sich selbst

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
rayman1970
Beiträge: 89
Registriert: 01.09.2004 16:10
Wohnort: Troisdorf bei Bonn
Kontaktdaten:

Lupe sieht sich selbst

Beitrag von rayman1970 »

Hi an alle !

Ich habe seit langem mal wieder eine Frage :)
Ich habe aus dem Codearchiv die Bildschirmlupe . Teilweise sieht sich die Lupe allerdings selber und vergrößert sich dann ins Unendliche . Es gibt auch Störungen wenn die Lupe sich am Bildschirmrand befindet .
Das möchte ich logischerweise ausschalten , so wie bei der Microsoft Lupe .
Ich wollte eigentlich aus Maus-, Fenster-und Bildschirmrand Koordinaten eine Formel machen welche dann die falschen Grafiken entfernt . Das ist allerdings sehr aufwendig , da ich ebenfalls den Zoomfaktor und die Fenster Postion ändern möchte .
Hat einer von Euch vielleicht eine gute Idee ?

Hier mal der Code:

Code: Alles auswählen

; 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, 600, 600)
  Else
    BmpID.l = handle
  EndIf
  SelectObject_( MemDC, BmpID)
  StretchBlt_( MemDC, 0, 0,600*Factor,600*Factor, DC,Left, Top, 600, 600, #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, 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
Danke im voraus !

Gruss Rayman
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

-

Beitrag von Green Snake »

ja, ich weis was du meinst.
das kan man nicht ändern, nur umgehen.
es ist ja klar, das alles was die lupe sieht, wird vergrössert, das heisst, wen sie sich selber sie, wir, wie du es gesagt hast, alles ins unendliche vergrössert.
vergrössern soll das programm ja, das heisst, das man den code nicht ändern knn (soll)

aber du kannst ja machen, das das fenster der maus folgt, bzw es so machen, das die maus gar nicht auf die lupe kommen kann.

probiers mal so.
-.-"
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Wie wärs mit dem:

Code: Alles auswählen

; 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, 600, 600)
  Else
    BmpID.l = handle
  EndIf
  SelectObject_( MemDC, BmpID)
  StretchBlt_( MemDC, 0, 0,600*Factor,600*Factor, DC,Left, Top, 600, 600, #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, 300,300, hImage)
;
Repeat
  EventID.l = WindowEvent()
  Delay(10)
  GetCursorPos_(CursorPosition)
  If WindowMouseX() = -1 And WindowMouseY() = -1
  hImage = CaptureScreen( CursorPosition\x, CursorPosition\y, hImage,4)
  SendMessage_(hGadget, #STM_SETIMAGE, #IMAGE_BITMAP, hImage)
  EndIf
Until EventID=#PB_EventCloseWindow
;
End
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
rayman1970
Beiträge: 89
Registriert: 01.09.2004 16:10
Wohnort: Troisdorf bei Bonn
Kontaktdaten:

Beitrag von rayman1970 »

Hi DarkDragon !

Der Code ist leider nicht das was ich mir vorstelle . Ich denke ich werde es so versuchen :Ich errechne aus den Koordinaten die Postion an der sich der Zoom selbst sieht . Dann werde ich mit DrawImage dort einen grauen Bereich setzen . Ich finde das besser als wenn der Zoom gestoppt wird wie bei dem Code oben .
Das wird bestimmt eine schöne Rechnerei , besonders da ich in dieser Woche Spätschicht habe und es mir etwas an der nötigen Freizeit mangelt :lol:

Gruss Rayman
Antworten