首页 > 代码库 > VC 和 GDI+ 实现仿ibook 翻页效果
VC 和 GDI+ 实现仿ibook 翻页效果
void CGdiplusTestView::OnDraw(CDC* pDC)
{
CGdiplusTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// device context for painting
CDC dcMemory;
dcMemory.CreateCompatibleDC(NULL);
CRect bkRect;
GetClientRect(&bkRect);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC, bkRect.Width(), bkRect.Height());
SelectObject(dcMemory.GetSafeHdc(), bitmap);
topFrame =(bkRect.Height() - height)/2;
leftFrame = (bkRect.Width()-2*width)/2;
Image
L1Image(L"pages/1.jpg",false),
L2Image(L"pages/2.jpg",false),
L3Image(L"pages/1.jpg",false),
L4Image(L"pages/2.jpg",false);
Graphics graphics(dcMemory.m_hDC);
graphics.DrawImage(&L1Image,leftFrame,topFrame,width,height);
graphics.DrawImage(&L2Image,leftFrame+width,topFrame,width,height);
Pen pen(Color::Black);//设置画笔
SolidBrush brush(Color::Black);//设置画刷
//设置输出字体
FontFamily fontfamily(L"微软雅黑");
Font font(&fontfamily,12,FontStyleRegular,UnitPoint);
StringFormat strfmt;
RectF rectf(leftFrame+25, topFrame+25,280,400);
RectF rectf2(leftFrame+50+width, topFrame+25,280,450);
RectF rectf3(0, 0,280,450);
Color clrPen(0,0,0,0);
Pen penDraw(clrPen,0);
graphics.DrawString(context,1024,&font,rectf,&strfmt,&brush);
graphics.DrawString(context,1024,&font,rectf2,&strfmt,&brush);
float undersideOffset = width;
double a = 45 + (45 * m_x) / width;
double radians = a * (3.14 / 180.0);
double pageUndersideRotationAngle = (180 - (2 *a));
float calculated_y = (m_x) * (tan(radians));
float calculated_x = 0;
GraphicsPath gpLeft,gpRight;
//////////////////////////////////////////////////////////////////2
if (calculated_y < height)
{
gpLeft.AddLine( PointF(abs(width - m_x + undersideOffset),height),PointF(width + undersideOffset, height));
gpLeft.AddLine( PointF(width + undersideOffset, height),PointF(width + undersideOffset,(height - (float)calculated_y)));
}else
{
gpLeft.AddLine(PointF(abs(width - m_x + undersideOffset),height), PointF(width + undersideOffset, height));
gpLeft.AddLine(PointF(width + undersideOffset, height),PointF(width + undersideOffset, 0));
calculated_x = height / tan(radians);
gpLeft.AddLine( PointF(width + undersideOffset, 0),PointF(abs(width - (m_x - (float)calculated_x)+undersideOffset),0));
}
gpLeft.CloseFigure();
Matrix PathTranslationMatrix;
PathTranslationMatrix.Translate((float)leftFrame, (float)topFrame);
gpLeft.Transform(&PathTranslationMatrix);
Region oldRegion;
graphics.GetClip(&oldRegion);
graphics.SetClip(&gpLeft);
graphics.DrawPath(&penDraw,&gpLeft);
graphics.DrawImage(&L4Image,leftFrame+width,topFrame,width,height);
graphics.SetClip(&oldRegion);
//////////////////////////////////////////////////////////////////////3
Bitmap pageUndersideImage(width,height);
undersideOffset = width;
// if (height < calculated_y)
{
gpRight.AddLine( PointF(abs(width - m_x - undersideOffset), height),
PointF(width - undersideOffset, height));
gpRight.AddLine( PointF(width - undersideOffset, height),
PointF(width - undersideOffset,
(height - (float)calculated_y)));
}/*else
{
gpRight.AddLine(PointF(abs(width - m_x - undersideOffset), height),PointF(width - undersideOffset, height));
gpRight.AddLine(PointF(width - undersideOffset, height), PointF(width - undersideOffset, 0));
calculated_x = height / tan(radians);
gpRight.AddLine( PointF(width - undersideOffset, 0), PointF(abs(width - (m_x - (float)calculated_x)-undersideOffset), 0));
}*/
gpRight.CloseFigure();
Graphics ug(&pageUndersideImage);
ug.SetClip(&gpRight);
ug.DrawPath(&penDraw,&gpRight);
ug.DrawImage(&L3Image,0,0,width,height);
ug.DrawString(context,1024,&font,rectf3,&strfmt,&brush);
Matrix PathTranslationMatrix1;
PathTranslationMatrix1.Translate(leftFrame+width*2-m_x,topFrame+height);
PathTranslationMatrix1.Rotate((float)(pageUndersideRotationAngle));
graphics.SetTransform(&PathTranslationMatrix1);
graphics.DrawImage(&pageUndersideImage, -int(m_x) ,-height ,width, height );
pDC->BitBlt(0,0,bkRect.Width(),bkRect.Height(),&dcMemory,0, 0,SRCCOPY);
graphics.ReleaseHDC(dcMemory.m_hDC);
}
VC 和 GDI+ 实现仿ibook 翻页效果