filepath为图片路径,angle为旋转角度。旋转以pCenter为中心进行旋转,并且pCenter将位于图片中心
用于绘制模拟时钟表针
void CXXXXX::DrawBmp(CDC *pDC, CString filepath, double angle)
{
double SrcWidth = 0;//图片宽度
double SrcHeight = 0;//图片高度
CFile file; //用于读取BMP文件
BITMAPFILEHEADER bfhHeader;//bmp文件头
BITMAPINFOHEADER bmiHeader; //bmp格式头
LPBITMAPINFO lpBitmapInfo; //bmp格式具体信息
if(!file.Open(filepath,CFile::modeRead))
return; //打开文件
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//读取文件头
if(bfhHeader.bfType!=0x4d42) //判断是否是BM
return;
if(bfhHeader.bfSize!=file.GetLength())
return;
if(file.Read((LPSTR)&bmiHeader,sizeof(bmiHeader)) != sizeof(bmiHeader))
return;
SrcHeight = bmiHeader.biHeight; //得到高度和宽度
SrcWidth = bmiHeader.biWidth;
file.SeekToBegin();
file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));
UINT uBmpInfoLen=(UINT) bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
lpBitmapInfo=(LPBITMAPINFO) new BYTE[uBmpInfoLen];
file.Read((LPVOID) lpBitmapInfo,uBmpInfoLen);
if((* (LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
return;
DWORD dwBitlen=bfhHeader.bfSize - bfhHeader.bfOffBits;
LPVOID lpSrcBits=new BYTE[dwBitlen]; //将数据读入lpSrcBits数组
file.Read(lpSrcBits,dwBitlen);
file.Close(); //关闭文件
CDC bmpDC;
bmpDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,SrcWidth,SrcHeight);
bmpDC.SelectObject(&bmp);
StretchDIBits(bmpDC.m_hDC,0,0,SrcWidth,SrcHeight,0,0,bmiHeader.biWidth,bmiHeader.biHeight,lpSrcBits,lpBitmapInfo,DIB_RGB_COLORS,MERGECOPY);
//StretchDIBits不能去掉。将图片贴到bmpDC中
double x1,x2,x3;
double y1,y2,y3;
double maxWidth,maxHeight,minWidth,minHeight;
double srcX,srcY;
double sinA,cosA;
double DstWidth;
double DstHeight;
angle=angle/ 180.0 * 3.14159265;
sinA = sin(angle);
cosA = cos(angle);
x1 = SrcWidth * cosA;
y1 = SrcWidth * sinA;
x2 = SrcWidth * cosA - SrcHeight * sinA;
y2 = SrcWidth * sinA + SrcHeight * cosA;
x3 = -SrcHeight *sinA;
y3 = SrcHeight *cosA;
minWidth = x3> (x1> x2?x2:x1)?(x1> x2?x2:x1):x3;
minWidth = minWidth> 0?0:minWidth;
minHeight = y3> (y1> y2?y2:y1)?(y1> y2?y2:y1):y3;
minHeight = minHeight> 0?0:minHeight;
maxWidth = x3> (x1> x2?x1:x2)?x3:(x1> x2?x1:x2);
maxWidth = maxWidth> 0?maxWidth:0;
maxHeight = y3> (y1> y2?y1:y2)?y3:(y1> y2?y1:y2);
maxHeight = maxHeight> 0?maxHeight:0;
DstWidth = abs(maxWidth - minWidth)+1;
DstHeight =abs(maxHeight - minHeight)+1;
HDC dcDst;//旋转后的内存设备环境
HBITMAP newBitmap;
dcDst = CreateCompatibleDC(pDC->m_hDC);
newBitmap = CreateCompatibleBitmap(pDC->m_hDC,(int)DstWidth,(int)DstHeight);
SelectObject(dcDst,newBitmap);
::FillRect(dcDst,CRect(0,0,DstWidth,DstHeight),CBrush(RGB(255,255,255)));
int i = 0;
int j = 0;
for(i = 0; i < DstHeight; i++)
{
for(j = 0; j < DstWidth; j++)
{
srcX = (j + minWidth) * cosA + (i + minHeight) * sinA;
srcY = (i + minHeight) * cosA - (j + minWidth) * sinA;
if((srcX >= 0) && (srcX <= SrcWidth) &&(srcY >= 0) && (srcY <= SrcHeight))
{
BitBlt(dcDst, j, i, 1, 1, bmpDC.m_hDC, (int)srcX, (int)srcY, SRCCOPY);
}
}
}
CRect rtHour;
rtHour.left=pCenter.x-DstWidth/2;
rtHour.right=rtHour.left+DstWidth;
rtHour.top=pCenter.y-DstHeight/2;
rtHour.bottom=rtHour.top+DstHeight;
TransparentBlt(pDC->m_hDC,rtHour.left,rtHour.top,rtHour.Width(),rtHour.Height(),dcDst,0,0,rtHour.Width(),rtHour.Height(),RGB(255,255,255));
delete[] lpBitmapInfo;
delete[] lpSrcBits;
lpBitmapInfo = NULL;
lpSrcBits = NULL;
::ZeroMemory(&bfhHeader,sizeof(bfhHeader));
::ZeroMemory(&bmiHeader,sizeof(bmiHeader));
::ZeroMemory(&lpBitmapInfo,sizeof(lpBitmapInfo));
bmpDC.DeleteDC();
bmp.DeleteObject();
DeleteDC(dcDst);
DeleteObject(newBitmap);
}