飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2311|回复: 4

根据位图做出漂亮的不规则FORM

[复制链接]

该用户从未签到

发表于 2006-9-12 16:30:49 | 显示全部楼层 |阅读模式
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls, Buttons;

type
 TForm1 = class(TForm)
 Image1: TImage;
 Button1: TButton;
 procedure FormCreate(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
 private
  function CreateRegion(wMask: TBitmap; wColor: TColor;hControl: THandle): HRGN;
  { Private declarations }
 public
  { Public declarations }
end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
 dc, dc_c: HDC;
 rgn: HRGN;
 x, y: integer;
 coord: TPoint;
 line: boolean;
 color: TColor;
begin
 dc := GetWindowDC(hControl);
 dc_c := CreateCompatibleDC(dc);
 SelectObject(dc_c, wMask.Handle);
 BeginPath(dc);
 for x:=0 to wMask.Width-1 do
 begin
  line := false;
  for y:=0 to wMask.Height-1 do
  begin
   color := GetPixel(dc_c, x, y);
   if not (color = wColor) then
   begin
    if not line then
    begin
     line := true;
     coord.x := x;
     coord.y := y;
    end;
   end;
   if (color = wColor) or (y=wMask.Height-1) then
   begin
    if line then
    begin
     line := false;
     MoveToEx(dc, coord.x, coord.y, nil);
     LineTo(dc, coord.x, y);
     LineTo(dc, coord.x + 1, y);
     LineTo(dc, coord.x + 1, coord.y);
     CloseFigure(dc);
    end;
   end;
  end;
 end;
 EndPath(dc);
 rgn := PathToRegion(dc);
 ReleaseDC(hControl, dc);
 Result := rgn;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 w1:TBitmap;
 w2:TColor;
 rgn: HRGN;
begin
 w1:=TBitmap.Create;
 w1.Assign(image1.Picture.Bitmap);
 w2:=w1.Canvas.Pixels[0,0];
 rgn := CreateRegion(w1,w2,Handle);
 if rgn<>0 then
 begin
  SetWindowRgn(Handle, rgn, true);
 end;
 w1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
 ReleaseCapture;
 SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
end;

end.
PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-4-27 20:08
  • 签到天数: 432 天

    [LV.9]以坛为家II

    发表于 2006-9-13 09:46:40 | 显示全部楼层
    Delphi源码一定要支持!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-12-11 20:17
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2006-9-13 09:49:08 | 显示全部楼层
    支持+学习~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-13 11:08:49 | 显示全部楼层
    给个图噻:P
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-13 12:18:47 | 显示全部楼层
    居然可以这样描出图形的边框,厉害。。。。。。。。。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表