容器好像不行但旋转其中图片可以用bitblt函数

解决方案 »

  1.   

    可以使用下面的程序旋转PictureBox中的图片:
    PrivateConstSRCCOPY=&HCC0020
    PrivateConstPi=3.14PrivateDeclareFunctionSetPixelLib"gdi32"(ByValhdcAsLong, ByValxAsLong,ByValyAsLong,ByValcrColorAsLong)AsLong
    PrivateDeclareFunctionGetPixelLib"gdi32"(ByValhdcAsLong, ByValxAsLong,ByValyAsLong)AsLongPrivateDeclareFunctionStretchBltLib"gdi32"(ByValhdcAsLong, ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong, ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValnSrcWidth AsLong,ByValnSrcHeightAsLong,ByValdwRopAsLong)AsLongprivateSubbmp_rotate(pic1AsPictureBox,pic2AsPictureBox,ByValtheta)‘45度旋转 
      Dimc1xAsInteger,c1yAsInteger
      Dimc2xAsInteger,c2yAsInteger
      DimaAsSingle
      Dimp1xAsInteger,p1yAsInteger
      Dimp2xAsInteger,p2yAsInteger
      DimnAsInteger,rAsInteger  c1x=pic1.ScaleWidth\2
      c1y=pic1.ScaleHeight\2
      c2x=pic2.ScaleWidth\2
      c2y=pic2.ScaleHeight\2
      Ifc2x<c2yThenn=c2yElsen=c2x
       n=n-1
       pic1hDC=pic1.hdc
       pic2hDC=pic2.hdc
       Forp2x=0Ton
       Forp2y=0Ton
      Ifp2x=0Thena=Pi/2Elsea=Atn(p2y/p2x)
       r=Sqr(1&*p2x*p2x+1&*p2y*p2y)
       p1x=r*Cos(a+theta)
       p1y=r*Sin(a+theta)
       c0&=GetPixel(pic1hDC,c1x+p1x,c1y+p1y)
       c1&=GetPixel(pic1hDC,c1x-p1x,c1y-p1y)
       c2&=GetPixel(pic1hDC,c1x+p1y,c1y-p1x)
       c3&=GetPixel(pic1hDC,c1x-p1y,c1y+p1x)
       Ifc0&<>-1ThenSetPixelpic2hDC,c2x+p2x,c2y+p2y,c0
       Ifc1&<>-1ThenSetPixelpic2hDC,c2x-p2x,c2y-p2y,c1
       Ifc2&<>-1ThenSetPixelpic2hDC,c2x+p2y,c2y-p2x,c2
       Ifc3&<>-1ThenSetPixelpic2hDC,c2x-p2y,c2y+p2x,c3
       Next
       Next
    EndSubPrivateSubCommand1_Click()‘正常复制
     Picture2.Cls
     px=Picture1.ScaleWidth
     py=Picture1.ScaleHeight
     StretchBltPicture2.hdc,px,0,-px,py,Picture1.hdc,0,0,px,py,SRCCOPY
    EndSubPrivateSubCommand2_Click()‘180度倒立
     Picture2.Cls
     px=Picture1.ScaleWidth
     py=Picture1.ScaleHeight
     StretchBltPicture2.hdc,0,py,px,-py,Picture1.hdc,0,0,px,py,SRCCOPY
    EndSubPrivateSubCommand3_Click()‘45旋转
     Picture2.Cls
     Callbmp_rotate(Picture1,Picture2,3.14/4)
    EndSubPrivateSubForm_Load()
     OnErrorResumeNext
     Me.Caption=App.Title"添加应用程序标题
     Me.Left=(Screen.Width-Me.Width)/2
     Me.Top=(Screen.Height-Me.Height)/2"窗体具中
     Picture1.ScaleMode=3
     Picture2.ScaleMode=3
    EndSub
    两个图片框(picture1和picture2),添加三个命令按钮command1(caption=“正常显示”)、command2(caption=“180度倒立”)、command3(caption=“45度旋转”).
      

  2.   

    可以旋转图片.---- 进 入VISUAL BASIC 中, 建 立 一 个 新 的 窗 体。 在 窗 体 中 加 入 两 个 图 画 盒 控 件(Picture1 和Picture2), 设 置 它 们 的Name 属 性 为PicSource 和PicTarget, 并 为PicSource 图 画 盒 的 Picture 属 性 设 置 一 幅 位 图。 再 在 窗 体 中 加 入 一 个 按 钮(CommandRotorate), 设 置 它 的 Caption 属 性 为“ 旋 转”。 然 后 加 入 以 下 代 码: Option Explicit
    Const Pi = 3.14
    Private Sub CommandRototate_Click()
      Dim x As Integer, y As Integer
      Dim X1 As Integer, Y1 As Integer
      Dim X2 As Double, Y2 As Double
      Dim X3 As Double, Y3 As Double
      Dim JiaoDu As Double
      Dim HuDu As Double
      JiaoDu = 45        ' 角 度
      HuDu = JiaoDu * Pi / 180  ' 弧 度
      PicSource.ScaleMode = vbPixels
      PicTarget.ScaleMode = vbPixels
      For x = 0 To PicTarget.ScaleWidth
        X1 = x - PicTarget.ScaleWidth \ 2
        For y = 0 To PicTarget.ScaleHeight
          Y1 = y - PicTarget.ScaleHeight \ 2
          X2 = X1 * Cos(-HuDu) + Y1 * Sin(-HuDu)
          Y2 = Y1 * Cos(-HuDu) - X1 * Sin(-HuDu)
          X3 = X2 + PicSource.ScaleWidth \ 2
          Y3 = Y2 + PicSource.ScaleHeight \ 2
          If X3 > 0 And X3 < PicSource.Scale
          Width - 1 And Y3 > 0 And Y3 
          < PicSource.ScaleHeight - 1 Then
          PicTarget.PSet (x, y), PicSource.Point(X3, Y3)
          End If
        Next y
      Next x
    End Sub---- 运 行 后, 按 下“ 旋 转” 按 钮, 可 以 见 到 源 图 画 盒 中 的 位 图 旋 转45 度 后 进 入 到 目 标 图 画 盒 中。 如 果 要 改 变 旋 转 的 角 度, 只 需 将JiaoDu 变 量 设 置 为 相 应 值 即 可。