GDIObjective C文本Visual Studio 6Visual C++ 7.0Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
区域的有用函数





3.00/5 (8投票s)
2003 年 3 月 12 日
1分钟阅读

51507

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

引言
当我为我的公司编写 SkinMagic Toolkit 软件时,我需要在一个限定矩形内平铺一个区域或拉伸一个区域。我将其实现为两个函数,CreateTileRegion 和 CreateStretchRegion。
Using the Code
要使用这段代码,只需将 rgntool.cpp 和 rgntool.h 添加到您的项目中。调用 CreateTileRegion 或 CreateStretchRegion 来创建新的区域。运行演示项目时,请在窗口的客户端区域双击鼠标左键,以显示效果。
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。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。
