Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C# und .NET ::  SOLVED - Mausrad ansprechen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
CJens
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 362
Beitrag CJens Mitglied 17:51:20 15.04.2017   Titel:   SOLVED - Mausrad ansprechen            Zitieren

Hallo.

Ich programmiere gerade eine abgeleitete Picturebox, in welche ich ein Bitmap laden können möchte um dieses dann über das Mausrad zu zoomen und über die gehaltene, mittlere Maustaste zu verschieben.

Ich habe vieles noch nicht implementiert, aber schonmal das Ansprechen des Mausrades klappt nicht. Könnt ihr mir sagen, weshalb? Nachfolgend der code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    public class DynamicPictureBox : System.Windows.Forms.PictureBox
    {
        private double ZoomFactor = 1.0;
        private System.Drawing.Image DisplayedImage = null;
        private System.Windows.Forms.ContextMenuStrip MyContextMenuStrip = null;
 
        public DynamicPictureBox() : base()
        {
            System.Windows.Forms.ToolStripItem ti;
 
            #region Settings

            this.Dock = System.Windows.Forms.DockStyle.Fill;
            this.BackColor = System.Drawing.Color.White;
            this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            #endregion

 
            #region Context menu strip

            MyContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
            ti = MyContextMenuStrip.Items.Add("Load picture");
            ti.Click += new EventHandler((sender, e) => DynamicPictureBoxContextMenuFunctions.loadPicture_Click(sender, e, this));
 
            ti = MyContextMenuStrip.Items.Add("Clear picture");
            ti.Click += new EventHandler((sender, e) => DynamicPictureBoxContextMenuFunctions.clearPicture_Click(sender, e, this));
 
            this.ContextMenuStrip = this.MyContextMenuStrip;
            #endregion

 
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(DynamicPictureBox_MouseDown);
            this.MouseWheel += new System.Windows.Forms.MouseEventHandler(DynamicPictureBox_MouseWheel);//Handler im Konstructor definiert. Wird auch ausgeführt
        }
 
        public void LoadBitMap(string Filename)
        {
            this.DisplayedImage = System.Drawing.Image.FromFile(Filename);
            this.Image = DisplayedImage;    
        }
 
        public void ClearImage() { this.Image = null; this.DisplayedImage = null; }
 
        public System.Drawing.Bitmap GetDisplayedBitmap() { return new System.Drawing.Bitmap(DisplayedImage); }
 
        private void DynamicPictureBox_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            MouseInteraction.MouseDown(e);
        }
 
        private void DynamicPictureBox_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("Mouse wheel moved!");
            MouseInteraction.MouseWheele(e, ref this.ZoomFactor, this);
        }
    }


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    public static class MouseInteraction
    {
        public static void MouseWheele(System.Windows.Forms.MouseEventArgs e, ref double ZoomFactor, DynamicPictureBox DPB)
        {
            System.Drawing.Size NewSize;
            ZoomFactor *= Math.Exp(0.1 * (double)e.Delta / 120.0);
            System.Windows.Forms.MessageBox.Show("New zoomfactor: " + ZoomFactor.ToString());
            NewSize = DPB.Size;
            NewSize.Height = (int)((double)NewSize.Height * ZoomFactor);
            NewSize.Width = (int)((double)NewSize.Width * ZoomFactor);
 
            DPB.Image = (System.Drawing.Image)new System.Drawing.Bitmap(DPB.GetDisplayedBitmap(), NewSize);
        }
 
        public static void MouseDown(System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                System.Windows.Forms.MessageBox.Show("Left mouse button clicked!");
            }else if(e.Button == System.Windows.Forms.MouseButtons.Middle)
            {
                System.Windows.Forms.MessageBox.Show("Central mouse button clicked!");
            }
 
        }
 
        public static void ClickMove(System.Windows.Forms.MouseEventArgs e)
        {
 
        }
    }


Ich würde, nach Zeile 49 im ersten, und Zeile 7 im zweiten Codeabschnitt jetzt erwarten, dass beim Bewegen des Mausrades sich einiges tut. Ist aber nicht der Fall. Bei den Maustasten (linke und mittlere - siehe "MouseDown" - funktioniert es ja auch.

Vielen Dank für Eure Anregungen.


Zuletzt bearbeitet von CJens am 21:06:18 20.04.2017, insgesamt 1-mal bearbeitet
CJens
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 362
Beitrag CJens Mitglied 21:05:58 20.04.2017   Titel:   Hab die Lösung            Zitieren

Ok, habe die Lösung. Scheinbar funktioniert das Mausrad nur, wenn das Steuerelement Focused ist.
Also braucht man noch folgendes:

C#:
1
2
3
4
5
6
7
8
9
        public DynamicPictureBox(Main fCentral) : base()
        {
            Central = fCentral;
 
            this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.DynamicPictureBox_MouseWheel);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DynamicPictureBox_MouseDown);
            this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DynamicPictureBox_MoveMouseDown);
            this.MouseHover += new EventHandler(this.DynamicPictureBox_MouseHover); //new!!!
        }


C#:
        private void DynamicPictureBox_MouseHover(object sender, EventArgs e)
        {
            this.Focus();
        }


Und schon funktioniert es :-)
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23592
Beitrag hustbaer Mitglied 21:34:32 20.04.2017   Titel:              Zitieren

Wenn ich mich jetzt nicht grob irre hat das aber den Nachteil dass ... naja, das Control dann eben immer den Fokus bekommt. D.h. jedes andere Control den Fokus verliert. Was vermutlich nicht unbedingt immer das ist was man möchte.

Ich vermute aber dass z.B. das Fenster (also die "Form") auch die Mouse-Wheel Events bekommt, so lange irgend ein Control im Fenster den Fokus hat. Bzw. es muss auch noch andere Möglichkeiten geben -- schliesslich gibt es ja Windows-Programme die Mouse-Wheel Drehen immer mitbekommen, auch wenn ihr Fenster nicht den Fokus hat.

K.A. wie wichtig dir diese Dinge sind, aber wäre es mein Projekt würde ich da vermutlich nochmal ein Bisschen Zeit investieren.

ps: Die übliche Variante scheint zu sein das über IMessageFilter zu machen, siehe z.B.:

http://stackoverflow.com/ ....... heel-scroll-without-focus

Nur nicht vergessen dass man den Message-Filter beim Schliessen des Fensters/Controls auch wieder entfernen sollte (-> Application.RemoveMessageFilter - wird leider in den Beispielen nirgends gezeigt).

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at


Zuletzt bearbeitet von hustbaer am 21:44:26 20.04.2017, insgesamt 1-mal bearbeitet
CJens
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 362
Beitrag CJens Mitglied 06:55:53 21.04.2017   Titel:   Werde mal schauen...            Zitieren

Das ist auch nur bei einigen Steuerelementen so. Nutze ich beispielsweise ein SimpleOGLObject (aus dem Tao-Framework), so ist der explizite Fokus gar nicht notwendig.
C++ Forum :: C# und .NET ::  SOLVED - Mausrad ansprechen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.