Problème Screen region

Utilisateur anonyme - 5 juil. 2015 à 11:15
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 11 juil. 2015 à 19:09
Bonjour, j'ai un logiciel pour prendre des captures d'écran, j'utilise ce code pour selectionner la zone mais je ne peux selectionner que vers en bas a droite et je voudrais pouvoir draw mon rectangle dans tout les sens. J'ai cherché dans le code et sur internet mais j'ai rien trouvé..
Imports System.Runtime.InteropServices

Public Class frmSS
Private Declare Auto Function BitBlt Lib "gdi32.dll" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean
<DllImport("user32.dll")> _
Public Shared Function GetAsyncKeyState(ByVal vKey As Int32) As Short
End Function
Private Declare Auto Function GetDC Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr
Private Declare Auto Function ReleaseDC Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As IntPtr

Private Sub frmSS_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 1
Timer1.Enabled = True
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Me.Location = New Point(0, 0)
Me.ClientSize = Screen.GetBounds(Me).Size
Me.BackColor = Color.Gray
Me.DoubleBuffered = True
Me.Opacity = 0.4#
Me.Cursor = Cursors.Cross
Me.ShowInTaskbar = False
End Sub

Private isDragging As Boolean = False
Private canDrag As Boolean = True
Private pt_start As Point = Point.Empty
Private pt_end As Point = Point.Empty

Private Sub frmSS_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If Me.canDrag Then
Me.isDragging = True
Me.pt_start = e.Location
End If
If e.Button = MouseButtons.Right Then
If Me.isDragging = True Then
Me.isDragging = False
Me.pt_start = e.Location
Me.pt_end = e.Location
Me.Refresh()
End If
End If
End Sub

Private Sub frmSS_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If Me.isDragging Then
Me.pt_end = e.Location
Me.Invalidate()
End If
End Sub

Private Sub frmSS_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
If Me.isDragging Then
Me.isDragging = False
Me.canDrag = False
Me.Cursor = Cursors.Default
Dim r As Rectangle = Me.SelectedRectangle
Me.Hide()
Application.DoEvents()
Me.CaptureThisArea(r)
Me.Close()
End If
End Sub

Private ReadOnly Property SelectedRectangle() As Rectangle
Get
With pt_start
If .X >= pt_end.X OrElse .Y >= pt_end.Y Then Return Rectangle.Empty
Return New Rectangle(.X, .Y, pt_end.X - .X, pt_end.Y - .Y)
End With
End Get
End Property

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

Using p As New Pen(Color.Black, 3)
p.DashStyle = Drawing2D.DashStyle.Dash
If Me.SelectedRectangle <> Rectangle.Empty Then
e.Graphics.FillRectangle(Brushes.Cyan, Me.SelectedRectangle)
e.Graphics.DrawRectangle(New Pen(Color.Black, 3), Me.SelectedRectangle)
End If

End Using

MyBase.OnPaint(e)
End Sub

Private Sub CaptureThisArea(ByVal area As Rectangle)
Try
Dim bmp As New Bitmap(area.Width, area.Height, Imaging.PixelFormat.Format24bppRgb)
Dim filenamerandom As Integer
Dim random As New Random()
filenamerandom = random.Next(100000000, 999999999)
Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Using g As Graphics = Graphics.FromImage(bmp)
Dim srcDC As IntPtr = GetDC(IntPtr.Zero)
Dim destDC As IntPtr = g.GetHdc()

BitBlt(destDC, 0, 0, area.Width, area.Height, srcDC, area.X, area.Y, 13369376) 'SRCCOPY = 13369376

g.ReleaseHdc(destDC)
ReleaseDC(IntPtr.Zero, srcDC)
End Using

Merci

6 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
5 juil. 2015 à 12:54
Le problème que tu as est tout simplement qu'en informatique, le coin en haut à gauche est de 0, donc, si tu veux pouvoir le sélectionné "dans tout les sens", il faut que tu manipules les coordonnées pour respecter cela.
0
Utilisateur anonyme
5 juil. 2015 à 16:39
Oui je sais mais je ne parle pas du coin en haut a gauche de l'écran (qui est 0) mais de la selection de l'utilisateur avec le rectangle
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
5 juil. 2015 à 17:23
Pareil, si tu veux que l'utilisateur en décalant son curseur passe de 10,10,2,2 à 5,5,7,7 car il s'est déplacé dans l'autre sens, c'est à toi de modifier la position et la taille du rectangle.
0
Utilisateur anonyme > NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024
5 juil. 2015 à 17:34
Apres avoir cherché je trouve pas dans le code ce qu'il ne va pas c pour sa
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211 > Utilisateur anonyme
Modifié par ucfoutu le 5/07/2015 à 19:13
Bonjour,
(des difficultés à te lire ...)
Et en langage clair et normal, qu'as-tu dit ?
0
Utilisateur anonyme > ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018
5 juil. 2015 à 19:13
lol j'ai juste pas trouvé ce qu'il ne va pas dans le code donc c'est pour cette raison que j'ai posté ici.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159 > Utilisateur anonyme
5 juil. 2015 à 20:12
Ucfoutu te demande de décrire mieux ton problème.

Me concernant, ce que j'ai compris :
Tu as un code qui permet une sélection rectangulaire, mais seulement de en haut à gauche vers en bas çà droite et toi tu voudrais pouvoir faire la sélection dans tout les sens et pas seulement celui-ci.
0
Utilisateur anonyme
11 juil. 2015 à 13:10
Toujours personne ?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
11 juil. 2015 à 13:20
Je te l'ai déjà dit, je t'ai déjà donné une piste, mais tu ne l'as pas encore exploré apparemment.
0
Utilisateur anonyme > NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024
11 juil. 2015 à 14:13
J'ai déjà cherché partout dans le code et sur internet et je trouve pas du tout, si j'ai posté c'est que je ne sais pas du tout d'où sa vient
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
11 juil. 2015 à 14:21
Dans ton code, tu pars du premier clic, puis tu définis la taille à partir de la position de la souris, si c'est négatif, c'est que tu dois inverser les positions.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
11 juil. 2015 à 16:10
Bonjour,

comme te l' a dit NHenry, que je salue:


Private ReadOnly Property SelectedRectangle() As Rectangle
        Get
            With pt_end
                If .X >= pt_start.X OrElse .Y >= pt_start.Y Then Return Rectangle.Empty
                Return New Rectangle(.X, .Y, pt_start.X - .X, pt_start.Y - .Y)
            End With
        End Get
    End Property


il suffit de changer cela!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 11/07/2015 à 18:21
Bonjour,
Si, comme je le pense, un rectangle est défini par :
- les coordonées de son angle supérieur gauche
- sa hauteur
- et sa largeur,
Il devrait suffire :
- de dire qu'il est vide si Xa = xd ou que ya = yd (où xd,yd sont les coordonnées de départ et xa,ya, celles d'arrivée)
- de dire que l'abscisse de son coin supérieur gauche est la plus petite des deux valeurs Xa et Xd
- de dire que l'ordonnée du coin supérieur gauche est la plus petite des deux valeurs Ya et Yd
- de dire que sa hauteur = la valeur absolue de Ya-Yd
- de dire que sa largeur = la valeur absolue de Xa-Xd
decvrait être toujours vrai, me semble-t-il.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 12/07/2015 à 08:29
En d'autres termes et en langage simulé :
soient : xd l'abscisse de départ, xa, l'abscisse d'arrivée, yd l'ordonnée de départ, ya, l'ordonnée d'arrivée, (xr,yr) les coordonnées du coin supérieur gauche du rectange, L la largeur du rectangle et h la hauteur du rectangle ===>>>
- si xa <> xd et ya <> yd (sinon pas de rectangle)
- alors :
---xr = si xa<xd ===>> xa sinon xd
---yr =si ya<yd ===>> ya sinon yd
--- L = valeur_absolue de xa-xd
--- H = valeur absolue de Ya- Yd
picétou.
On est là à de la géométrie... le reste (transposition en informatique, quel que soit le langage) est un jeu de garçonnet. Vraiment !
________________________________
EDIT : oublions tout langage connu et ===>>>

avec ces conventions :
-dessine_rect est la méthode de dessin d'un rectangle
- stylo est un pinceau
- ABS est la fonction d'extraction de valeur absolue
- la syntaxe de cette méthode est :
dessine_rect (stylo, xr,yr,L,H)

- iif est une fonction telle que
iif(toto = "a","b","c")
retourne "b" si toto = "a" ou "c" sinon.

=====>> l'application de CES conventions donnerait :
dessine_rect (stylo, iif(xa<xd,xa,xd),iif(ya<yd,ya,yd),ABS(xa-xd),ABS(ya-yd))

yapluka



________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
Rejoignez-nous