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