怎样根据一幅图片的图像内容生成不规则窗体?(135分)

  • 主题发起人 主题发起人 test01
  • 开始时间 开始时间
2000年看到一篇文章做的演示代码,可以根据位图做出漂亮的不规则FORM,大家可以下载演示程序研究一下,包含DELPHI版和VC版。

//
// -'`"_ -'`" /
// / / / "
// / ///__ / ___ / 西安科技学院143信箱 710054
// | | / -"`.-( / |
// | | | | /" | | 万 重
// | / / "-" / / |
// /___/ / (o o) / (__/ 电邮: mantousoft@sina.com
// __| _ _ |__
// ( ( ) ) 网址: http://www.delphibox.com
// /_/.-.___.-./_/
// __ | | __ QQ : 6036742
// | /.| |./ |
// | '#. .#' |
// |__/ '"" /__| 2001.3.1
// -/ /-
//

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.
 
谢谢您的答复,我试过了,不知道是不是因为图片的关系。效果不太好。
想听听其他朋友的意见。
 
参考一下:
用汉字做窗体形状
procedure TForm1.FormCreate(Sender: TObject);
var
rgn:HRGN;
begin
BeginPath(Canvas.Handle);
SetBkMode( Canvas.Handle, TRANSPARENT );
Canvas.Font.Name:= '宋体';
Canvas.Font.Size:=100;
Canvas.TextOut( 20, 20, '漂亮吗?');//用"漂亮吗?"作为form的形状
EndPath(Canvas.Handle);
rgn:= PathToRegion(Canvas.Handle);
SetWindowRgn( Handle, rgn, true );
end;
 
旧资料中已经有相关资料了咯:)
 
如果想偷懒,就用控件, 1stClass。
 
to dingbaosheng:
我已经搜索了大富翁以前的贴子。但大都是生成不是矩形的规则窗体。与我的要求不符。
to GanQuan:
想学习学习是怎样达到的?我这儿也有一个例子。但是通过一个MASKFILE来实现的。请
给出您说的1stClass的下载地址。或请发给我。
My E-Mail: kingdeezj@sina.com
先行谢过。
 
Delphi6.0中设置FORM的透明颜色就可以了
 
用coolcontrol控件包可以作到,coolcontrol控件在
http://delphi.mychangshu.com/wsp/index.html下的delphi资源社区可以下载
 
最好设为透明窗体就好了
 
1stClass的下载地址:
http://www.woll2woll.com/downloadinfo.html
 
form上放置image1,加载不规则图像,再设置FORM的透明颜色就可以了:
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.AlphaBlend:=true;
form1.TransparentColor :=true;
form1.TransparentColorValue := form1.Color ;
end;
 
有很多现成的vcl
 
Delphi6.0中设置FORM为透明,透明颜色设为图片的透明色,borderstyle设为none,
图片需是bmp格式。
 
多人接受答案了。
 
后退
顶部