( تعداد نمایش : 1579 )

چگونه یک TRichEdit با پس زمینه Tile بسازیم؟

به نظر می آید راهی برای Transparent کردن یک RichEdit عادی یا نقاشی کردن یک تصویر در پس زمینه آن به صورت Tile وجود ندارد.

اما در ویندوز ۲۰۰۰ یک راه عقبی وجود دارد که با کمک آن می شود این کار رو انجام داد. در این ویندوز شما می توانید کنترل خود را با استفاده از مقدار دهی ثابت WS_EX_LAYERED به استیل(Style)های توسعه یافته ویندوز و سپس فراخوانی تابع APIی به نام SetLayeredWindowAttributes به صورت Transparent در بیاورید.

مثال پایین یک کنترل TRichView با پراپرتی DrawStyle است. بسته به مقدار آن، کنترل پس زمینه Transparent خواهد داشت یا خودش را با alpha transparency نقاشی می کند.

constructor MyTransparentRichEdit.Create(AOwner: TComponent);
begin
inherited
Create(AOwner);
FDrawStyle := dsNormal;
end;

procedure MyTransparentRichEdit.CreateParams(var Params:
TCreateParams);
begin
inherited
CreateParams(Params);
if not (csDesigning in ComponentState) then
begin
Params.Style := Params.Style or WS_POPUP;
Params.ExStyle := Params.ExStyle + WS_EX_LAYERED;
end;
end;

procedure MyTransparentRichEdit.CreateWnd;
var
XPoint: TPoint;
begin
if not
(csDesigning in ComponentState) then
begin
XPoint := TWinControl(Owner).ClientToScreen(POINT(Left, Top));
Left := XPoint.X;
Top := XPoint.Y;
end;
inherited CreateWnd;
case FDrawStyle of
ds_Transparent:
SetLayeredWindowAttributes(Handle, ColorToRGB(Color), 255, LWA_COLORKEY);
ds_NotDistinctly:
SetLayeredWindowAttributes(Handle, 0, 150, LWA_ALPHA);
end;
end;

procedure MyTransparentRichEdit.SetDrawStyle(AValue: TDrawStyle);
begin
if
FDrawStyle <> AValue then
begin
FDrawStyle := AValue;
RecreateWnd;
end;
end;


موفق و موید و منصور باشید

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن