用SetWindowRgn,关于动画,不不太懂,但这跟不规则窗体无关。
解决方案 »
- 网页调用OCX空间中的接口函数异常
- 出了问题,VC不能安装,请前辈们解决下
- VS2005建类库的问题.以及加载OCX的问题.
- 关于ExitInstance函数的问题
- 这个语句为什么不能实现ListCtrl的插入功能?
- 在重庆的2004年的应届毕业生做程序员的工资拿的到多少,我正式期是1500,你们呢
- 请问如果能用modem录音。
- 请教
- 小弟要做网络数据实时传输,想要边压缩边发送,哪位做过数据压缩的大侠帮帮忙,提点提点!有什么库什么的可以用的?LZW效率太低,想用zip
- 不知道有哪位高手愿意成为我的老师?每个月给500分,并且赠送一个6位的QQ~~~
- 哪里有Win32平台下可以跑的lex,yacc程序(或和其类似的东西)?
- 救命,如何用vc写一个IP包截取,分析和修改程序
但是现在的是完全不规则的如果图中间有一个洞能能!
当然动画是在这个不规则窗体之中的。有兴趣吗?JINXI_GAO@263。NET
//函数名称:SetRegion()
//描述:用来裁减窗口
//-------------------------------------------------------------------------------------
void SetupRegion(CDC *pDC, CBitmap *pBit, unsigned short BackID, unsigned short MaskID)
{
CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;
COLORREF col;
CRect cRect;
int x, y;
CRgn wndRgn, rgnTemp; //wndRgn为要创建的CRgn, rgnTemp为临时的CRgn
//得到背景图片
pBit->Detach();
pBit->LoadBitmap(BackID);
//得到Mask图片
BITMAP bm;
cBitmap.LoadBitmap(MaskID);
//得到Mask图片的尺寸等信息
cBitmap.GetBitmap(&bm);
//将窗口设为与Mask尺寸一样
SetWindowPos(&wndTop , 0, 0, bm.bmWidth, bm.bmHeight, SWP_NOMOVE);
//创建一个与当前DC兼容的内存DC
memDC.CreateCompatibleDC(pDC);
//记录内存DC中将被覆盖的句柄,以便恢复
pOldMemBmp = memDC.SelectObject(&cBitmap);
//创建一个与窗口一样大小的矩形CRgn
wndRgn.CreateRectRgn(0, 0, bm.bmWidth, bm.bmHeight);
//下面就是对wndRgn按Maks图片中的信息(黑色为透明区域,白色为保留区域)进行裁减
for(x=0; x<= bm.bmWidth; x++)
{
for(y=0; y<= bm.bmHeight; y++)
{
col = memDC.GetPixel(x, y); //得到当前坐标点的颜色
if(col == 0) //如果为黑色则将其减去
{
rgnTemp.CreateRectRgn(x, y, x+1, y+1); //以点来创建矩形CRgn
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR); //将wndRgn中相同的地方移去
rgnTemp.DeleteObject(); //将rgbTemp中的内容清空
}
}
}
if (pOldMemBmp) memDC.SelectObject(pOldMemBmp); //恢复原来内存DC中的内容
SetWindowRgn((HRGN)wndRgn, TRUE); //不用多说了,裁之!!!!!
}
[email protected]
vc++5提供了crgn类和setwindowrgn()函数来实现不规则的程序窗口。创建一个不规则窗口的过程是:首先定义一个crgn类,并用各种初始化函数创建crgn类的具体区域,然后调用cwnd::setwindowrgn()函数创建不规则窗口。
crgn是从cgdiobject衍生出来的类,用来确定一个多边形、椭圆或者由多边形及椭圆合成的范围,在程序中主要会用到createrectrgnindirect()、createellipticrgnindirect()、createpolygonrgn()三个函数。
createrectrgnindirect(lpcrect
lprect)函数创建一个矩形区域,参数lprect指定所创建的矩形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标。例如:
crgn myrgn;
rect m_rect;
m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;
myrgn.createrectrgnindirect( &m_rect );
createellipticrgnindirect(lpcrect
lprect)函数创建一个椭圆形区域,参数lprect指定所创建的椭圆形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标,如果指定right坐标与left坐标之差等于bottom坐标与top坐标之差,则创建的区域是一个圆。例如:
crgn myrgn;
rect m_rect;
m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;
myrgn.createellitpticrgnindirect( &m_rect );
createpolygonrgn(lppoint lppoints, int ncount, int
nmode)函数创建一个多边形区域,参数lppoints指向一个point结构数组,在point结构数组中每个point结构项,用来确定多边形顶点在窗口用户区中的坐标;ncount说明point结构数组中point结构项的数目,也就是多边形的顶点数;nmode指定多边形的填充方式,一般使用alternate方式。例如创建一个三角形:
crgn myrgn;
point points[3];
points[0].x=points[0].y=0; points[1].x=10; points[1].y=30; points[2].x=5; points[2].y=60;
myrgn.createpolygonrgn(points, 3, alternate);
利用以上的函数创建区域后,就可以调用cwnd::setwindowrgn(hrgn hrgn, bool
bredraw)来创建非矩形的窗口了。setwindowrgn()函数参数说明:hrgn是一个crgn类的句柄;bredraw如果被设置成true,那么,在窗口次序发生变化时,系统会发送wm_windowposchanging和wm_windowposchanged消息给窗口。
如果要创建外形更复杂的窗口,例如mp3播放器soniq的一个播放界面,就是两个圆形部分重合形成的。对于这类窗口的创建,还要用到crgn类另外一个极其重要的函数——combinergn()。首先要说明的是:在vc++5的在线帮助中,将这个函数归入了初始化(initialization)类型中,实际上,如果定义的crgn类在没有使用其它初始化函数初始化之前,就调用这个函数的话,程序将会失败,所以,这个函数似乎应该归入operation类更恰当。
combinergn(crgn* prgn1, crgn* prgn2, int
ncombinemode)函数用来创建一个由多个多边形、椭圆合成的不规则区域。prgn1、prgn2分别指向参与合成不规则区域的多边形或椭圆形;ncombinemode说明合成的方式:rgn_and最后的区域是prgn1和prgn2的重叠部分;rgn_diff最后的区域是prgn1中不包含prgn2的部分;rgn_or最后的区域同时包含prgn1和prgn2;rgn_xor最后的区域同时包含prgn1和prgn2,但不包含prng1和prng2重叠的部分。例如,创建一个类似soniq播放器的界面:
......
rect m_cyc1;
rect m_cyc2;
crgn rgncyc1;
crgn rgncyc2;
crgn rgndlg;
m_cyc1.left=100; m_cyc1.top=5; m_cyc1.right=200; m_cyc1.bottom=105;
m_cyc2.left=80; m_cyc2.top=85; m_cyc2.right=180; m_cyc2.bottom=185;
rgndlg.createellipticrgnindirect( &m_cyc1 );
rgncyc1.createellipticrgnindirect( &m_cyc1 );
rgncyc2.createellipticrgnindirect( &m_cyc2 );
rgndlg.combinergn( &rgncyc1, &rgncyc2, rgn_or );
mywin.setwindowrgn( (hrgn)rgndlg, ture );
......
以上就是利用vc++5实现不规则窗口的方法,相信大家看后都能创造出各种希奇古怪的窗口来,但是,有一点应该提请注意:对于windows操作系统而言,桌面上窗口的形状存储在内存中,所以,窗口外形的复杂程度应该适可而止,不要超过32767╳32767个逻辑单元,或者64k存储区
。当然,还有一点很重要:就是给窗口一张漂亮的脸,最好具有三维立体效果。 原文来自本站。
AnimateWindow( hwnd,200,AW_BLEND);
搞定!!!!!!!!!!!!!
下载optirgn.zip, 有全部源代码。
一个用bitmap生成HRGN的实用类。
支持多种来源:文件(BMP,RGNDATA),BITMAP资源, RCDATA资源,
可以设定透明色的颜色范围,无64k内存限制,
可以把RGNDATA存储在文件中并读取。
生成动画嘛:只要用一个Timer把多幅图片依次CreateRegion(), SetWindowRgn()就可以了。:)另to 111222:
AnimateWindow只支持几种特定的动画方式吧,我记得。