Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341850
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:03:54

没有句柄的控件实际上是直接画在 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) |
给主人留下些什么吧!~~