After you are finished with you dc select in an empty CBitmap. This will return the current dc as a CBitmap. Like this....
CBitmap* bm = memDC.SelectObject(oldbm);
Now you can get the HBitmap out of the CBitmap like this.....
HBITMAP hbitmap = (HBITMAP)bm->m_hObject;
Now take the hbitmap and place it into the following function to rotate it...and there you go. You can put the hbitmap back into a CBitmap and then place it on the DC before you do a print preview.
bool HBITMAPRotate (HBITMAP& hBitmap,
float radians,
COLORREF clrBack,
CErrorHandler& eh)
{
CDC sourceDC;
CDC destDC;
if (sourceDC.CreateCompatibleDC(NULL) == FALSE)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_CREATECOMPATIBLEDC).c_str());
return false;
}
if (destDC.CreateCompatibleDC(NULL) == FALSE)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_CREATECOMPATIBLEDC).c_str());
return false;
}
BITMAP bm;
if (GetObject(hBitmap,sizeof(bm),&bm) == 0)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_GETOBJECT_HBITMAP).c_str());
return false;
}
float cosine = (float)cos(radians);
float sine = (float)sin(radians);
int x1 = (int)(bm.bmHeight * sine);
int y1 = (int)(bm.bmHeight * cosine);
int x2 = (int)(bm.bmWidth * cosine + bm.bmHeight * sine);
int y2 = (int)(bm.bmHeight * cosine - bm.bmWidth * sine);
int x3 = (int)(bm.bmWidth * cosine);
int y3 = (int)(-bm.bmWidth * sine);
int minx = min(0,min(x1, min(x2,x3)));
int miny = min(0,min(y1, min(y2,y3)));
int maxx = max(0,max(x1, max(x2,x3)));
int maxy = max(0,max(y1, max(y2,y3)));
int w = maxx - minx;
int h = maxy - miny;
HBITMAP hbmResult = ::CreateCompatibleBitmap(CClientDC(NULL), w, h);
if (hbmResult == NULL)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_CREATECOMPATIBLEBITMAP).c_str());
return false;
}
HBITMAP hbmOldSource = (HBITMAP)::SelectObject( sourceDC.m_hDC, hBitmap );
HBITMAP hbmOldDest = (HBITMAP)::SelectObject( destDC.m_hDC, hbmResult );
HBRUSH hbrBack = CreateSolidBrush( clrBack );
if (hbrBack == NULL)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_CREATESOLIDBRUSH).c_str());
return false;
}
HBRUSH hbrOld = (HBRUSH)::SelectObject( destDC.m_hDC, hbrBack );
if (destDC.PatBlt(0,0,w,h,PATCOPY) == FALSE)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_PATBIT).c_str());
return false;
}
::DeleteObject( ::SelectObject( destDC.m_hDC, hbrOld ) );
SetGraphicsMode(destDC.m_hDC, GM_ADVANCED);
XFORM xform;
xform.eM11 = cosine;
xform.eM12 = -sine;
xform.eM21 = sine;
xform.eM22 = cosine;
xform.eDx = (float)-minx;
xform.eDy = (float)-miny;
if (SetWorldTransform(destDC.m_hDC,&xform) == FALSE)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_SETWORLDTRANSFORM).c_str());
return false;
}
if (destDC.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&sourceDC,0,0,SRCCOPY) == FALSE)
{
eh.Initialize();
eh.Set(__FUNCTION__,__FILE__,__LINE__,EHTYPE_ERROR,LoadStringFromDLL(IDS_ERROR_BITBLT).c_str());
return false;
}
::SelectObject( sourceDC.m_hDC, hbmOldSource );
::SelectObject( destDC.m_hDC, hbmOldDest );
hBitmap = hbmResult;
return true;
}
Chris
|