Seite 1 von 1

Lupe sieht sich selbst

Verfasst: 05.04.2005 21:57
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

-

Verfasst: 06.04.2005 16:30
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.

Verfasst: 06.04.2005 18:50
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

Verfasst: 06.04.2005 21:11
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