Autor Beitrag
yndaso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 03.03.10 11:14 
Hallo zusammen,

ich versuche gerade die Textbox ein bisschen zu modifizieren.
Unter anderem möchte ich die Rahmenfarbe ändern. Also hab schon ein
bisschen geschaut, im www gibt es ja schon einige die das gleiche anliegen haben.

Ich weiß auf jeden Fall nun, dass man sich ein eigenes Objekt macht und dies von TextBox ableiten soll. Im onPaint bereich kann man anschließend ein Rechteckt aussen herum "malen".

Hab nun mal angefangen das neue Objekt zu erstellen. Und dies auch schonmal in mein WinForm eingebunden.
Mir fällt aber nun auf das das OnPain Event nicht kommt...

Kann mir jemand sagen was ich hier noch falsch mache:

ausblenden volle Höhe C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace IW_DataMatrix
{
    class TextArea : TextBox
    {
        private Color m_Color;
        private float m_BorderWidth;

        public Color BorderColor
        {
            get { return m_Color;}
            set { m_Color = value;}
        }

        public float BorderWidth
        {
            get { return m_BorderWidth;}
            set { m_BorderWidth = value;}
        }
        
      
        public TextArea()
        {
            base.BorderStyle = BorderStyle.None;
     //das wird noch abgearbeitet:    
            this.Paint += new PaintEventHandler(TextArea_Paint);      
        }
         //das Ereigniss kommt nie:    
        void TextArea_Paint(object sender, PaintEventArgs e)
        {
            throw new Exception("The method or operation is not implemented.");
        }


    }
}


Vorab Danke!
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 03.03.10 12:28 
Hallo,

du musst nicht das Paint Event registrieren, sondern die OnPaint-Methode überschreiben.

Gruß Daniel
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 03.03.10 12:35 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

du musst nicht das Paint Event registrieren, sondern die OnPaint-Methode überschreiben.

Gruß Daniel


Danke

habe das nu abgeändert und das Event rausgeschmissen, stattdessen habe ich mal folgendes
eingefügt und ein Breakpoint mal dahin gesetzt.
ausblenden C#-Quelltext
1:
2:
3:
4:
        protected override void OnPaint(PaintEventArgs e)
        {       

        }


Dieser Teil wird auch nicht bearbeitet.

In meinem Hauptform habe ich die onPaint Methode auch drin:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.IW_DataMatrix_Paint);
            ....

           private void IW_DataMatrix_Paint(object sender, PaintEventArgs e)
        {
         ...
        }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 03.03.10 13:00 
Painting ist für Textboxen eigentlich abgeschaltet. Du kannst es aber über die SetStyle Methode wieder einschalten(siehe Code).
Das das ausgeschaltet ist hat aber seinen Grund. Das zeichnen übernimmt eigentlich komplett das CommonControl unter der Winforms Hülle. Das ändern des Verhalten ist also nicht so einfach möglich.
Wie im Code gezeigt kannst du zwar auf dem Control zeichnen das grundsätzliche ~Paintverhalten~ des CommonControls zu ändern müsstest du wahrscheinlich tiefer eingreifen. Vermutlich die WndProc überschreiben WM_Paint fangen und dort dem darunterliegenden CommonControl die passenden WindowMessages senden.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    public class TextArea : TextBox
    {
        public TextArea ()
        {
            SetStyle(ControlStyles.UserPaint, true);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Rectangle rect = e.ClipRectangle;
            rect.Width -= 1;
            rect.Height -= 1;
            
            e.Graphics.DrawRectangle(new Pen(Color.Red), rect);
        }   
    }
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 03.03.10 13:07 
Hey danke!

Das war ein super Tip, funktionert...

Ähm hat das ändern des SetStyle Auswirkungen auf das Form?
Sollte man vielleicht das SetSytle am Ende wieder auf "false" setzen?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 03.03.10 13:13 
SetStyle bezieht sich nur auf Styles des Controls selbst hat also keinen Einfluss auf den Rest der Form. Zurücksetzen oder jede andere Änderungen an den Styles beim Dispose des Controls hat also keine Auswirkung.
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 03.03.10 14:01 
alles klar.
Vielen Dank nochmals...