原来的 region 就是采用 这个方法得来的 asus1111(寒羽) ( ) 信誉:100 Blog 2006-11-23 13:37:40 得分: 0
GraphicsPath path = new GraphicsPath(); //...... path.AddRectangle(new Rectangle(...)); //...... Region region = new Region(path);////////////////////////////////////////////////////////////你说region是从这里来的,我觉得没有什么道理. 1,那你的new Rectangle(...);数据从哪里来? 2,如果你的region是从path来的,那何必费这个劲来画呢,你想要的数组就在 ph.PathData.Points[]里啊. 3,如果你不是做GIS的,我看到的那个只是一个位图,那你放大缩小便没有意义了
想用就直接用呗 [DllImport("gdi32.dll", EntryPoint = "FrameRgn")] public static extern int FrameRgn (....);
费了九牛二虎之力,终于调成了 [DllImport("gdi32.dll", EntryPoint = "FrameRgn")] public static extern int FrameRgn( IntPtr hdc, // handle to device context IntPtr hrgn, // handle to region to be framed IntPtr hbr, // handle to brush used to draw border int nWidth, // width of region frame int nHeight); 描边成功. 但,不能解决你的问题.他也是,如果按我们得到的region,点的顺序是乱的.那他画的也是乱的. 看来得另想办法了
r1 = region.Clone();
r2 = region.Clone();
rOut = region.Clone();
r1.Translate(1, 0);
r2.Xor(r1);
r1.Translate(-1, 1);
rOut.Xor(r1);
rOut.Union(r2);return rOut;能实现功能,但当图片放大或缩小后,边界线非常难看
//......
path.AddRectangle(new Rectangle(...));
//......
Region region = new Region(path);
Region r1, r2, rOut;
r1 = region.Clone();//??你原来的这个region是从哪来的?你的图是给定了这个region的?
r2 = region.Clone();
rOut = region.Clone();
r1.Translate(1, 0);
r2.Xor(r1);
r1.Translate(-1, 1);
rOut.Xor(r1);
rOut.Union(r2);return rOut;
asus1111(寒羽) ( ) 信誉:100 Blog 2006-11-23 13:37:40 得分: 0
GraphicsPath path = new GraphicsPath();
//......
path.AddRectangle(new Rectangle(...));
//......
Region region = new Region(path);
而且GIS上的地图是解析地图文件来的,怎么会是位图?
你这个图要是位图的话,缩放也就没有意义了
asus1111(寒羽) ( ) 信誉:100 Blog 2006-11-23 13:37:40 得分: 0
GraphicsPath path = new GraphicsPath();
//......
path.AddRectangle(new Rectangle(...));
//......
Region region = new Region(path);////////////////////////////////////////////////////////////你说region是从这里来的,我觉得没有什么道理.
1,那你的new Rectangle(...);数据从哪里来?
2,如果你的region是从path来的,那何必费这个劲来画呢,你想要的数组就在
ph.PathData.Points[]里啊.
3,如果你不是做GIS的,我看到的那个只是一个位图,那你放大缩小便没有意义了
public static extern int FrameRgn (....);
2、ph.PathData.Points[] 里面存的点并不是边界,而是每次 AddRectangle() 的点信息,导至 DrawLines(Pen, Point[])是一片,而不是一条线;
3、至于位图放大缩小是否有意义,因为系统需要
想用就直接用呗
=======================================
似乎并不能那么直接地使用
2、ph.PathData.Points[] 里面存的点并不是边界,而是每次 AddRectangle() 的点信息,导至 DrawLines(Pen, Point[])是一片,而不是一条线;
3、至于位图放大缩小是否有意义,因为系统需要
///////////////////////////////////////////////既然你的通过判断每个点得来的new Rectangle(...),你必然可以取到颜色有变化的地方的点.
比如上一点是黑色,而一下点是白色,那你则可在另一点数组记此点.由此得到边界点数组.
======================================================
没错,就是根据颜色变化情况得到。但比如下面:
------------------------------
____1****7______******________
---2******6____********_______
----3****5------*****---------
------4*----------**----------
------------------------------
横线表示白色,星表示黑色。边框,就应该是1->2->3->4->5->6-7这样的点顺序才能画出来。
而这个点的顺序在 path.PathPoints 中保存是顺序并不是这样,导至画的线而不是边框
============================================================
我的意思不是说GDI的API不能在.Net中使用。这是因为gdi32和gdi+(gdiplus)的区别,能直接使用吗?Region是在.Net中创建的System.Drawng.Region,而不是采用gdi32中的Create...Rgn
来得到HRGN,但HBrush我没找到.需要实验
[DllImport("gdi32.dll", EntryPoint = "FrameRgn")]
public static extern int FrameRgn(
IntPtr hdc, // handle to device context
IntPtr hrgn, // handle to region to be framed
IntPtr hbr, // handle to brush used to draw border
int nWidth, // width of region frame
int nHeight);
描边成功.
但,不能解决你的问题.他也是,如果按我们得到的region,点的顺序是乱的.那他画的也是乱的.
看来得另想办法了
hrgn 应该传 Gegion.GetHrgn(graphics)?
hbr 呢,难道用 gdi32 中 CreateSolidBrush?
可是白忙火了半天,还是不能解决问题
....
IntPtr hdc = graphics.GetHdc();
IntPtr hRgn = region.GetHrgn(graphics); //报“当前对象正在其它地方使用”
...
IntPtr hRgn = region.GetHrgn(graphics);
IntPtr hdc = graphics.GetHdc();g在绑定dc之后,就不能给别的东西用了
http://www.cnblogs.com/images/cnblogs_com/loyee/77051/o_map2.jpg
你是自己做的DEMO么?
要是没什么保密的能发给我一份不?
[email protected]
public static extern int FrameRgn(IntPtr hdc, IntPtr hRgn, IntPtr hBrush, int nWidth, int nHeight);[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern IntPtr CreateSolidBrush(int crColor);[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern int DeleteObject(IntPtr hObject);protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e); Region region = new Region(new Rectangle(10, 10, 50, 50));
region.Union(new Rectangle(40, 40, 100, 100));
e.Graphics.FillRegion(Brushes.Black, region);
IntPtr hBrush = CreateSolidBrush(255);
IntPtr hRgn = region.GetHrgn(e.Graphics);
IntPtr hdc = e.Graphics.GetHdc();
FrameRgn(hdc, hRgn, hBrush, 1, 1);
e.Graphics.ReleaseHdc();
region.ReleaseHrgn(hRgn);
DeleteObject(hBrush);
}
这么写你认为我不会么?
我自己造了一个region.从path里来的.加了一个10个点的多边形.
当顺序正确时描边成功 .当顺序不对时,描边描的乱七八糟.如果按我这样的结果.跟本就没必要搞什么FrameRgn了,因为它和g.DrawPolygon完成功能一样.那我们还讨论一下午干嘛