快捷搜索:

C++ 中不规则窗体的快速显示

传统的WINDOWS利用软件界面给人的感到老是一模一样的方梗直正的窗体,看的光阴长了难免会有些厌烦,老是盼望能见到些不合一样平常的软件界面。如今,相称数量的商业软件在供给优秀而强大年夜的功能的同时,软件的界面也是做得越来越漂亮,比如《超级解霸2000》中的界面插件,应用过的人必然对其富丽的外不雅布满好感。作为一个编程喜欢者,要是自己写出的软件也拥有类似的界面,大概会吸引更多眼光的凝视。那么,我们现在就开始着手制作自己的漂亮界面吧。

技巧黑幕

要想在自己的法度榜样中加入不规则窗体的利用,你首先要认识几个WINDOWS API函数的应用,它们是:卵形(或圆形)区域创建函数CreateEllticRgn 、多边形区域创建函数CreatePolygonRgn、 矩形区域创建函数CreateRectRgn、 带圆角的矩形区域创建函数CreateRoundRectRgn。你可以用这些函数创建不合类型的窗体区域,也可以用WINDOWS API函数CombineRgn将几个简单区域组合成一个繁杂区域。

下一步要做的便是将已经创建好的区域显示在屏幕上,同样也是应用WINDOWS API 函数来实现,此次用到的是SetWindowRgn函数。

WINDOWS API 函数在Borland C++ Builder 头文件中均已定义,在利用法度榜样中应用这些API函数就象应用C++的通俗库函数一样。

预备事情:为你的法度榜样预备一幅背景图片,保举措施是: 在中打开图片后应用磁性套索对象拔取你所必要的图象轮廓——复制——新建文件(背景应用白色)——粘贴——另存文件(PSD文件)——用ACDSee等看图软件将保存的PSD文件转换为BMP文件face.bmp备用。

法度榜样中引用图片

打开Borland C++ Builder,在窗体上放置一个Image控件Image1,其Picture暂为空;在窗体上放置一个Popup菜单,编辑菜单项增添“Close”项(添加法度榜样代码使得激活弹出菜单时即可关闭利用法度榜样)。法度榜样中做如下处置惩罚:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Image1->Picture->LoadFromFile(".\\face.bmp");

Width=Image1->Width;

Height=Image1->Height;

Repaint();

}

此时,窗体的大年夜小已能跟随所用图片的大年夜小而改变,但仍旧是传统的WINDOWS界面,要想显示成具有图片轮廓的窗体形状,就必要应用前文先容的WINDOWS API函数将不必要显示的部分抠去。

抠像措施一

这是一种异常简单的措施,采纳对图片逐行扫描的要领,将图片像素点为白色的部分抠去,应用的措施是:在像素点四周孕育发生一个包孕几个像素点的矩形,与原图片采纳异或要领抠去,法度榜样如下:

HRGN tegn;

for(y=0;yHeight;y++)

for(x=0;xWidth;x++)

if(Image1->Canvas->Pixels[x][y]==clWhite)

{

Height*2-1;

WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);

for(y=0;yHeight;y++)

{

lb=true;

for(x=0;xWidth;x++)

if(Image1->Canvas->Pixels[x][y]!=clWhite)

{

a[l].x=x;

a[l].y=y;

lb=false;

break;

}

if(lb) a[l]=a[l-1];

l++;

rb=true;

for(x=Image1->Width-1;x>=0;x--)

if(Image1->Canvas->Pixels[x][y]!=clWhite)

{

a[r].x=x;

a[r].y=y;

rb=false;

break;

}

if(rb) a[r]=a[r+1];

r--;

}

TempRgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE);

CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);

DeleteObject(TempRgn);

Picture->LoadFromFile(".\\face.bmp");

Width=Image1->Width;

Height=Image1->Height;

Repaint();

l=0;r=Image1->Height*2-1;

WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);

Height;y++)

{

lb=true;

for(x=0;xWidth;x++)

if(Image1->Canvas->Pixels[x][y]!=clWhite)

{

a[l].x=x+1;

a[l].y=y;

lb=false;

break;

}

if(lb) a[l]=a[l-1];

l++;

rb=true;

for(x=Image1->Width-1;x>=0;x--)

if(Image1->Canvas->Pixels[x][y]!=clWhite)

{

a[r].x=x;

a[r].y=y;

rb=false;

break;

}

if(rb) a[r]=a[r+1];

r--;

}

//利用措施一抠去图片内凹部分

r=Image1->Height*2-1;

for(y=0;yHeight;y++){

for(x=a[y].x;x

if(Image1->Canvas->Pixels[x][y]==clWhite)

{

Height*2,ALTERNATE);

CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);

DeleteObject(TempRgn);

free(a);

//显示不规则窗体

SetWindowRgn(Handle,WndRgn,true);

SetWindowPos(Handle,HWND_TOP,0,0,0,0,SWP_NOMOVE SWP_NOSIZE);

}

至此,一个漂亮的法度榜样界面就呈现在你的屏幕上了。

您可能还会对下面的文章感兴趣: