我做一个将picturebox里的图形(也是用程序画的)放大的程序.我希望做成autoCAD那样的效果
我只用了一个picturebox,也就是说用paintpicture方法是不是不行?paintpicture是不是用于放大,但要求原图形和目的图形不是同一个picturebox?
所以我的做法是:
放大就是将picturebox的width,height放大.然后重新画图.
我设置了一个最大放大倍数,结果,有时候能运行,有时候会出错.
出错地点:Picx.Scale (xmin, ymax)-(xmax, ymin)
错误原因:不能创建 AutoRedraw 图象(错误 480)
后来根据帮助我一查,发现是内存消耗太大的时候,就出错.
各位高手,我该怎么解决这个问题?

解决方案 »

  1.   

    Scale 使用缩放坐标系统啊,更改坐标系统也不能放到、缩小图像啊。还有一个问题,你为什么只用一个Picture呢?在窗体再加一个picture,并设置成不可见,把它当成图像缓存区用,这样便于使用各种GDI里的API啊。如果要保证放大、缩小后的图像不发生畸变,建议你用向量图。简单例子如下Option Explicit
    Public Const MM_ANISOTROPIC = 8
    Public Const LF_FACESIZE = 32
    Public Const DEFAULT_CHARSET = 1
    Type LOGFONT
            lfHeight As Long
            lfWidth As Long
            lfEscapement As Long
            lfOrientation As Long
            lfWeight As Long
            lfItalic As Byte
            lfUnderline As Byte
            lfStrikeOut As Byte
            lfCharSet As Byte
            lfOutPrecision As Byte
            lfClipPrecision As Byte
            lfQuality As Byte
            lfPitchAndFamily As Byte
            lfFaceName(0 To LF_FACESIZE - 1) As Byte
    End Type
    Type SIZE
            cx As Long
            cy As Long
    End Type
    Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
    Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
    Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
    Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
    Declare Function CloseMetaFile Lib "gdi32" (ByVal hMF As Long) As Long
    Declare Function CreateMetaFile Lib "gdi32" Alias "CreateMetaFileA" (ByVal lpString As String) As Long
    Declare Function DeleteMetaFile Lib "gdi32" (ByVal hMF As Long) As Long
    Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Declare Function PlayMetaFile Lib "gdi32" (ByVal hdc As Long, ByVal hMF As Long) As Long
    Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Declare Function SetMapMode Lib "gdi32" (ByVal hdc As Long, ByVal nMapMode As Long) As Long
    Declare Function SetViewportExtEx Lib "gdi32" (ByVal hdc As Long, ByVal nX As Long, ByVal nY As Long, lpSize As SIZE) As Long
    Declare Function SetWindowExtEx Lib "gdi32" (ByVal hdc As Long, ByVal nX As Long, ByPOSThttp://community.csdn.net/Expert/repng
    Option ExplicitPrivate Sub Command1_Click()
         Dim dc As Long, DCsize As SIZE, hMF As Long, font As LOGFONT, hFont As Long, oldfont As Long
         dc = CreateMetaFile(vbNullString)
         '用Windows API 的图形方法来画图 ,以下以输出文字为例
         RtlMoveMemory font.lfFaceName(0), ByVal CStr("新细明体"), LenB(StrConv("新细明体", vbFromUnicode)) + 1
         font.lfHeight = (8 * 20) / Screen.TwipsPerPixelY
         font.lfWidth = (5 * 20) / Screen.TwipsPerPixelY
         font.lfCharSet = DEFAULT_CHARSET
         hFont = CreateFontIndirect(font)
         oldfont = SelectObject(dc, hFont)
         TextOut dc, 0, 0, "VB实战网 http://fly.to/jaric", LenB(StrConv("VB实战网 http://fly.to/jaric", vbFromUnicode))
         hFont = SelectObject(dc, oldfont)
         DeleteObject hFont
         '将画好的向量图显示在picture1中
         hMF = CloseMetaFile(dc)
         Picture1.Cls
         PlayMetaFile Picture1.hdc, hMF
         '将picture1放大成picture3的大小,由于是点阵图的放大效果,因此有锯齿现象
         Picture3.Cls
         StretchBlt Picture3.hdc, 0, 0, Picture3.ScaleWidth, Picture3.ScaleHeight, Picture1.hdc, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, vbSrcCopy
         Picture2.Cls
         dc = Picture2.hdc
         '将画好的向量图放大成picture2的大小,由于是向量图的放大效果,因此没有锯齿现象
         SetMapMode dc, MM_ANISOTROPIC
         SetWindowExtEx dc, Picture1.ScaleWidth, Picture1.ScaleHeight, DCsize
         SetViewportExtEx dc, Picture2.ScaleWidth, Picture2.ScaleHeight, DCsize
         PlayMetaFile dc, hMF
         '释放向量图所占的记忆体
         DeleteMetaFile hMF
    End Sub
      

  2.   

    现在不是资料的问题
    是你对WINDOWS下图形处理的问题
    找点这方面的资料吧
    还有要是处理图形用vb效率会低
      

  3.   

    RtlMoveMemory是干什么用的?
    我查了一下,叫什么"复制内存"是什么意思?
      

  4.   

    兄弟,我拿你的代码试了试.好象有问题.
    如果不将autoredraw设为flase.则大小没有变化.也就是说没有放大
    如果设了,又不能自动重画.任何页面覆盖后,图形就看不到了.
    再一个我希望做到的是:将picture1的部分内容到picture2上放大.不知道该如何做?
      

  5.   

    巨大的图像就用Api做一块内存画布。CreatCompitableBitMap,会有返回值,申请失败,就再申请。可以设的很大。