六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

不規則窗體的應用增加軟件的吸引力

[摘要]傳統的WINDOWS應用軟件界面給人的感覺總是千篇一律的方方正正的窗體,看的時間長 了難免會有些厭煩,總是希望能見到些不同一般的軟件界面。如今,相當數量的商業軟件在 提供優秀而強大的功能的同時,軟件的界面也是做得越來越漂亮,比如《超級解霸2000》中 的界面插件,使用過的人一定對其華麗的外觀充滿好...
傳統的WINDOWS應用軟件界面給人的感覺總是千篇一律的方方正正的窗體,看的時間長
了難免會有些厭煩,總是希望能見到些不同一般的軟件界面。如今,相當數量的商業軟件在
提供優秀而強大的功能的同時,軟件的界面也是做得越來越漂亮,比如《超級解霸2000》中
的界面插件,使用過的人一定對其華麗的外觀充滿好感。作為一個編程愛好者,如果自己寫
出的軟件也擁有類似的界面,也許會吸引更多目光的注視。那么,我們現在就開始動手制作
自己的漂亮界面吧。
技術內幕
  要想在自己的程序中加入不規則窗體的應用,你首先要熟悉幾個WINDOWS API函數的使
用,它們是:橢圓形(或圓形)區域創建函數CreateEllipticRgn 、多邊形區域創建函數
CreatePolygonRgn、 矩形區域創建函數CreateRectRgn、 帶圓角的矩形區域創建函數
CreateRoundRectRgn。你可以用這些函數創建不同類型的窗體區域,也可以用WINDOWS API
函數CombineRgn將幾個簡單區域組合成一個復雜區域。

  下一步要做的就是將已經創建好的區域顯示在屏幕上,同樣也是使用WINDOWS API 函數
來實現,這次用到的是SetWindowRgn函數。

  WINDOWS API 函數在Borland C++ Builder 頭文件中均已定義,在應用程序中使用這些
API函數就象使用C++的普通庫函數一樣。

準備工作
  為你的程序準備一幅背景圖片,推薦方法是: 在PhotoShop中打開圖片后使用磁性套索
工具選取你所需要的圖象輪廓--復制--新建文件(背景使用白色)--粘貼--另存文
件(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 tepRgn;

for(y=0;y<Image1->Height;y++)

for(x=0;x<Image1->Width;x++)

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

{

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

CombineRgn(WndRgn,WndRgn,tepRgn,RGN_XOR);

DeleteObject(tepRgn);

}

  這種方法的優點是處理比較簡單,缺點是處理速度太慢,尤其是在處理大幅圖片時,往
往要4~5秒的時間才能將窗體顯示出來。因此產生了通過另外的途徑快速勾勒圖片輪廓的想
法。

摳像方法二
  這次我們采用另一個WINDOWS API函數CreatePolygonRgn(多邊形區域),使用這個函
數時需為它準備圖片輪廓的坐標點數組及坐標點個數,也是通過對圖片逐行掃描的方式,找
到白色像素點與非白色像素點的分界點,將該點的坐標存入數組中,然后用
CreatePolygonRgn函數一次就可以把圖片外圍的不用部分摳去,從而省去大量的處理時間。
程序如下:

register int x,y;

int l,r;

POINT *a;

bool lb,rb;

HRGN WndRgn,TempRgn,;

if((a=(POINT *)malloc(800*2*(sizeof(POINT))))==NULL)

{

ShowMessage("申請內存失敗!");

exit(0);

}

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

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

for(y=0;y<Image1->Height;y++)

{

lb=true;

for(x=0;x<Image1->Width;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);

< free(a);

  程序中對每一像素行都從左右兩個方向分別掃描,找到兩邊的分界點存入數組。

  不過這個方法也存在一些缺陷,那就是圖片的內凹部分輪廓并未表現出來。從下圖中可
以看出:


最終解決方案
  考慮到既不增加算法的復雜度,又可大幅度縮短不規則窗體的創建速度,因此采用綜合
以上兩種方案,達到我們應用的目的,程序中首先應用方法二對圖片雙向掃描,產生輪廓坐
標點數組,然后在圖片輪廓內應用方法一將內凹部分摳去,最后才用多邊形區域創建函數摳
去圖片外圍部分。程序如下:

void __fastcall TForm1::FormCreate(TObject *Sender)

{

register int x,y;

int l,r;

POINT *a;

bool lb,rb;

HRGN WndRgn,TempRgn,tepRgn;


Width=800;Height=600;

if((a=(POINT *)malloc(800*4*(sizeof(POINT))))==NULL)

{

ShowMessage("申請內存失敗!");

exit(0);

}

Image1->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);

< file://應用方法二產生輪廓坐標點數組

for(y=0;y<Image1->Height;y++)

{

lb=true;

for(x=0;x<Image1->Width;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--;

}

file://應用方法一摳去圖片內凹部分

r=Image1->Height*2-1;

for(y=0;y<Image1->Height;y++){

for(x=a[y].x;x<a[r].x;x++)

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

{

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

CombineRgn(WndRgn,WndRgn,tepRgn,RGN_XOR);

DeleteObject(tepRgn);

}

r--;

}

file://將圖片外圍部分摳去

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

CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);

DeleteObject(TempRgn);

free(a);

file://顯示不規則窗體

SetWindowRgn(Handle,WndRgn,true);

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

}

r--;

}

file://將圖片外圍部分摳去

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

CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);

DeleteObject(TempRgn);

free(a);

file://顯示不規則窗體

SetWindowRgn(Handle,WndRgn,true);

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

至此,一個漂亮的程序界面就出現在你的屏幕上了。


主站蜘蛛池模板: 日本大学生免费一级一片 | 欧美透逼视频 | 影音先锋亚洲综合小说在线 | 天天曰天天 | 日本剧情片大全免费的视频 | 日韩精品福利视频一区二区三区 | 日韩欧美高清在线 | 日韩孕交 | 性视频网址 | 日本乳色www| 日日摸夜夜摸狠狠摸日日碰夜夜做 | 天堂网视频在线 | 中文字幕亚洲自拍 | 日韩欧美色视频在线观看 | 日韩a免费| 色天使久久综合给合久久97色 | 天天夜夜操 | 速度与激情九 | 日本青青草 | 日韩在线1| 天天干天天草 | 亚洲午夜久久久久久91 | 午夜神器成在线人成在线人免费 | 亚洲第一视频 | 一级一级 a爱片免费视频 | 特色一级黄色片 | 青青草华人在线视频 | 日韩欧美 在线播放 | 日韩欧美国产三级 | 三级在线观看免播放网站 | 人人草网 | 青青青爽在线视频免费观看 | 亚洲福利视频一区 | 午夜视频在线观看视频 | 日本一本在线观看 | 日韩第一页在线 | 夜色99 | 亚洲精品国产福利 | 天干天干天啪啪夜爽爽色 | 亚洲成a人片777777久久 | 一级十八以 下岁女子毛片 一级人做人爰a全过程免费视频 |