none
请问如何将一个Region转化为Path? RRS feed

  • 问题

  • 我想给一个区域(Region)画框,在GDI中可以用FrameRgn函数,可是在GDI+中Graphics里面只有DrawPath好像可以实现画框,但是区域好像又不能转换成路径,所以请问如何在GDI+中实现给一个区域画框的功能。
    LHL
    2009年9月9日 6:19

答案

全部回复

  • VOID Example_GetData(HDC)
    
    {
       Point points[] = {
          Point(110, 20)
          Point(120, 30),
          Point(100, 60),
          Point(120, 70),
          Point(150, 60),
          Point(140, 10)};
       GraphicsPath path;
       path.AddClosedCurve(points, 6);
       
       // Create a region from a path.
       Region pathRegion(&path); 
          
       // Get the region data.
       UINT bufferSize = 0;
       UINT sizeFilled = 0;
       BYTE* pData = NULL;
       
       bufferSize = pathRegion.GetDataSize();
       
       pData = new BYTE[bufferSize];
       pathRegion.GetData(pData, bufferSize, &sizeFilled);
       
       // Inspect or use the region data.
       ...
       delete pData;
    }
    MSDN中有小例子
    2009年9月11日 3:32
  • 但是,pData里面装的是什么呢?怎么用呢?有没有描述区域里面的数据的格式的文档?


    LHL
    2009年9月11日 4:46
  • 你可以使用
    Status  Graphics::DrawPath(      

        const Pen *pen,
        const GraphicsPath *path
    );
    Status Graphics::FillPath(      

        const Brush *brush,
        const GraphicsPath *path
    );

    Status Graphics::FillRegion(      

        const Brush *brush,
        const Region *region
    );

    来实现画框和填充框。
    2009年9月11日 7:09
  • 谢谢你的回复!
    不过我的意思是在只提供了Region对象的情况下,如何实现给这个region画框,并且不填充这个区域。在GDI中我知道可以用FrameRgn这个函数做到,但是在GDI+中我找不到对应的函数或者功能等效的方法。
    上面你提供的方法需要一个Path对象,但是我只有Region对象,并且找不到转换成Path的方法(好像根本就不可以,GDI中也没有),FillRegion是填充区域,我不能用,我要的效果是不填充区域。
    目前我只能用Region::GetHRGN方法获得GDI的HRGN,然后用FrameRgn去画框,这也有点太……,我觉得GDI+肯定有办法给区域画框,但是没找到。


    LHL
    2009年9月11日 7:19
  • Region To Path

      Matrix matrix;
      Rect * pRects;
      GraphicsPath   newPath;  
      int count   =   pathRegion.GetRegionScansCount(&matrix);  
      pRects   =   (Rect*)malloc(count*sizeof(Rect));  
      pathRegion.GetRegionScans(&matrix,   pRects,   &count);   
      newPath.AddRectangles(pRects,count);
    2009年9月11日 9:01
  • 谢谢您的回答!
    但是我要画的是区域的边框,如果用矩形组成一个路径的话,除了边框外,中间还有很多横线的。而且GetRegionScans获得的只是一个区域的近似表示。
    另外,难道GDI+真没有简单办法实现FrameRgn?


    LHL
    2009年9月11日 9:14
  • 恩,貌似没有其他方法了,可以参考一下帖子:
    http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-drawing/3061/Region-To-GraphicsPath

    • 已标记为答案 lhlzhxh 2009年9月15日 5:00
    2009年9月11日 9:24
  • 看了一下那个帖子,也没有直接的解决办法,他假设区域是由路径创建的,这样,你保存两份路径数据,用一个创建区域,一个留作他用,比如用于画框。
    唉!
    LHL
    2009年9月11日 16:42