我做一个将picturebox里的图形(也是用程序画的)放大的程序.我希望做成autoCAD那样的效果
我只用了一个picturebox,也就是说用paintpicture方法是不是不行?paintpicture是不是用于放大,但要求原图形和目的图形不是同一个picturebox?
所以我的做法是:
放大就是将picturebox的width,height放大.然后重新画图.
我设置了一个最大放大倍数,结果,有时候能运行,有时候会出错.
出错地点:Picx.Scale (xmin, ymax)-(xmax, ymin)
错误原因:不能创建 AutoRedraw 图象(错误 480)
后来根据帮助我一查,发现是内存消耗太大的时候,就出错.
各位高手,我该怎么解决这个问题?
我只用了一个picturebox,也就是说用paintpicture方法是不是不行?paintpicture是不是用于放大,但要求原图形和目的图形不是同一个picturebox?
所以我的做法是:
放大就是将picturebox的width,height放大.然后重新画图.
我设置了一个最大放大倍数,结果,有时候能运行,有时候会出错.
出错地点:Picx.Scale (xmin, ymax)-(xmax, ymin)
错误原因:不能创建 AutoRedraw 图象(错误 480)
后来根据帮助我一查,发现是内存消耗太大的时候,就出错.
各位高手,我该怎么解决这个问题?
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
是你对WINDOWS下图形处理的问题
找点这方面的资料吧
还有要是处理图形用vb效率会低
我查了一下,叫什么"复制内存"是什么意思?
如果不将autoredraw设为flase.则大小没有变化.也就是说没有放大
如果设了,又不能自动重画.任何页面覆盖后,图形就看不到了.
再一个我希望做到的是:将picture1的部分内容到picture2上放大.不知道该如何做?