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);
    
    
}


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值