2024年5月10日发(作者:)
WINCE6.0下的圆角区域
winCE6.0下没有CreateRoundRectRgn这个函数,这给圆角按纽的开发带来了一定的
难度。上网搜索一番后发现,大家的处理方法都是用图片或是RoundRect来做的。但不管
怎么弄它的窗口还是矩形的,你没有办法用SetWindowRgn。经过我的研究后发现,WINCE
下CreateFromData可用。它只有一个比较重要参数是RGNDATA。
typedef struct _RGNDATAHEADER {
DWORD dwSize;
DWORD iType;
DWORD nCount;
DWORD nRgnSize;
RECT rcBound;
} RGNDATAHEADER, *PRGNDATAHEADER;
typedef struct _RGNDATA {
RGNDATAHEADER rdh;
char Buffer[1];
} RGNDATA, *PRGNDATA, NEAR *NPRGNDATA, FAR *LPRGNDATA;
通过这个函数我们就可以生成我们想要的RGN,从而开发各种形式的按纽。
dwSize=sizeof(RGNDATA);//一般都是32. iType=1;恒等于1.
nCount=X;x是一共有多少个矩形来组成这个区域。nRgnSize是指X个矩形存储所
需要的BYTE个数。rcBound是指能容下这个区域的最小矩形。一个例子用法:创建一个
圆角为5,5的矩形。
BYTE RgbBuf[112]={0};
RGNDATA * rgndata=(RGNDATA *)RgbBuf;
rgndata->=sizeof(RGNDATA);
rgndata-> =1;
rgndata->ze=80;
rgndata->=5;
rgndata->= ;
rgndata-> =-1;
rgndata->=;
rgndata->=-1;
LPRECT lprect=(LPRECT)&rgndata->Buffer;
lprect[0].top=;
lprect[0].left =+2;
lprect[0].bottom=+1;
lprect[0].right =-3;
lprect[1].top=+1;
lprect[1].left =+1;
lprect[1].bottom=+2;
lprect[1].right =-2;
lprect[2].top=+2;
lprect[2].left =;
lprect[2].bottom=-3;
lprect[2].right =-1;
lprect[3].top=-3;
lprect[3].left =+1;
lprect[3].bottom=-2;
lprect[3].right =-2;
lprect[4].top=-2;
lprect[4].left =+2;
lprect[4].bottom=-1;
lprect[4].right =-3;
FromData(NULL,112,rgndata);
这就是圆角为(5,5)的圆解的5个矩形。不同的圆角将会有不同个数的矩形,那么算法,
相信数学好一点的朋友一定会很容易做出来,不好的朋友通过简单的加加减减也会做出来。
我因为项目太急,我没有做算法,但给大家一点提示,以矩形的四个角以5为边长的四个
正方形做四个内切圆,凡是在圆内的保留,圆外的去除。一定要注意四舍五入。
As_mhy@163com
发布评论