65.9K
CodeProject 正在变化。 阅读更多。
Home

区域的有用函数

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (8投票s)

2003 年 3 月 12 日

1分钟阅读

viewsIcon

51507

downloadIcon

1499

用于平铺区域和拉伸区域的函数。

Sample Image - appspeed.gif

引言

当我为我的公司编写 SkinMagic Toolkit 软件时,我需要在一个限定矩形内平铺一个区域或拉伸一个区域。我将其实现为两个函数,CreateTileRegionCreateStretchRegion

Using the Code

要使用这段代码,只需将 rgntool.cpprgntool.h 添加到您的项目中。调用 CreateTileRegionCreateStretchRegion 来创建新的区域。运行演示项目时,请在窗口的客户端区域双击鼠标左键,以显示效果。

HRGN CreateStretchRgn( HRGN hSrcRgn,  //the source region handle
                       float xScale , //x-axis scale
                       float yScale , //y-axis scale
                       int xOffset ,  //x-axis offset
                       int yOffset )  //y-axis offset
{
    XFORM xForm;
    xForm.eDx = 0;
    xForm.eDy = 0;
    xForm.eM11 = xScale;
    xForm.eM12 = 0;
    xForm.eM21 = 0;
    xForm.eM22 = yScale;
    HRGN hRgn = NULL ;
    
    DWORD dwCount = GetRegionData( hSrcRgn , 0 , NULL );
    BYTE* pRgnData =(BYTE*) malloc( dwCount );
    if( pRgnData )
    {
        dwCount = GetRegionData( hSrcRgn , dwCount , (RGNDATA*)pRgnData );
        hRgn = ExtCreateRegion( &xForm , dwCount , (RGNDATA*)pRgnData );
        free( pRgnData );
      if( hRgn )
      {
        OffsetRgn( hRgn , xOffset, yOffset );
        return hRgn;

      }
  }
  return NULL;
 }

HRGN CreateTitleRgn( HRGN hSrcRgn,    //the source region handle
                     SIZE szSize ,    //the source region rect size
                     RECT rcBound )   //the bound rectangle
{
  HRGN hRgn = CreateRectRgn( 0,0,10,10 );
  HRGN hTempRgn1 = CreateRectRgn( 0,0,10,10 );
  HRGN hTempRgn2 =CreateRectRgn( 0,0,10,10 );

  CombineRgn( hTempRgn2 , hSrcRgn , hTempRgn1 , RGN_COPY );
  CombineRgn( hRgn , hSrcRgn , hTempRgn1 , RGN_COPY );
  OffsetRgn( hRgn , rcBound.left , rcBound.top );
  int xOffset=0 , yOffset=0;
  for (yOffset = rcBound.top ; yOffset < rcBound.bottom ; yOffset += szSize.cy)
  {
    for (xOffset=rcBound.left ; xOffset < rcBound.right ; xOffset += szSize.cx)
    {
      CombineRgn( hTempRgn1 , hTempRgn2 , hSrcRgn , RGN_COPY );
      OffsetRgn( hTempRgn1 , xOffset , yOffset );
      CombineRgn( hRgn , hRgn , hTempRgn1 , RGN_OR );
    }
  }
  DeleteObject( hTempRgn1 );
  DeleteObject( hTempRgn2 );
  hTempRgn1 = CreateRectRgnIndirect( &rcBound );
  CombineRgn( hRgn , hRgn , hTempRgn1 , RGN_AND );
  DeleteObject( hTempRgn1 );
  return hRgn;
}

访问 这里 以获取我的其他 Win32 软件。

历史

  • 2003-03-13:发布日期

Copyright

这段代码是免费的,如果您想修改源代码以改进功能、性能等,请将新的源代码发送给我,以便我查看。修改后的源代码应包含您所做的更改的描述,当然还有您的姓名。您唯一不能更改的是原始版权信息。

致谢

首先,感谢我的老板允许我在本网站上发布这段代码。

其次,感谢作者(很抱歉我没有记下他的/她的名字)编写了 CreateRgnFromBitmap

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.