zoukankan      html  css  js  c++  java
  • 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);
       
       
    }

  • 相关阅读:
    js直接获取当前windows登陆账号---仅适用于IE
    Windows变量路径与通配符
    IDEA数据库生成Entity 带注释, 默认值
    BIM+区块链在建筑业施工过程结算的应用
    Java中动态规则的实现方式
    Git查看本地仓库关联关系以及清理无效远程分支
    Golang把字符串数组、[]interface{}打乱、切片乱序
    Golang将map数组按照指定字段排序
    Golang把时间和数字相乘报错invalid operation: second * time.Second (mismatched types int and time.Duration)
    Golang获取明日时间及距离明日凌晨的时间差
  • 原文地址:https://www.cnblogs.com/For-her/p/3945104.html
Copyright © 2011-2022 走看看