请教!多边形的特殊填充问题?

daredjever 2010-02-01 04:07:30
大家好:
问题是这样的。使用MFC!
我需要对一个多边形进行填充,多边形的范围由一个Point数组提供。
但是不是简单的单颜色填充,而是等间距的填充特定的小符号。
这里为了说明方便,假定填充一个小圆形,半径是3像素,圆的左右上下间距均为5像素。
没有小圆的地方就还是原来的背景。

我的思路是在一张小位图上绘制制定的小圆,然后将这张位图选入刷子形成位图刷子,再选入dc对多边形进行填充,但是这样的话,小位图的背景(除画有圆的部分)将覆盖原来多边形的图案。我在JAVA采用同样的方法,JAVA中可以设置位图的属性为透明,除了绘制的圆外,其他地方填充上去将自动显示原背景。

请问有没有谁有比较好的想法实现这一功能?
如果表达不清楚我一会上一个JAVA中的效果图。
...全文
133 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
daredjever 2010-02-04
  • 打赏
  • 举报
回复
[img]http://hi.csdn.net/attachment/201002/1/3895181_1265012756Z46a.jpg[\img]
daredjever 2010-02-04
  • 打赏
  • 举报
回复

daredjever 2010-02-04
  • 打赏
  • 举报
回复
http://hi.csdn.net/attachment/201002/1/3895181_1265012756Z46a.jpg
结贴。我之前使用的是12楼的方法,但是因为每次的图案都不一样,所以每次都要新生成图片贴上去,多了就影响效率了。有的时候有好几百个这样的区域。我还是找找GDI+的透明位图刷子,就像JAVA中的那样,楼上有人说了。
会飞的老鱼 2010-02-01
  • 打赏
  • 举报
回复
将你的原位图设置为窗口背景,然后再按你的想法,将用于填充的图案创建成画刷,然后利用透明显示的方法将画刷图案显示到窗口背景图片上即可,至于透明显示位图,可以利用TransparentBlt()这个API函数来完成
sjdev 2010-02-01
  • 打赏
  • 举报
回复
你说的是位图画刷?的效果?
sjdev 2010-02-01
  • 打赏
  • 举报
回复
呵呵,我先告诉你如何在帖子中插入图片吧。

1.首先,把图片上传到相册,这个你已经做到了。
2.点击右下角的,“在新窗口查看原图”。
3.复制新窗口中路径,然后插入图片。

hahaking119 2010-02-01
  • 打赏
  • 举报
回复
你可以试试分层窗口,就是使用两个窗口分为上层和下层,上层负责画你的多边形,下层就是你背景图片,不过要设置窗口属性,上层窗口要设置WS_EX_TRANSPARENT属性,然后你需要一个管理窗口负责放置上层和下层窗口,同时要设置这个管理窗口的风格WS_EX_COMPOSITED,我在做电子地图的时候就是这么做的,你可以试试,不知道我描述的你是否明白。
我简单写一下
CEmapManagerWnd->管理窗口,负责管理背景层和图元层,需要指明组合属性WS_EX_COMPOSITED
CEmapElementsLayerWnd->图元层窗口,负责绘制图元,同时在窗口时需要指明WS_EX_TRANSPARENT透明属性
CEmapBkLayer->背景层窗口,负责绘制背景
创建时先创建管理窗口,然后是图元层和背景层,图元层一定要在背景层之上,因此要注意Z序,然后你的多边型画在图元层,你的背景直接画在背景层就可以了
BOOL CEmapManagerWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
BOOL bRes = CFrameWnd::OnCreateClient(lpcs, pContext);
ModifyStyleEx(0, WS_EX_COMPOSITED);
CEmapElementsLayerWnd* pElementsLayer = new CEmapElementsLayerWnd();
CEmapBkLayer* pMapLayer = new CEmapBkLayer();
if ( !pElementsLayer ->CreateEx(WS_EX_TRANSPARENT, AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS),
_T("MapElementsLayer"),
WS_CHILD | WS_VISIBLE,
CRect(0, 0, 0, 0),
this,
1))
{
return;
}
if ( !pMapLayer->CreateEx(0,
AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW),
_T("MapLayer"),
WS_CHILD | WS_VISIBLE,
CRect(0, 0, 0, 0),
this,
0))
{
return;
}
return bRes;
}

你在OnSize里面自己调整调整图元层和背景层的大小就可以
lsvine 2010-02-01
  • 打赏
  • 举报
回复
问题明白了 两个带星的都说了 自己再查查他们提到的相关资料应该能解决
daredjever 2010-02-01
  • 打赏
  • 举报
回复
不才,竟不知道怎么上图。

我再这样说下吧。

相当于用位图刷子去填充一个多边形区域,但是只保留位图刷子中位图的符号部分,背景部分透明掉,还是显示源图片的背景。
wuhuwy 2010-02-01
  • 打赏
  • 举报
回复
看不到图啊,不明白你的问题
daredjever 2010-02-01
  • 打赏
  • 举报
回复
[img]http://hi.csdn.net/space-3895181-do-album-picid-483971.html[/img]

我试试怎么上图。
daredjever 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dirdirdir3 的回复:]
就是透明画图吧,用maskblt........
[/Quote]

不是简单的两张图片的叠加透明,可能是我没表达清楚。
可以这样理解,
在源设备环境中的某个多边形区域内,绘制一些等间距的特定符号。(符号的大小形状一定,间距一定,数量就只与多边形大小有关),在多边形内没画符号的地方依然显示原背景。
为了说明方便,大家大可把这个符号就想成一个小圆甚至一个圆点。
当这个多边形拖动的时候这些小符号的相对位置是可以改变的。
jameshooo 2010-02-01
  • 打赏
  • 举报
回复
已经看明白了。GDI不行,要用GDI+的位图刷才能保留透明。
daredjever 2010-02-01
  • 打赏
  • 举报
回复
弱问。怎么上图?
dirdirdir3 2010-02-01
  • 打赏
  • 举报
回复
就是透明画图吧,用maskblt........

19,469

社区成员

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

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