大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 不规则窗体的应用增加软件的吸引力

不规则窗体的应用增加软件的吸引力

时间: 2021-07-31 作者:daque

保守的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); } 至此,一个美丽的步调界面就出此刻你的屏幕上了。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.