evc win32 下如何实现圆角矩形窗口(ce5下)

hucailai 2010-09-24 04:44:55
想问下,支持吗?
...全文
341 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-10-22
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
hucailai 2010-09-25
  • 打赏
  • 举报
回复
自己顶起来。
hucailai 2010-09-25
  • 打赏
  • 举报
回复

楼上帖的代码好像是windows下的,基于MFC的

还是非常谢谢的。

我要的是evc win32方式
傻X 2010-09-25
  • 打赏
  • 举报
回复
3楼的东西,偶测试了下,楼主的目的达到了,就是有点丑。
他就是大胖胖 2010-09-25
  • 打赏
  • 举报
回复
vc 下设置圆角吗?要是的话------------------
在OnSize中加入以下代码
CRgn m_rgn;
CRect rc;
GetWindowRect(&rc); //获得窗口矩形
rc -= rc.TopLeft();
m_rgn.CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom,6,6); //根据窗口矩形创建一个圆角矩形
SetWindowRgn(m_rgn, TRUE); //根据圆角矩形指定的区域改变窗口的形状
ls2141 2010-09-25
  • 打赏
  • 举报
回复
估计这一周上班的人都很少!!
hucailai 2010-09-25
  • 打赏
  • 举报
回复
一天了,帖子尽然没动过。
Simao 2010-09-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 abcix 的回复:]
当然可以实现,用打点的方式,什么样子都能做出来。
建议楼主放弃吧,这种很耗资源,一些控件还不如直接贴图来实现,简单,而且效率也高。
[/Quote]
Up...
Abcix 2010-09-25
  • 打赏
  • 举报
回复
当然可以实现,用打点的方式,什么样子都能做出来。
建议楼主放弃吧,这种很耗资源,一些控件还不如直接贴图来实现,简单,而且效率也高。
他就是大胖胖 2010-09-25
  • 打赏
  • 举报
回复
只是实现圆角,要好看自己再弄别的啊!!!!
他就是大胖胖 2010-09-25
  • 打赏
  • 举报
回复
哦,看来分是赚不到啦!
muzizongheng 2010-09-25
  • 打赏
  • 举报
回复
自己要用FillRgn填充背景吧
傻X 2010-09-25
  • 打赏
  • 举报
回复
求问个问题,我再WIN32下,case WM_PAINT情况下触发CreateRoundRectRgn和SetWindowRgn后,竟然就是白色圆形框体,这怎么回事?
Eleven 2010-09-25
  • 打赏
  • 举报
回复
EVC不支持CreateRoundRectRgn函数,不过你可以自己写一个

#include <vector>

HRGN CreateRoundRectRgn (int left, int top, int right, int bottom, int ellipse_width, int ellipse_height )
{
HRGN hrgn = 0;
int asq, bsq, d, xd, yd;
RECT rect;
std::vector<RECT> rects;

if (ellipse_width == 0 || ellipse_height == 0)
return CreateRectRgn( left, top, right, bottom );

/* Make the dimensions sensible */
if (left > right ) { int tmp = left; left = right; right = tmp; }
if (top > bottom) { int tmp = top; top = bottom; bottom = tmp; }

ellipse_width = abs(ellipse_width);
ellipse_height = abs(ellipse_height);

/* Check parameters */
if (ellipse_width > right-left) ellipse_width = right-left;
if (ellipse_height > bottom-top) ellipse_height = bottom-top;

/* Ellipse algorithm, based on an article by K. Porter */
/* in DDJ Graphics Programming Column, 8/89 */
asq = ellipse_width * ellipse_width / 4; /* a^2 */
bsq = ellipse_height * ellipse_height / 4; /* b^2 */
if (asq == 0) asq = 1;
if (bsq == 0) bsq = 1;
d = bsq - asq * ellipse_height / 2 + asq / 4; /* b^2 - a^2b + a^2/4 */
xd = 0;
yd = asq * ellipse_height; /* 2a^2b */

rect.left = left + ellipse_width / 2;
rect.right = right - ellipse_width / 2;

rects.reserve (ellipse_height);

/* Loop to draw first half of quadrant */
while (xd < yd)
{
/* if nearest pixel is toward the center */
if (d > 0)
{
/* move toward center */
rect.top = top++;
rect.bottom = rect.top + 1;
rects.push_back (rect);

rect.top = --bottom;
rect.bottom = rect.top + 1;
rects.push_back (rect);

yd -= 2*asq;
d -= yd;
}
/* next horiz point */
rect.left --;
rect.right++;
xd += 2*bsq;
d += bsq + xd;
}

/* Loop to draw second half of quadrant */
d += (3 * (asq-bsq) / 2 - (xd+yd)) / 2;
while (yd >= 0)
{
/* next vertical point */
rect.top = top++;
rect.bottom = rect.top + 1;
rects.push_back (rect);

rect.top = --bottom;
rect.bottom = rect.top + 1;
rects.push_back (rect);

/* if nearest pixel is outside ellipse */
if (d < 0)
{
/* move away from center */
rect.left --;
rect.right++;
xd += 2*bsq;
d += xd;
}
yd -= 2*asq;
d += asq - yd;
}

/* Add the inside rectangle */
if (top <= bottom)
{
rect.top = top;
rect.bottom = bottom;
//rects.push_back (rect);
rects.insert (rects.begin(), rect);
}

static int count=0;

if (rects.empty())
return NULL;

RGNDATAHEADER* pRgnData;
UINT RgnDataSize;
UINT RgnRectCount;
LPRECT pRect;

RgnRectCount = rects.size();
RgnDataSize = sizeof(RGNDATAHEADER) + sizeof(RECT)*RgnRectCount;
pRgnData = (RGNDATAHEADER*)new BYTE[ RgnDataSize ];
if (pRgnData==NULL)
return NULL;

pRgnData->dwSize = sizeof(RGNDATAHEADER);
pRgnData->iType = RDH_RECTANGLES;
pRgnData->nCount = RgnRectCount;
pRgnData->rcBound.left = 0;
pRgnData->rcBound.top = 0;
pRgnData->rcBound.right = 0;
pRgnData->rcBound.bottom = 0;

pRect = (LPRECT) ( (LPBYTE) pRgnData + sizeof(RGNDATAHEADER) );

memcpy (pRect, &*rects.begin(), RgnRectCount*sizeof(RECT));

hrgn = ExtCreateRegion(NULL, RgnDataSize, (LPRGNDATA)pRgnData);

delete pRgnData;

return hrgn;
}

// 调用
RECT rc;
::GetWindowRect(m_hWnd, &rc);
HRGN hRgn = CreateRoundRectRgn(rc.left, rc.top, rc.right, rc.bottom, 10, 10);
::SetWindowRgn(m_hWnd, hRgn, FALSE);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