به نظر می آید راهی برای Transparent کردن یک RichEdit عادی یا نقاشی کردن یک تصویر در پس زمینه آن به صورت Tile وجود ندارد.
اما در ویندوز ۲۰۰۰ یک راه عقبی وجود دارد که با کمک آن می شود این کار رو انجام داد. در این ویندوز شما می توانید کنترل خود را با استفاده از مقدار دهی ثابت WS_EX_LAYERED به استیل(Style)های توسعه یافته ویندوز و سپس فراخوانی تابع APIی به نام SetLayeredWindowAttributes به صورت Transparent در بیاورید.
مثال پایین یک کنترل TRichView با پراپرتی DrawStyle است. بسته به مقدار آن، کنترل پس زمینه Transparent خواهد داشت یا خودش را با alpha transparency نقاشی می کند.
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;
موفق و موید و منصور باشید
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن