Utilisateur anonyme
-
5 juil. 2015 à 11:15
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 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()
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 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.
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
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 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.
Utilisateur anonyme
>
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211
>
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 ?
Utilisateur anonyme
>
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 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.
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159
>
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.
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 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.
Utilisateur anonyme
>
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 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
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 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.
cs_Le Pivert
Messages postés7903Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention11 mars 2024137 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!
Vous n’avez pas trouvé la réponse que vous recherchez ?
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.
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 :