HardBirch

VC 和 GDI+ 实现仿ibook 翻页效果

时间:12-02-20 栏目:iOS游戏开发技术 作者:张飞不张,文采横飞 评论:0 点击: 1,940 次

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

VC 和 GDI+ 实现仿ibook 翻页效果:等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