|
|
HBITMAP GetRotatedBitmapNT_FixCenter( HBITMAP hBitmap, float radians, COLORREF clrBack )
{
CDC sourceDC, destDC;
sourceDC.CreateCompatibleDC( NULL );
destDC.CreateCompatibleDC( NULL );
BITMAP bm;
::GetObject( hBitmap, sizeof( bm ), &bm );
float cosine = (float)cos(radians);
float sine = (float)sin(radians);
HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), bm.bmWidth, bm.bmHeight);
HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );
HBRUSH hbrBack = CreateSolidBrush( clrBack );
HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack );
destDC.PatBlt( 0, 0, bm.bmWidth, bm.bmHeight, PATCOPY );
:eleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) );
float x0,y0,rad;
x0=(float)bm.bmWidth/2;
y0=(float)bm.bmHeight/2;
rad=(float)sqrt(x0*x0+y0*y0);
SetGraphicsMode(destDC.m_hDC, GM_ADVANCED);
XFORM xform;
xform.eM11 = cosine;
xform.eM12 = sine;
xform.eM21 = -sine;
xform.eM22 = cosine;
xform.eDx =(float) ( x0 - rad*cos(PI/4.0+radians) );
xform.eDy = (float)( y0 - rad*(sin(PI/4.0+radians)) );
SetWorldTransform( destDC.m_hDC, &xform );
destDC.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &sourceDC, 0, 0, SRCCOPY );
::SelectObject( sourceDC.m_hDC, hbmOldSource );
::SelectObject( destDC.m_hDC, hbmOldDest );
return hbmResult;
}
__________________
|
|