Bei folgendem Code schiesst die CPU auslastung seit kurzem in die höhe

Peter86

Erfahrenes Mitglied
Hallo,
ich habe ein Programm geschrieben welches aber keine Schaltfläche ( Title, Minimize, Schliessen tasten usw. die leiste ganz oben ) hat. Da ich aber trotzdem möchte das man das tool verschieben kann hab ich eine Picturebox ganz oben hingemacht und wenn man die klickt kann man mit folgendem Code das fenster verschieben.

Code:
    Private _move As Boolean = False
    Dim differencePoint As New Point
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        _move = True
        differencePoint = e.Location
    End Sub

    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If _move Then
            Dim newX As Int32 = (Me.Location.X - differencePoint.X) + (e.X)
            Dim newY As Int32 = (Me.Location.Y - differencePoint.Y) + (e.Y)
            Me.Location = New Point(newX, newY)
        End If
    End Sub

    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        _move = False
    End Sub

Funkioniert auch, nur dass das Programm anfängt rumzuflackern und die CPU auslastung in die Höhe steigt. Das Seltsame ist ich hab den Code schonmal bei einem anderen Programm verwendet, was fast baugleich ist und da ist das besagte problem nicht.

Ich hoffe ihr könnt mir weiterhelfen. Ich weiß nicht mehr weiter.

Peter86
 
Zuletzt bearbeitet:
Danke, sieht schon etwas besser aus. Nun steigt die auslastung aber nicht auf 60 % sondern auf 90 %. Das Seltsame ist aber das ich den code bei einem Baugleichen programm schon verwendet habe und da das besagte problem nicht auftritt. Die CPU auslastung erhöht sich da auch nicht.

Kennt vielleicht jemand einen Code der zum gleichen ergebnis führt? Sprich man klickt auf eine Picturebox und kann wärend man Klickt das fenster verschieben.

Peter86
 
Zuletzt bearbeitet:
Vielen Dank, Spyke. Damit klappt es wunderbar.

Doch leider will meine Andocken funktion nicht mehr. ( Das das fenster an den bildschirm rand andockt )

Code:
    'Fenster Verschieben
Private Declare Function ReleaseCapture _
  Lib "user32" () As Integer
    Private Declare Function SendMessage _
      Lib "user32" Alias "SendMessageA" ( _
        ByVal hwnd As Integer, _
        ByVal wMsg As Integer, _
        ByVal wParam As Integer, _
        ByRef lParam As Object) As Integer

    Private Const HTCAPTION As Short = 2
    Private Const WM_NCLBUTTONDOWN As Short = &HA1S
    Private Const WM_SYSCOMMAND As Short = &H112S

    Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        Call ReleaseCapture()
        SendMessage(Me.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0)
    End Sub
'Fenster verschieben End
'Andocken
    Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        Andocken(Me)
    End Sub

    Sub Andocken(ByVal fenster As Form)
        Dim _radius As String = 20
        If Not fenster.WindowState = FormWindowState.Normal Then Exit Sub

        If fenster.Height + fenster.Top > SystemInformation.PrimaryMonitorSize.Height - _radius Then
            fenster.Top = SystemInformation.WorkingArea.Height - fenster.Height
        ElseIf fenster.Height + fenster.Top > SystemInformation.WorkingArea.Height - _radius Then

            fenster.Top = SystemInformation.WorkingArea.Height - fenster.Height
        End If

        If fenster.Left < _radius Then

            fenster.Left = 0
        ElseIf fenster.Left + fenster.Width > SystemInformation.PrimaryMonitorSize.Width - _radius Then

            fenster.Left = SystemInformation.PrimaryMonitorSize.Width - fenster.Width
        End If

        If fenster.Top < _radius Then

            fenster.Top = 0
        ElseIf fenster.Top < SystemInformation.WorkingArea.Top + _radius Then

            fenster.Top = SystemInformation.WorkingArea.Top
        End If

    End Sub
'Andocken End
Meines erachtens müsste es doch funkionieren? Bitte klärt mich auf :) Und helft mir weiter

Peter86
 
Zuletzt bearbeitet:
Wenn ich das richtig gesehen habe brauchst du blos eine Hilfsvariable die dir sagt ob das Fenster angedockt ist/sein soll.
Und mit dieser Hilfsvariable prüfst du dann ob die API Funktionen fürs verschieben aufgerufen werden dürfen.
 
