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

C++Builder中不规则窗体的快速显示,第1张

C++Builder中不规则窗体的快速显示,第2张

不规则窗体的应用增加了软件的吸引力
传统的WINDOWS应用软件界面总是给人千篇一律的方形的印象。看久了难免会觉得无聊,总希望能看到一些不一样的通用软件界面。如今,相当多的商业软件在提供优秀而强大的功能的同时,软件的界面也越来越漂亮。比如超级解霸2000中的界面插件,用过的人一定对它华丽的外观充满好感。作为一个编程爱好者,如果你自己的软件也有类似的界面,可能会吸引更多的关注。所以,让我们现在就开始制作自己漂亮的界面吧。
技术内幕
要想在自己的程序中添加不规则窗体的应用,首先要熟悉几个WINDOWS API函数的使用,它们是:椭圆(或圆形)区域创建函数CreateEllipticRgn、多边形区域创建函数CreatePolygonRgn、矩形区域创建函数CreateRectRgn和圆角矩形区域创建函数。您可以使用这些函数创建不同类型的窗体区域,或者使用WINDOWS API函数CombineRgn将几个简单区域组合成一个复杂区域。

下一步是在屏幕上显示创建的区域,这也是使用WINDOWS API函数实现的。这一次,使用SetWindowRgn函数。

在Borland C++ Builder头文件中已经定义了WINDOWS API函数,在应用程序中使用这些API函数就像在C++中使用常见的库函数一样。

准备
为你的程序准备一张背景图片。推荐的方法是:在PhotoShop中打开图片后,使用磁性套索工具选择需要的图像轮廓——复制——新建文件(背景为白色)——粘贴——另存为文件(PSD文件)——将保存的PSD文件转换成BMP文件face.bmp,以便以后与ACDSee等图像查看软件配合使用。如下图:


参考程序中的图片
打开Borland C++ Builder,在窗体上放置一个图像控件Image1,其图片临时为空;在表单上放置一个弹出菜单,编辑菜单项并添加一个“关闭”项(添加程序代码以便在弹出菜单被激活时关闭应用程序)。在程序中执行以下处理:

void _ _ fast call t form 1::form create(to object * Sender)

{

Image1->图片->LoadFromFile("。\ \ face . BMP ");

Width = Image1-> Width;

Height = Image1-> Height;

repaint();

}

此时,窗口的大小可以随着所用图片的大小而变化,但仍然是传统的WINDOWS界面。如果想把它显示成一个带有图片轮廓的窗口,就需要使用前面介绍的WINDOWS API函数,把不需要显示的部分裁剪掉。

键控方法1
这是一个非常简单的方法。通过逐行扫描图片,图片的白色像素被切掉。采用的方法是:在像素附近生成一个包含若干像素的矩形,通过异或将原图截掉。该过程如下:

HRGN tepRgn

for(y = 0;yHeighty++)

for(x = 0;xWidthx++)

if(Image1->画布->像素[x][y]==clWhite)

{

< tepRgn=CreateRectRgn(x,y,x+1,y+1);

CombineRgn(WndRgn,WndRgn,tepRgn,RGN _ XOR);

delete object(TEP rgn);

}

这种方法的优点是处理比较简单,缺点是处理速度太慢,尤其是处理大图的时候,往往需要4~5秒才能显示出表格。于是就产生了用另一种方式快速画出画面轮廓的想法。

键控方法2
这次我们使用另一个WINDOWS API函数,CreatePolygonRgn(多边形区域)。使用该功能时,我们需要准备好坐标点数组和图片轮廓的坐标点数。我们还逐行扫描图片,寻找白色像素和非白色像素的边界点,并将该点的坐标存储在数组中。然后,我们可以使用CreatePolygonRgn函数一次,把图片外围不用的部分挖出来,这样就省了不少钱。该过程如下:

寄存器int x,y;

int l,r;

点* a;

bool lb,Rb;

HRGN WndRgn,TempRgn,;

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++Builder中不规则窗体的快速显示

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情