没有句柄的控件实际上是直接画在 Form 上的,没画的部分就是透明的。
如果有句柄的控件,实际上是一个单独的窗口,有单独的 DC ,这些控件是无条件画成占有区域的方块的
如果想改变有句柄的控件的形状,可以参考本站 IDE 控件 1.05 版本的 YbBackImage, 可以利用这个 Image 的形状改变控件的形状
YbBackImage1->ApplyShapeTo(Panel1); 或者 YbBackImage1->ApplyShapeTo(Form1); 等。
各操作系统对 Form 改变形状支持都很好,如果对于按钮等控件,98 以前版本可能会有问题。
如果要改变控件的透明度,可以用 SetLayeredWindowAttributes 函数,但是这个函数是控件内部整体呈现半透明,包括控件内部的任何内容,例如给一个 Panel 设为半透明,Panel 里面的东西都变为半透明了。
如果是想让有句柄的控件完全透明,并且里面的控件还可见,只有复制背景,因为有句柄的控件的矩形区域是无条件的。
--------------------next---------------------
这段代码,注意看我在后面加标记的地方:
procedure TFlatPanel.Paint;
var
memoryBitmap: TBitmap;
textBounds: TRect;
Format: UINT;
begin
textBounds := ClientRect;
Format := DT_SINGLELINE or DT_VCENTER;
case Alignment of
taLeftJustify:
Format := Format or DT_LEFT;
taCenter:
Format := Format or DT_CENTER;
taRightJustify:
Format := Format or DT_RIGHT;
end;
memoryBitmap := TBitmap.Create; // create memory-bitmap to draw flicker-free
try
memoryBitmap.Height := ClientRect.Bottom;
memoryBitmap.Width := ClientRect.Right;
// Draw Background
if FTransparent then //如果采用透明的属性
DrawParentImage(Self, memoryBitmap.Canvas) //复制 Parent 的背景
else
begin
memoryBitmap.Canvas.Brush.Color := Self.Color;
memoryBitmap.Canvas.FillRect(ClientRect); //如果不透明,填充矩形
end;
// Draw Border
Frame3DBorder(memoryBitmap.Canvas, ClientRect, FColorHighlight, FColorShadow, 1);
// Draw Text
memoryBitmap.Canvas.Font := Self.Font;
memoryBitmap.Canvas.Brush.Style := bsClear;
if not Enabled then
begin
OffsetRect(textBounds, 1, 1);
memoryBitmap.Canvas.Font.Color := clBtnHighlight;
DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), textBounds, Format);
OffsetRect(textBounds, -1, -1);
memoryBitmap.Canvas.Font.Color := clBtnShadow;
DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), textBounds, Format);
end
else
DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), textBounds, Format);
// Copy memoryBitmap to screen
canvas.CopyRect(ClientRect, memoryBitmap.canvas, ClientRect);
finally
memoryBitmap.free; // delete the bitmap
end;
end;
--------------------next---------------------
阅读(1222) | 评论(0) | 转发(0) |