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 翻页效果)