Win32: Wie Sie benutzerdefinierte zeichnen ein Edit-Steuerelement?
brauche ich, um die Funktionalität implementieren, die von EM_SETCUEBANNER, wo ein text-Hinweis erscheint im inneren ein Edit-Steuerelement:
Der Haken ist, dass ich nicht verwenden können, die version 6 der Common Controls, die was ist erforderlich, um das von Microsoft bereitgestellte Implementierung eines cue-banner.
ist, habe ich mich in Sie verändern einfach den text in das edit-Steuerelement, und das schriftart-format zu
Dark Gray Italic Text
aber es wirft Ändern Veranstaltungen (Komponenten-wrapper bereitgestellt durch höhere Bauteil-Bibliothek) , ich kann nicht einen Weg finden, zu vermeiden.
So war ich statt zu gehen, um benutzerdefinierte ziehen Sie den text, zeichnen Sie die Cue-Banner-text, wenn das Steuerelement ist unkonzentriert und leer, und verlassen sich auf Standard-Malerei sonst.
Den Edit-control nicht gut setzen Sie eine benutzerdefinierte Zeichnung Mechanismus, wie ListView, TreeView und andere bieten.
Andere Leute haben hingeschaut, aber es scheint eine fast Unmögliche Aufgabe:
Aus der Art und Weise, die Dinge suchen, ich werde
haben, um die folgenden
Nachrichten:
- WM_ERASEBKGND -, WM_PAINT (aus offensichtlichen Gründen)
- WM_SETFOCUS, WM_KILLFOCUS (um zu verhindern, dass
der weiße Balken von der Anzeige --
oben beschrieben)- WM_CHAR (zu verarbeiten und aktualisieren
text in das Steuerelement)Und ich müssen auch einen Weg finden
Anzeige der Cursor in das Steuerelement,
da ich noch keinen Weg gefunden, zu ermöglichen
Windows zu tun, dass für mich auch ohne
Malerei der weiße Balken, die ich erwähnt.Dieser wird Spaß machen. :rolleyes:
Gegeben, dass die Windows-Edit-Steuerelement war nie vorgesehen, custom gezogen: weiß jemand, wie man benutzerdefinierte zeichnen Sie ein Windows-Edit-Steuerelement?
Hinweis: ich werde auch akzeptieren, Antworten, die mein problem lösen, statt die Beantwortung meiner Frage. Aber jemand anderes wollen, um benutzerdefinierte zeichnen ein Edit-Steuerelement, kommen über diese Frage, würde wohl gerne eine Antwort.
ich hatte versucht, Ihren Ansatz vor. ich war neugierig, wie Sie das problem gelöst, Zeichnung der "Suchbox" Themen. Aber ich sehe Sie nicht das problem lösen.
6 Jahren, ich sage nur CreateWindow mit text als Standard. Wenn der Benutzer auf das Steuerelement, das Sie löschen den text. Sie können auch die schriftart auf Kursiv, wie im Beispiel aus und ändern Sie auf klicken Sie auf.
InformationsquelleAutor Ian Boyd | 2009-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutzerdefinierte Zeichnung, die ein Edit-Steuerelement ist im wesentlichen unmöglich. Es gibt ein paar spezielle Fälle, waren Sie dabei so wenig, die können mit ihm Weg erhalten, aber Sie riskieren brechen schlecht in die nächste revision von windows (oder wenn jemand läuft deine app auf einer älteren version, oder auch über terminal services, etc).
Nur die übernahme der WM_PAINT-und WM_ERASEBKGROUND nicht gut genug, weil die Steuerung manchmal malen auf andere Nachrichten als gut.
Sind Sie besser dran, nur das schreiben Ihrer eigenen edit-Steuerelement. Ich weiß, dass eine riesige Menge an Arbeit, aber auf lange Sicht wird es weniger Arbeit, als zu versuchen zu hacken, Ihren Weg in die übernahme aller im Edit-controls zeichnen-code.
Ich erinnere mich zurück in die guten alten Tage, wenn Sie jeder verwenden, um eine Unterklasse das button-Steuerelement zum hinzufügen von Farbe und Grafiken, etc. Die Sache ist die, eines Tages setzte ich mich hin und schrieb meine eigenen Buttons window-Klasse. und es war WENIGER CODE als das, was wir hatten in unseren source-tree zu Unterklasse und benutzerdefinierte zeichnen Sie die Windows-Taste.
Ja, so oder so ist ot ein riesiger Haufen code. Ich sage nur, nicht selbst zum Narren zu denken, dass Unterklassen mit weniger code. Auf lange Sicht, es wahrscheinlich nicht werden.
ich landete bilden von Unterklassen der edit, das auslösen einer Farbe in Reaktion auf die anderen Nachrichten, die nicht nur
WM_PAINT
. Einige andere Nachrichten, die zu einem internen malen geschehen, ohneWM_PAINT
geschehen, und von mir verlangen, Sie zu streichen, über Ihre repaint:WM_SETFOCUS
,WM_KILLFOCUS',
WM_KEYUP,
WM_KEYDOWN`, und wenn die Maus betritt und verlässt.Also, wenn Sie endete Unterklassen der Kontrolle, warum haben Sie diese Antwort schlägt vor, dass schreiben ein eigenes Steuerelement von Grund auf neu?
McCarthy: Weil es funktioniert nicht vollständig. Sie haben zu Schicht hack nach hack auf hack - und Sie kann immer noch nicht machen es richtig funktioniert. Noch schlimmer ist, dass es sehr zerbrechlich; änderungen der edit-Steuerelement unterhalb und kann es zu brechen. Unterklassen eines Steuerelements Bearbeiten, kann nicht als eine Antwort auf das problem. Bei best genannt werden könnte ein workaround. Machen dies die richtige Antwort (im wesentlichen unmöglich)
InformationsquelleAutor John Knoeller
Erstellen Sie eine window-Klasse von Ihrer eigenen, die aussieht und leere edit-Steuerelement, das schöpft die cue-text und zeigt ein caret-und Fokus hat. Erstellen Sie das Steuerelement Bearbeiten, auch, aber die position, die Sie hinter Ihrem Fenster. (oder lassen Sie es versteckt)
Dann, wenn Sie den ersten WM_CHAR-Nachricht (oder WM_KEYDOWN?). Stellen Sie Ihre Fenster hinter den edit-conrol, geben Sie den Fokus auf das Bearbeiten, und übergeben Sie die WM_CHAR-Nachricht auf. Dann ab auf die edit-Steuerelement übernehmen.
Können Sie hören, EN_CHANGE Meldungen aus dem edit-Steuerelement, wenn Sie brauchen, um zurück zu gehen zu zeigen, Ihre cue-text, wenn das edit leer wird. Aber ich würde denken, es wäre in Ordnung, gehen Sie zurück zu dem cue-text nur, wenn die edit verliert den Fokus UND ist leer.
InformationsquelleAutor John Knoeller
Subclassing der EDIT-control funktionierte gut für mich - benötigt die Anzeige einige Formatierungs-Informationen, die dem Benutzer beim Bearbeiten von Objekt-Attribute (und manche Attribute können mehrere Zeilen). Die wichtige Sache, wie Adrian sagte in seiner Antwort zu, ist der Aufruf der EDIT-Steuerelement die Prozedur vor Ihre eigenen Zeichnung. Nenne es danach oder bei der Erteilung Ihrer eigenen BeginPaint/EndPaint (mit return 0 oder DefWindowProc) verursacht Probleme für mich aus dem text überhaupt nicht angezeigt, bis es die Anzeige nur, wenn die Größe aber nicht nach der Bearbeitung, verlassen Bildschirm Wurf die übrig gebliebenen caret-Zeichen. Mit, dass, ich hatte keine Probleme, unabhängig von der EDIT-Steuerelement anderen repaint Zeiten.
Einige setup:
Den Rückruf:
Schreiben Sie Ihre eigenen EDIT-Steuerelement (das habe ich tatsächlich getan, mehr als einmal, teilweise Grad der Vollständigkeit im Vergleich zu den built-in einem) ist nicht viel Arbeit, wenn Sie die nackten minimale (vielleicht auch nur auf Englisch mit grundlegenden caret-Zeichen-Unterstützung), aber es ist eine MENGE Arbeit, um zu korrigieren, wenn Sie möchten Cursor-navigation über komplexe Skripte, mit variable-sized-Cluster, Auswahl über Bereiche, IME-Unterstützung, Kontext-Menüs durch kopieren und einfügen, high Kontrast Modi, und die accessibility-features wie text-to-speech. Also im Gegensatz zu so vielen anderen Antworten, die ich empfehlen nicht Umsetzung Ihrer eigenen EDIT-Steuerelement nur für cue-banner-text.
InformationsquelleAutor Dwayne Robinson
Unterklasse des Steuerelements Bearbeiten. Griff
WM_PAINT
durch den ersten Aufruf die ursprüngliche Fensterprozedur und dann, wenn es leer ist und nicht im Fokus ist, ziehen Sie den cue-text. Pass jede andere message an die ursprüngliche Fensterprozedur.Habe ich dies getan-es funktioniert. Das problem der CodeGuru person hatte offenbar nicht auf Ihre situation zutreffen. Ich glaube, er versucht, mehr zu tun, um das Aussehen. Für die performance sieht es so aus das edit-Steuerelement ist zu tun, einige updates außerhalb der
WM_PAINT
Verarbeitung (vermutlich für Leistung). Das ist zu machen es fast unmöglich, die vollständige Kontrolle über das Aussehen. Aber Sie KÖNNEN ziehen Sie den cue-Eingabeaufforderung.WM_PAINT
. Manchmal ist dieEDIT
Kontrolle wird die Farbe selbst nach einemWM_KILLFOCUS
- und keine WM_PAINT-Nachricht an das Steuerelement gesendet werden (also nicht ungültig). Das heißt, Sie haben auch mit WM_KILLFOCUS und lösen Ihre eigenen Farben nach. UndWM_SETFOCUS
, undWM_KEYUP', and
WM_KEYDOWN, and other events that cause a paint without
WM_PAINT`.Ich erkannte, dass das edit-control cheats und Farben, die zu anderen Zeiten, aber ich habe implementiert die cue-text mit dieser Technik, und es funktioniert Prima.
nachdem die ursprüngliche Fensterprozedur aufgerufen wird ein leerer ungültig Rechteck-Bereich (da hat es bearbeitet). Aufruf
BeginPaint
vor dem Aufruf der original-windows-Prozedur nicht funktionieren würde. Meine eigene device-Kontext bewirkt, dass ein flimmern (auf ein Recht, das click-Ereignis, im besonderen), und es scheint ziemlich schwierig zu optimieren string-Zeichnung (da es sein muss einschränken, es zu updates auf einen beliebigen Bereich). Kurz gesagt, ich kann nicht denken, der eine einfache Möglichkeit zum zeichnen der cue-banner und kein flackern; sehr interessant 🙂meine eigenen device context" - ich nehme an, du meinst
GetDC
. Bummer über das flimmern. Ich erinnere mich nicht, zu sehen, dass in meiner Umsetzung.ja, ich
GetDC
. Das flimmern ist nicht so schlimm, wenn wechselnden Fokus zwischen den Steuerelementen. Es war meistens verursacht, indem Sie mit der rechten klicken Sie auf Ereignisse. Die meisten Implementierungen klar die banner ein, wenn das Steuerelement den Fokus erhält; vielleicht war dies der Fall für Sie? Das könnte erklären, unsere verschiedenen Erfahrungen. Danke für die Idee 🙂InformationsquelleAutor Adrian McCarthy
Wenn Sie behandeln möchten WM_PAINT selbst, ohne die Weiterleitung der Nachricht an die ursprüngliche windowproc Ihrer Oberklasse, Sie sollten nicht forget um zu rufen DefWindowProc. So, daß der Cursor gezeichnet werden soll.
Um zu vermeiden, die weiße bar, die Sie entfernen sollten Klasse Pinsel mit SetClassLongPtr.
Und irgendwie halten Sie Ihre DC ' s clipping-region auf clip Bearbeiten controt die ExtTextOut-Ausgänge.
Die weißen Balken können die Folge sein, UNDURCHSICHTIGE option übergeben ExtTextOut-von-Edit-Steuerelement.
Fazit: Schreiben Sie Ihre eigenen Kontrolle. Kein Schmerz, kein Gewinn.
InformationsquelleAutor Dmitriy Yurchenko