Andocken soll das Fenster immer wenn es den Radius 20 vom bildschrim rand hat. Hat mit meinem alten verschieb code auchfunktioniert, doch mit dem neuen klappt das nicht mehr.
Heißt: Ich verschiebe das Fenster, sobald ich ich los lasse, also auch nich mehr verschiebt wird, soll das Fenster an den Rand andocken wenn es den abstand 20 hat.
Wie mache ich das?


Ich habe noch eine kleine Frage und will nicht extra ein Thema dafür erstellen.
Ich habe eine Textdatei mit mehreren zeilen. In dieser Textdatei gibts jetzt eine Zeile die z.B. so aussieht Text=1000. Problem ist das die zahl (1000 variabel ist also immer unterschiedlich sein kann) und das die Zeile unterschiedliche Positionen hat. Kann sein das die Zeile am anfang der datei steht oder auch am Ende oder in der Mitte. Ich möchte die zeichen nach dem = ändern. Ich schreibe z.b. in eine Textbox 567 dann soll das Text=1000 in Text=567 geändert werden.


Peter86
 
Andocken soll das Fenster immer wenn es den Radius 20 vom bildschrim rand hat. Hat mit meinem alten verschieb code auchfunktioniert, doch mit dem neuen klappt das nicht mehr.
Heißt: Ich verschiebe das Fenster, sobald ich ich los lasse, also auch nich mehr verschiebt wird, soll das Fenster an den Rand andocken wenn es den abstand 20 hat.
So ungefähr
Code:
Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
    If e.Button = MouseButtons.Left Then
        If fenster.Top > _radius AndAlso fenster.Bottom < SystemInformation.PrimaryMonitorSize.Height - _radius AndAlso fenster.Left > _radius AndAlso fenster.Right < SystemInformation.PrimaryMonitorSize.Width - _radius Then
            'normal verschieben
            Call ReleaseCapture()
            SendMessage(Me.Handle.ToInt32, WM_NCLBUTTONDOWN, HTCAPTION, 0)
        Else
            'Andocken lassen 
        End If
    End If
End Sub
Jedoch musst du hier noch mit abprüfen ob die Andockung auch wieder gelöst werden kann. Weshalb ich langsam glaube ob du dich nicht an deinem altem Code halten solltest.

Ich habe noch eine kleine Frage und will nicht extra ein Thema dafür erstellen.
Ich habe eine Textdatei mit mehreren zeilen. In dieser Textdatei gibts jetzt eine Zeile die z.B. so aussieht Text=1000. Problem ist das die zahl (1000 variabel ist also immer unterschiedlich sein kann) und das die Zeile unterschiedliche Positionen hat. Kann sein das die Zeile am anfang der datei steht oder auch am Ende oder in der Mitte. Ich möchte die zeichen nach dem = ändern. Ich schreibe z.b. in eine Textbox 567 dann soll das Text=1000 in Text=567 geändert werden.
Code:
Dim stringNew As String = Regex.Replace(File.ReadAllText(meineDatei), "^Text=([0-9]{1,})$", "Text=200", RegexOptions.Multiline)
Dursucht denn Inhalt der Datei Zeilenweise und prüft ob
Text= am Anfang der Zeile steht (^Text=), gefolgt durch einen numerischen Wert (mindestens eine Zahl) (([0-9]{1,})), gefolgt vom Zeilenende ($)
Und ersetzt jeden gefundenen String durch Text=200
 
Zuletzt bearbeitet:
Ich verzichte einfach auf die Andock funktion. Braucht man ja nicht unbedingt. Ich verschiebe mein Programm lieber flüssig, anstatt hackend und das dabei meine CPU auslastung auf 90 % steigt.

Code:
Dim stringNew As String = Regex.Replace(File.ReadAllText(meineDatei), "^Text=([0-9]{1,})$", "Text=200", RegexOptions.Multiline)
Klappt nur wenn die zeile die ich Ersetzen will die letzte zeile ist. :(

Code:
Text=500
Text2=600
Text bleibt 500

Code:
Text2=600
Text=500
Text wird 200

Peter86
 
hm wenn du $ weglässt funktioniert es
also
Code:
Dim stringNew As String = Regex.Replace(File.ReadAllText(meineDatei), "^Text=([0-9]{1,})", "Text=200", RegexOptions.Multiline)

Eigentlich sollte es auch mit $ funktionieren aber warum ers nicht macht ist mir grad nen Rätsel.
 

Neue Beiträge

Zurück