Teditul tău

TEdit dvs.

Am căutat, m-am uitat, dar n-am găsit nimic sensibil.
De mult timp am un vis de a-mi face TEdit-ul, cu propriul desen al conținutului.

O nevoie mare apare în ea, de exemplu, dacă aveți nevoie să editați celula unei mese într-un anumit stil, cu un fundal, arthurfaces, poziția neuniformă a textului etc.

Eu practic tot ce poate face, dar eu sunt jenat de faptul că controlul vindovyh, și nu știu prea bine specificul muncii sale, adică, vreau să spun că nu știu cum să facă acest lucru, a lucrat atât de bine , precum și de obiceiul TEdit.

Cum ar fi un standard pentru a fixa acesta îndreptare meniu vertical ce evenimente mâner pentru a insera, șterge, tăiate, cum să facă o clipească kursor- prin instanță internă TTimer, sau alte cum ar fi pierderea de cale dreaptă și obținerea se concentreze, și, în general, ce are caracteristici care componenta .

Aș dori să întreb pe Maeștrii care au o experiență în acest domeniu să mă ajute cu niște sfaturi 8)))

(întrebări marcate îngroșate)
Am decis ca TMyEdit să fie moștenit de la # xA0; clasa (TGraphicControl).
A adăugat o proprietate la acesta
# xA0; # xA0; Text proprietate: șir citit FText scrie SetText;

Cred că pentru început, trebuie să vă asigurați că componenta mea este afișată cumva. Nu mai mult timp găsesc primul moștenitor oribil din aceeași clasă
# xA0; TGauge = clasă (TGraphicControl)
din panoul Samples. Privim, așa cum este desenat. ca totul este simplu

dar se pune întrebarea: De ce sunt create două imagini bitmap? Care este scopul de a atrage pe OverlayImage, nu pe TheImage?

Mâine voi continua la 20:00 se termină pe Internet

Vedeți secțiunea msdn a controalelor de utilizator.
Dar, sincer vorbind, e greu să scrii de la zero.

# xA0; # xA0;
# xA0; public
// # xA0; # xA0; procedura CutToClipboard;
# xA0; # constructor Creator (AOwner: TComponent); suprascrie;
# xA0; # xA0; distrugătorul distrugător; suprascrie;
# xA0;
# xA0; publicată
# xA0; # xA0; proprietatea Color;
# xA0; # xA0; proprietatea ParentColor;
# xA0; # xA0;
# xA0; sfârșitul;
.

procedura TCustomAditor.WMKillFocus (var Msg: TWMKillFocus);
începe
# xA0; moștenit;
# xA0; Windows.HideCaret (Mâner);
# xA0; Windows.DestroyCaret;
se încheie;

procedura TCustomAditor.WMSetFocus (var Msg: TWMSetFocus);
var cw, ch: integer;
începe
# xA0; cw: = 2;
# xA0; ch: = 14;
# xA0; CreateCaret (mâner, 0, cw, ch);
# xA0; ShowCare (mâner);
// # xA0; UpdateCaret;
se încheie;


Mai sus este arătat și modul de lucru cu scaunul. Într-adevăr, este necesar să adăugăm că transportul a intrat în poziția sa. În ceea ce privește focalizarea atunci când mouse-ul este apăsat pe componentă, trebuie să setați focalizarea # xA0; Windows.SetFocus (Mâner);
Sunteți un TGauge, și aceasta este o componentă vizuală. Pentru ca bara de progres să nu clipească, utilizați tampon dublu. De aceea este atras de OverlayImage.


> Dar pomoymu trebuie să facă de la o altă clasă.

Ieri a regândit activitatea componentei viitoare, într-adevăr, este necesar ca părintele să fie fie TWinControl, fie TCustomEdit.

Pentru eșantionul creat din TCustomEdit, adăugat Pen, Brush, Canvas, a fost redefinit:
# xA0; # xA0; procedura WMPaint (var Mesaj: TWMPaint); mesaj WM_PAINT;

