Laden...

abgeleitet von textbox: bild verschwindet beim mausklick

Erstellt von kraeppy vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.081 Views
K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 10 Jahren
abgeleitet von textbox: bild verschwindet beim mausklick

Mahlzeit 😃

ich habe ne eigene textbox, die sich wie beschrieben von der win-form textbox ableitet.
ich würd die tb gerne wie folgt gestalten:


|_______________|X|

wenn der cursor zum X kommt, soll dieses erscheinen.
positionsbestimmung etc pp hab ich alles.

wenn ich das bild unabhängig von der mausposition immer zeichnen lasse im onpaint,
einen links-klick mit der maus auf die tb mache, verschwindet aber das bild.

da würde ich gerne wissen, wie ich dieses verschwinden verhindern kann? ich will jetzt nicht jedes mal this.refresh() raufrufen....
gibt es da ne andere möglichkeit? muss man ne bestimmte windowsmessage abfangen, die das löschen des hintergrunds bewirkt oder ähnliches?

danke im voraus und lg 😃
kraeppy

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo kraeppy,

wenn du das Bild im OnPaint zeichnest, dann sollte es automatisch neu gezeichnet werden, wann immer dies nötig ist.

herbivore

5.657 Beiträge seit 2006
vor 10 Jahren

Hi kraeppy,

ich habe ne eigene textbox, die sich wie beschrieben von der win-form textbox ableitet.

Wie beschrieben? Ohne Code oder weitere Erklärungen kann man hier nur Vermutungen über die Ursache anstellen. Siehe [Hinweis] Wie poste ich richtig?, Punkt 5.

Eine Vermutung von mir wäre, daß du in der OnPaint-Methode die OnPaint-Methode der Basisklasse aufrufst, _nachdem _du das Bild gezeichnet hast. Dabei kann es dann passieren, daß die Textbox beim Neuzeichnen dein Bild wieder überschreibt.

Christian

Weeks of programming can save you hours of planning

K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 10 Jahren

@ MrSparkle: sry code folgt:

class mytb : TextBox
    {
        public mytb()
            : base()
        {
            this.SetStyle(ControlStyles.AllPaintingInWmPaint | 
                               ControlStyles.UserPaint|
                               ControlStyles.OptimizedDoubleBuffer, true);    
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImage(
                        WindowsFormsApplication1.Properties.Resources.Pic, 
                        new Point(0, 0));
        }
}

nichts aufwendiges 😃 deshalb nahm ich auch zuerst an, dass die beschreibung reicht. abgeleitet und paint-event ausgenutzt ^^

also wenn die maus auf der tb ist und ein links-klick ausgeführt wird, verschwindet das bild. es taucht erst dann wieder auf, wenn die maus die textbox verlässt.

wenn ich die mousedown-methode überschreibe und nur this.refresh() dort aufrufe, verschwindet das bild nur dann, wenn ich die maustaste gedrückt halte und die maus auf der form bewege. und das bild taucht erst dann wieder auf, wenn die maustaste losgelassen wird und der cursor nicht mehr auf der tb ist.

wenn ich die onmousemove-methode überschreibe und lediglich this.refresh() aufrufe, sieht man leider trotzdem bei gedrückter maustaste, dass das bild kurz gelöscht und neu gezeichnet wird. wenn die maus langsam bewegt wird, wird die onpaint-methode aber seltener aufgerufen, als wenn die maus schnell bewegt wird (ebenf. bei gedrückter maustaste).

gibt es da' ne möglichkeit eine windows-message abzufangen, die heißt "lösch den hintergrund" oder ähnliches?

wüsste sonst echt nicht, wie ich das kurze flackern verhindern kann -.-

schönen abend noch, lg

771 Beiträge seit 2009
vor 10 Jahren

Scheint bei dir wohl das selbe Problem wie [C#] TextBox im UserPaint Stil, weis beim hineinklicken zu sein. Es gibt wohl nur die Workarounds (ähnlich wie du es jetzt schon machst).

Könntest du nicht ein UserControl nehmen, in das du die TextBox einbettest und daneben ein Label oder Panel o.ä. (für das X)?

5.657 Beiträge seit 2006
vor 10 Jahren

Wo wird denn in dem Code eigentlich die Textbox gezeichnet? Ich seh nur den Aufruf zum Zeichnen des Bildes. Evtl. wird der weiße Hintergrund in der OnPaintBackground-Methode gezeichnet, dann hilft es, diese zu überschreiben und dort keine Zeichenbefehle auszuführen.

Christian

Weeks of programming can save you hours of planning

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo MrSparkle,

wenn das im Code benutzte ControlStyles.AllPaintingInWmPaint so wirkt, wie es soll, dann sollte OnPaintBackground nicht mehr aufgerufen werden oder zumindest nichts mehr tun. Allerdings scheint mir das Problem ohnehin tiefer zu liegen ...

Hallo kraeppy,

in Userpaint TextBox Changes the font when I highlight the contents steht:

No good news, I'm afraid. The native Windows text box dates back to Windows 1.0. It has several "optimizations", one of which is drawing without going to through the Paint event. You cannot customize its appearance. 15+ years of app-compat prevents MSFT from fixing this.

Das hat sich in meinen Tests bestätigt. Sobald man eigenen Text in die Box getippt hat, kommt gar kein WM_PAINT mehr in der WndProc der Textbox an, obwohl sie bei jedem weiteren Buchstaben brav aktualisiert wird.

Meine Aussage in der ersten Antwort ist zwar vom Prinzip her richtig, gilt aber anscheinend für eine TextBox aufgrund der "Optimierungen" nicht in jedem Zustand.

Ich denke, richtig sauber wird man das Problem nur lösen können, wenn man nicht auf der Standard-TextBox-Klasse aufbaut. Vielleicht gibt es alternative TextBox-Klassen im Netz, auf denen man aufbauen kann, denn wenn man eine TextBox von Grund auf selber schreibt, dann wäre das wohl recht aufwändig.

herbivore

K
kraeppy Themenstarter:in
50 Beiträge seit 2010
vor 10 Jahren

damn it...

dann muss ich mich wohl oder übel damit abfinden, dass es nicht geht... schade.
dennoch danke für eure hilfe.

lg und angenehmen tag 😃

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo kraeppy,

wenn es nur darum geht, einen X-Button neben eine TextBox zu setzen, könntest du auch einfach zwei Controls verwenden ... und diese bei Bedarf in einem eigenen UserControl zusammenfassen.

herbivore