您的位置:程序门 -> vc/mfc -> 界面



怎样设计才能让activex控件具有圆形的窗口外观?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


怎样设计才能让activex控件具有圆形的窗口外观?
发表于:2007-03-05 15:37:15 楼主
怎样设计才能让activex控件具有圆形的窗口外观?
发表于:2007-03-05 18:18:531楼 得分:0
ondraw   中
注释掉
//pdc-> fillrect(rcbounds,   cbrush::fromhandle((hbrush)getstockobject(white_brush)));
剩余这个画圆的
pdc-> ellipse(rcbounds);

其实园的外观,就是让别人看到是一个园的,其实有很多办法可以实现的。
发表于:2007-03-05 19:20:212楼 得分:0
createroundrectrgn创建一个想要的区域。
setwindowrgn限制自己在创建的区域中。
发表于:2007-03-05 19:21:393楼 得分:0
看看crgn类,有你要要的东西。
上面的方法可实现任何形状的窗口,包括空心的。只是生成区域很麻烦。
发表于:2007-03-05 21:28:364楼 得分:0
回复yang79tao():
"createroundrectrgn创建一个想要的区域。
setwindowrgn限制自己在创建的区域中。 "
这个方法我用过了,行不通啊!有具体实现或例子可以提供吗?
发表于:2007-03-05 21:38:135楼 得分:0
可能你的坐标不对,注意屏幕坐标和客户坐标,这两者经常需要转换。
我就是用上面两个函数做到的。
发表于:2007-03-05 21:40:246楼 得分:0
比如在我的一个应用程序中,如下就把窗口做成圆角的了:
//maxx,   maxy   是两个常量:
setwindowrgn(createroundrectrgn(0,   0,   maxx   +   1,   maxy   +   1,   30,   30),   false);
movewindow(0,   0,   maxx,   maxy);
发表于:2007-03-05 22:29:277楼 得分:0
我只知道两个字——“重画”
发表于:2007-03-05 22:48:538楼 得分:0
两种方法:
1.createroundrectrgn+setwindowrgn,如楼上所说
2.透明方法,::getdc(null)来得到桌面的dc,在绘制控制时,计算其位置,进而取出dc上相应区域的位图,将做为控制的背景位图,再绘制其它部分。
发表于:2007-03-06 18:04:189楼 得分:0
回复yang79tao():
还是不成功啊,能提供个简单例子吗?贴出来或qdpiaoliang@126.com
发表于:2007-03-06 18:38:5110楼 得分:0
你写个demo,发给我看看,我就那两行就搞定了,我的邮箱是:
mail2tao@163.com
发表于:2007-03-12 17:59:3611楼 得分:0
回复yang79tao:
      控件文件和调试程序已发送到信箱,帮忙看看!
 qdpiaoliang@126.com
发表于:2007-03-14 07:21:5112楼 得分:0
关注
发表于:2007-03-14 08:30:5613楼 得分:0
早就给你回信了。
发表于:2007-03-14 14:23:5614楼 得分:0
我也需要啊,我现在正在弄这个啊,我的是qianlin.xiao@163.com
发表于:2007-03-14 18:09:4515楼 得分:0
回复yang79tao:
  不知道你有没有注意到:当鼠标移动到圆角矩形外部点击时应该无效,但实际上还是有效(即还能弹出菜单)?
  我想实现的是:当鼠标移动到圆角矩形外部点击时菜单就不能弹出了
发表于:2007-03-15 09:34:1816楼 得分:0
把你的oncreate函数里的那一堆程序去掉,写上下面的程序:
int   cshowctlctrl::oncreate(lpcreatestruct   lpcreatestruct)  
{
if   (colecontrol::oncreate(lpcreatestruct)   ==   -1)
return   -1;

//   todo:   add   your   specialized   creation   code   here
m_tip.create(this);
//创建圆形区域
setwindowrgn(createroundrectrgn(0,   0,   600   +   1,     500   +   1,   30,   30),   false);
movewindow(0,   0,   600,   500);
return   0;
}

我在我的电脑里试过了,行。
我一直叫你像我上面那样做,你为什么不呢?你的源程序中用了两区域:
一个矩形区域,一个圆形矩形区域,然后你又鬼使神差的将这两个区域合并起来了!
发表于:2007-03-15 09:41:3317楼 得分:0
如果区域从0,0开始,movewindow(0,   0,   600,   500);也可以不要,你要灵活的使用。
发表于:2007-03-15 20:48:3218楼 得分:0
有可能是搞混了,我试试看.
发表于:2007-03-16 21:12:2519楼 得分:0
说话真牛啊


快速检索

最新资讯
热门点击