zoukankan      html  css  js  c++  java
  • DELPHI 异形窗体

    一定有很多人看到过一些奇形怪状的窗体,例如一些屏幕精灵。其实实现起来非常容易,做到三点就好啦。下面我使用Delphi做了一个VCL控件(TBmpShape),你只需要指定一幅图片就可以将窗体变成你的图片的形状。

    1。准备一幅位图图片,一定要BMP格式的

    2。将VCL控件放在你的窗体(FORM)上,注意不能是其他的容器,设置PICTURE属性,指定制作好的图片。

    3。设置图片的背景颜色,必须是你的图片的背景颜色准确值

    4。在本窗体的FormCreate事件中写一行代码

    BmpShape1.Apply;

    做到上面四点就可以了,编译运行你的窗体,是不是不一样啊。

    下面是具体的代码,不是太长吧。

    unit BmpShape;
    {
    2002/08/22 by ultrared
    根据BMP文件创建窗口
    注意:
    1. BMP文件最左上的一个点颜色作为背景色
    2. BmpShape控件只能用在TForm容器上
    3. BMP文件可以是256色或者24位色
    4。大块背景色必须和背景色绝对相等才能获得正常效果
    }
    interface

    uses
    Forms,Windows, Messages, SysUtils, Classes, Controls, ExtCtrls,Graphics;

    type
    TBmpShape = class(TImage)
    private
    { Private declarations }
    BackColor:TColor;//背景颜色
    FColorDither:boolean;//是否允许背景颜色有一定的抖动
    function GetRegion:HRGN;//前景图片的区域
    procedure setColorDither(cd:Boolean);
    protected
    { Protected declarations }
    public
    { Public declarations }
    constructor Create(AOwner:TComponent);override;
    procedure Apply;//使用效果
    published
    { Published declarations }
    property Dither:Boolean read FColorDither write setColorDither;
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('Samples', );
    end;

    procedure TBmpShape.setColorDither(cd:Boolean);
    begin
    if cd<>FColorDither then
    FColorDither:=cd;
    end;

    constructor TBmpShape.Create(AOwner:TComponent);
    begin
    inherited Create(AOwner);
    BackColor:=RGB(0,0,0);
    FColorDither:=FALSE;
    end;

    //核心子程序,获得BMP图片的前景区域
    function TBmpShape.GetRegion:HRGN;
    var
    i,j:integer;
    rgn1,rgn2:HRGN;
    StartY:integer;
    r,g,b,r1,g1,b1:BYTE;
    cc:TColor;
    begin
    if Picture.Bitmap<>nil then
    begin
    BackColor:=Picture.Bitmap.Canvas.Pixels[0,0];
    rgn1:=CreateRectRgn(0,0,0,0);
    for i:=0 to Picture.Bitmap.Width-1 do
    begin
    StartY:=-1;
    for j:=0 to Picture.Bitmap.Height-1 do
    begin
    cc:=Picture.Bitmap.Canvas.Pixels[i,j];
    if FColorDither then
    begin
    //允许和背景有一定的色差
    r:=(cc and $FF0000) shr 16;
    g:=(cc and $FF00) shr 8;
    b:=cc and $FF;
    r1:=(BackColor and $FF0000) shr 16;
    g1:=(BackColor and $FF00) shr 8;
    b1:=BackColor and $FF;
    if (abs(r-r1)<10) and (abs(g-g1)<10) and (abs(b-b1)<10) then
    begin
    if (StartY>=0) and (j>=StartY) then
    begin
    rgn2:=CreateRectRgn(i,StartY,i+1,j);
    CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
    StartY:=-1;
    end;
    end
    else
    begin
    if Starty<0 then
    StartY:=j
    else if j=(Picture.Bitmap.Height-1) then //最下面一个点
    begin
    rgn2:=CreateRectRgn(i,StartY,i+1,j);
    CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
    end;
    end;
    end
    else //不允许色差
    begin
    if cc=BackColor then
    begin
    if (StartY>=0) and (j>=StartY) then
    begin
    rgn2:=CreateRectRgn(i,StartY,i+1,j);
    CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
    StartY:=-1;
    end;
    end
    else
    begin
    if Starty<0 then
    StartY:=j
    else if j=(Picture.Bitmap.Height-1) then //最下面一个点
    begin
    rgn2:=CreateRectRgn(i,StartY,i+1,j);
    CombineRgn(rgn1,rgn1,rgn2,RGN_OR);
    end;
    end;
    end;
    end;
    end;
    result:=rgn1;
    end
    else
    result:=0;
    end;

    procedure TBmpShape.Apply;
    begin
    if Parent is TForm then
    begin
    Left:=0;
    Top:=0;
    Width:=Picture.Bitmap.Width;
    Height:=Picture.Bitmap.Height;
    with (Parent as Tform) do
    begin
    BorderStyle:=bsNone;
    Width:=Self.Width;
    Height:=Self.Height;
    end;
    SetWindowRgn(Parent.Handle,GetRegion,FALSE);
    end;
    end;

    end.

  • 相关阅读:
    0:一种过滤机制的MobileMenuList
    MobileMenuImage
    (转)How To Kill runaway processes After Terminating Concurrent Request
    fnd_profile.value('AFLOG_ENABLED')的取值 和配置文件相关SQL
    供应商 银行 SQL (转自ITPUB)
    重启并发管理器
    定义并发请求时 业务实体值集显示没有值数据
    Oracle EBS环境下查找数据源(OAF篇)
    查看在线EBS用户的相关信息
    转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
  • 原文地址:https://www.cnblogs.com/blogpro/p/11446653.html
Copyright © 2011-2022 走看看