Կա՞ որևէ կերպ թափանցիկ տեքստ նկարելու ձևի վրա, որն ունի որոշակի հսկողություն: Եթե ես օգտագործեմ TLabel
կոնտրոլը, այն միշտ կցուցադրվի ձևի կառավարիչների հետևում:
Ինչպե՞ս նկարել թափանցիկ տեքստ ձևի վրա:
Պատասխանները:
Դուք չեք կարող օգտագործել TLabel
հսկողությունը, քանի որ այն պատուհանավորված կառավարում չէ, և, հետևաբար, այն կթաքցվի ձևի յուրաքանչյուր պատուհանավորված երեխայի կառավարման միջոցով: Դուք կարող եք օգտագործել TStaticText
-ը, որն իսկապես պատուհանով հսկողություն է (STATIC
հսկողություն), բայց մի փոքր դժվար կլինի այն իսկապես թափանցիկ դարձնել, ես ենթադրում եմ:
Դրա համար կարող եք օգտագործել շերտավոր պատուհաններ.
Ստեղծեք նոր VCL նախագիծ և դրան ավելացրեք մի շարք պատուհաններով կառավարումներ:
Նախագծում ստեղծեք նոր ձև՝
splash
անունով: ՍահմանեքBorderStyle
-ըbsNone
, և տառատեսակի անունը, չափը և գույնը դրեք ձեր ուզածի վրա (օրինակ՝ Segoe UI, 42, կարմիր):Ավելացնել հանրային մեթոդ
procedure Tsplash.UpdateSplash(const Str: string); var R: TRect; P: TPoint; S: TPoint; bm: TBitmap; bf: TBlendFunction; EXSTYLE: DWORD; x, y: integer; pixel: PRGBQuad; TextRed, TextGreen, TextBlue: byte; begin EXSTYLE := GetWindowLong(Handle, GWL_EXSTYLE); SetWindowLong(Handle, GWL_EXSTYLE, EXSTYLE or WS_EX_LAYERED); R := ClientRect; bm := TBitmap.Create; try bm.PixelFormat := pf32bit; bm.SetSize(ClientWidth, ClientHeight); bm.Canvas.Brush.Color := clBlack; bm.Canvas.FillRect(ClientRect); bm.Canvas.Font.Assign(Self.Font); bm.Canvas.Font.Color := clWhite; DrawText(bm.Canvas.Handle, PChar(Str), Length(Str), R, DT_SINGLELINE or DT_VCENTER or DT_CENTER or DT_WORD_ELLIPSIS); TextRed := GetRValue(Font.Color); TextGreen := GetGValue(Font.Color); TextBlue := GetBValue(Font.Color); for y := 0 to bm.Height - 1 do begin pixel := bm.ScanLine[y]; x := 0; while x < bm.Width do begin with pixel^ do begin rgbReserved := (rgbRed + rgbGreen + rgbBlue) div 3; rgbBlue := TextBlue * rgbReserved div 255; rgbGreen := TextGreen * rgbReserved div 255; rgbRed := TextRed * rgbReserved div 255; end; inc(pixel); inc(x); end; end; P := Point(0, 0); S := Point(bm.Width, bm.Height); bf.BlendOp := AC_SRC_OVER; bf.BlendFlags := 0; bf.SourceConstantAlpha := 255; bf.AlphaFormat := AC_SRC_ALPHA; UpdateLayeredWindow(Handle, 0, nil, @S, bm.Canvas.Handle, @P, 0, @bf, ULW_ALPHA) finally bm.Free; end; end;
Ձեր հիմնական ձևին ավելացրեք մասնավոր մեթոդներ
procedure TForm1.CreateSplash; var p: TPoint; begin splash.Visible := true; UpdateSplash; end; procedure TForm1.UpdateSplash; var p: TPoint; begin if not (Assigned(splash) and splash.Visible) then Exit; p := ClientToScreen(Point(0, 0)); splash.SetBounds(p.X, p.Y, ClientWidth, ClientHeight); splash.UpdateSplash('Sample Text'); end;
և զանգահարեք
UpdateSplash
ամեն անգամ, երբ ձևը տեղափոխվում կամ չափափոխվում է.procedure TForm1.WMMove(var Message: TWMMove); begin UpdateSplash; end; procedure TForm4.FormResize(Sender: TObject); begin UpdateSplash; end;
Ի վերջո, դուք կարող եք անել, պարզապես փորձելու համար,
procedure TForm1.FormClick(Sender: TObject);
begin
if splash.Visible then
splash.Hide
else
CreateSplash;
end;