不規則窗體的應用增加軟體的吸引力 (轉)
傳統的應用介面給人的感覺總是千篇一律的方方正正的窗體,看的時間長
了難免會有些厭煩,總是希望能見到些不同一般的軟體介面。如今,相當數量的商業軟體在
提供優秀而強大的功能的同時,軟體的介面也是做得越來越漂亮,比如《超級解霸2000》中
的介面,使用過的人一定對其華麗的外觀充滿好感。作為一個愛好者,如果自己寫
出的軟體也擁有類似的介面,也許會吸引更多目光的注視。那麼,我們現在就開始動手製作
自己的漂亮介面吧。
技術內幕
要想在自己的中加入不規則窗體的應用,你首先要熟悉幾個WINDOWS 的使
用,它們是:橢圓形(或圓形)區域建立函式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,在窗體上放置一個ImageImage1,其Picture暫為空;
在窗體上放置一個Popup選單,編輯選單項增加“Close”項(新增程式程式碼使得啟用彈出菜
單時即可關閉應用程式)。程式中做如下處理:
void __fastcall TForm1::FormCreate(T *Sender)
{
< 。
< 。
< 。
Image1->Picture->LoadFromFile(".face.bmp");
Width=Image1->Width;
Height=Image1->Height;
Repaint();
< 。
< 。
< 。
}
此時,窗體的大小已能跟隨所用圖片的大小而改變,但仍舊是傳統的WINDOWS介面,要
想顯示成具有圖片輪廓的窗體外形,就需要使用前文介紹的WINDOWS API函式將不需要顯示
的部分摳去。
摳像方法一
這是一種非常簡單的方法,採用對圖片逐行掃描的方式,將圖片畫素點為白色的部分摳
去,使用的方法是:在畫素點附近產生一個包含幾個畫素點的矩形,與原圖片採用異或方式
摳去,程式如下:
HRGN tepRgn;
for(y=0;y
for(x=0;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
{
lb=true;
for(x=0;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);
< 用方法二產生輪廓座標點陣列
for(y=0;y
{
lb=true;
for(x=0;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;y
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用C#實現不規則窗體C#
- 也說說c++builder中的不規則窗體的實現 (轉)C++UI
- 用VC++實現不規則視窗 (轉)C++
- C#建立不規則窗體和控制元件C#控制元件
- WPF建立不規則窗體時WebBrowser控制元件不顯示的問題Web控制元件
- 幽默:軟體行業的潛規則行業
- 規範設計Windows應用軟體選單 (轉)Windows
- 讓你的軟體永生的7個規則
- 當軟體遭遇潛規則
- 《自由軟體,自由社會》:應用自由軟體判斷準則
- WPF中不規則窗體與WindowsFormsHost控制元件的相容問題完美解決方案WindowsORM控制元件
- 使用CRM軟體系統建立的分配規則
- 安全編碼為應用軟體增加免疫力
- 企業級應用軟體平臺-國產辦公軟體的出路 (轉)
- Apache重寫規則的常見應用(轉)Apache
- Linux下軟體應用的相關命令(轉)Linux
- 雲改變了軟體外包規則
- 在軟體開發中應用80:20原則
- Apache 重寫規則的常見應用 (rewrite)(轉)Apache
- 一個不錯的工具軟體--mindmanager(轉)
- 軟體專案管理的成功七法則(轉)專案管理
- ThottleStop 軟體的應用場景
- AsmL: 可執行的軟體規格 (轉)ASM
- winform之在主窗體中不顯示子窗體的選單欄ORM
- 軟體行業的發展要尊重軟體工程的價值規律 (轉)行業軟體工程
- SQL SERVER的記憶體會不斷增加,問題分析(轉)SQLServer記憶體
- ERP軟體應用的誤區與謬論(轉)
- 國內應用軟體開發管理的探討 (轉)
- Novell推出可替代微軟的桌面應用軟體包(轉)微軟
- 用Gtk+開發Linux上的GUI應用軟體(轉)LinuxGUI
- 謝文:反流氓軟體不應摻雜江湖恩怨(轉)
- 軟體架構風格——規則架構架構
- 軟體測試的原則
- 從VB 6到VB.NET——窗體特殊應用 (轉)
- 單一職責原則:軟體世界中最重要的規則 - DZone
- 專案管理軟體應用淺析 (轉)專案管理
- 軟體專案需求分析的20條法則(轉)
- 從番茄花園事件看商業軟體的“潛規則”事件