procedura TMyEdit2.WMPaint (mesaj var: TWMPaint);
var
# XA0; X, Y, W, H, S: Integer;
începe
# xA0; cu FCanvas face
# xA0; începeți
# xA0; Pen: = FPen;
# xA0; # xA0; Perie: = FBrush;
# xA0; # xA0; X: = Pen.Width div 2;
# xA0; # xA0; Y: = X;
# xA0; # xA0; W: = Lățime - Pen.Width + 1;
# xA0; # xA0; H: = Înălțime - Pen.Width + 1;
# xA0; # xA0; dacă Pen.Width = 0 atunci
# xA0; # xA0; începeți
# xA0; # xA0; # xA0; Dec (W);
# xA0; # xA0; # xA0; Dec (H);
# xA0; # xA0; sfârșitul;
# xA0; # xA0; dacă W # xA0; # XA0; Inc (X, (W-S) div 2);
# xA0; #XA0; Inc (Y, (H-S) div 2);
# xA0; # xA0; W: = S;
# xA0; # xA0; H: = S;
# xA0; # XA0; Elipsa (X, Y, X + W, Y + H);
# xA0; sfârșitul;
se încheie;

Hmmm. Nu știam că WM_PAINT este numit tot timpul. Mă găsesc în mijlocul edițiilor care eliberează mereu, altfel totul funcționează ca în edite.
Întrebare maeștrilor - Paint și trebuie să fie invocată în mod constant și aspira la nesfârșit de control, sau ceva am uitat să fac este am nevoie pentru a seta unele de pavilion într-un messege, sau ceva de genul asta, ceva pentru zoom despre Ce este redarea făcută?

Am încercat să schimb părintele meu în TWinControl. era doar o elipsă pâlpâitoare.

Hmm. dacă am supraîncărcat WM_Paint, de ce descendentul TCustomEdit continuă să deseneze cadrul și chiar și literele. M-am uitat la părinții mei, am găsit-o
# xA0; # xA0; procedura WMNCPaint (mesaj var: TMessage); mesaj WM_NCPAINT;

redefinește, pune tot același cod al elipsei,
hmm. deja mai bine. avem un dreptunghi alb, și aceeași elipsă pâlpâitoare, literele nu sunt vizibile. Ne gândim cum să scăpăm de dreptunghiul alb.

Eroare - literele sunt încă desenate.
În plus, găsim un efect neplăcut - delfa începe să se frâneze cu curaj din cauza repetării continue.

Am stat mult timp și am examinat activitatea TCustomEdit. există îndoieli că pot redefini complet reluarea acestui control. Creează o editare nouă și comunică prin intermediul mesajelor. deși este posibil să faceți o nouă editare, să o ascundeți, să o lăsați în stare de funcționare și să o trageți, schimbând din nou mesaje cu ea.
Se pare că trebuie să faci TWinControl un călăreț, el nu atrage cel puțin

Dragi maeștri - vă rugăm să vă exprimați părerea, de la care părinte este mai bine să creați un astfel de control și de ce


> Vopsea și ar trebui să fie provocate în mod constant și fără ca sfârșitul să se redreseze
> control

Da, agenții de gestionare a mesajelor sunt automat apeși când controlul primește un mesaj corespunzător. O redresare are loc ca răspuns la aproape toate acțiunile utilizatorului.

umbra - multumesc 8))

În timp ce făcea altă lucrare, am dat peste următorii:
TCustomControl
Această clasă provine din clasa TWinControl. Acesta introduce conceptul de pânză și conține metoda Paint (), care oferă un control sporit asupra aspectului componentei dvs. Această clasă este folosită în principal pentru a crea elemente de ferestre personalizate

Dar atunci tot ceea ce se referă la text va trebui să fie scris de la zero

Dacă doriți să modificați numai conținutul de desen, acesta moștenește de la TCustomEdit, și o redare făcut prin exemplul TDBEdit handler WM_PAINT.

Șters de moderator
Notă: Offtopic

Articole similare