用数码相机拍整个人的时候,一般都把相机竖起来拍,如果用picturebox.picture=LoadPicture()方法显示的时候,人是横着的,能不能控制,让它竖着显示?
解决方案 »
- 问一个超难问题:如何取得当前Clipboard上的内容的大小?
- 请问高手,使用microsoft office web componets 9.0做报表,没有预览?急!!!
- 怎麼去掉這個煩人的提示呀,只要它不提示就可以了~~
- 如何把在ActiveX组件中运算得到的结果传递回ASP文件中的变量?
- 如何快速从access导出一张表,存放在Excel中?
- 谁有算命的软件。。。加分分。。。
- 征求:动态创建控件的方法。
- 如何使用DCOM?
- KKKK,那里有MODEM的语音开发例子?
- vb中如何实现自动点击msgbox弹出对话框的确定或取消按钮源程序,请分析
- 我装的VB里面怎么没有ADO连接呀,请各位高手帮帮我,我都重装了好几次了,也换了几个不同的版本,总是看不到ADO连接
- VB6下,如何获得数据库某一个字段下面所有的数据
我给你找了一份,你研究一下吧
如果有一个图范围如下: P1+----------+ P2
| |
| |
| |
| |
| |
P3+----------+ P4
我们以P3为轴,顺时针转某个角度,如果是NT的使用者,可以使用PlgBlt()这个API来完
成,如果是Win95那就没办法了,这里也提供 VB5.0进阶程式开发指南所用的方法来完成
PlgBlt()的第二个叁数是重点,它是指向POINTAPI的一个3个元素之阵列,代表图形旋转
之後的三个端点,也就是说顺时针转了某个角度後,P1->P1' P2->P2' P3->P3',这阵
列便是存P1' P2' P3'。 所以了,重点在於这三个点的取得,数学不好的我可真痛苦;
如果这三个点没有设好,那会产生一个变形的图,原本 PlgBlt()便是用来扭曲图形用的
,只是那三个点如果设好的话,刚好可以来旋转图。PlgBlt(
HDC hdcDest, // handle of destination device context
CONST POINT * lpPoint, // vertices of destination parallelogram
HDC hdcSrc, // handle of source device context
int nXSrc, // x-coord. of upper-left corner of source rect.
int nYSrc, // y-coord. of upper-left corner of source rect.
int nWidth, // width of source rectangle
int nHeight, // height of source rectangle
HBITMAP hbmMask, // handle of bitmask
int xMask, // x-coord. of upper-left corner of bitmask rect.
int yMask // y-coord. of upper-left corner of bitmask
)需2个Command Button 2个PictureBox,目的在Picture2画出旋转图Option Explicit
Private Declare Function PlgBlt Lib "gdi32" (ByVal hdcDest As Long, _
lpPoint As POINTAPI, ByVal hdcSrc As Long, ByVal nXSrc As Long, _
ByVal nYSrc As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hbmMask As Long, ByVal xMask As Long, ByVal yMask As Long) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Const pi = 3.14159265358979
Dim dThetaDeg As Double
'以下只适用於NT
Private Sub Command1_Click()
Dim pt(1 To 3) As POINTAPI, p4 As POINTAPI
Dim dx As Long, dy As Long
Dim i As Long, offsetX As Long, offsetY As Long
Dim sida As Double
Dim MaxX As Long, MaxY As Long, MinX As Long, MinY As Longsida = dThetaDeg * pi / 180
dx = Me.ScaleX(Picture1.Picture.Width, vbHimetric, vbPixels)
dy = Me.ScaleX(Picture1.Picture.Height, vbHimetric, vbPixels)
pt(1).x = dy * Sin(sida)
pt(1).y = dy - dy * Cos(sida)
pt(2).x = pt(1).x + dx * Cos(sida)
pt(2).y = pt(1).y + dx * Sin(sida)
pt(3).x = 0: pt(3).y = dy'p4不用在pt()之阵列,它是由pt(1)-pt(3)所推出
p4.x = pt(3).x + dx * Cos(sida)
p4.y = pt(3).y + dx * Sin(sida)'以下的工作只是为了让旋转後的图在Picture2的中间显示
MaxX = IIf(pt(1).x > pt(2).x, pt(1).x, pt(2).x)
MaxX = IIf(MaxX > pt(3).x, MaxX, pt(3).x)
MaxX = IIf(MaxX > p4.x, MaxX, p4.x)
MinX = IIf(pt(1).x < pt(2).x, pt(1).x, pt(2).x)
MinX = IIf(MinX < pt(3).x, MinX, pt(3).x)
MinX = IIf(MinX < p4.x, MinX, p4.x)MaxY = IIf(pt(1).y > pt(2).y, pt(1).y, pt(2).y)
MaxY = IIf(MaxY > pt(3).y, MaxY, pt(3).y)
MaxY = IIf(MaxY > p4.y, MaxY, p4.y)
MinY = IIf(pt(1).y < pt(2).y, pt(1).y, pt(2).y)
MinY = IIf(MinY < pt(3).y, MinY, pt(3).y)
MinY = IIf(MinY < p4.y, MinY, p4.y)
offsetX = (Picture2.ScaleWidth - MaxX + MinX) \ 2 - MinX
offsetY = (Picture2.ScaleHeight - (MaxY - MinY)) \ 2 - MinY
pt(1).x = pt(1).x + offsetX: pt(1).y = pt(1).y + offsetY
pt(2).x = pt(2).x + offsetX: pt(2).y = pt(2).y + offsetY
pt(3).x = pt(3).x + offsetX: pt(3).y = pt(3).y + offsetYi = PlgBlt(Picture2.hDC, pt(1), Picture1.hDC, 0, 0, dx, dy, 0, 0, 0)
End Sub'这个方式不管95/NT都可行,来自vb5程式设计进阶指南一书,但速度慢
Private Sub Command2_Click()
Dim nX As Integer, nY As Integer
Dim nX1 As Integer, nY1 As Integer
Dim dX2 As Double, dY2 As Double
Dim dX3 As Double, dY3 As Double Dim dThetaRad As Double 'Compute angle in radians
dThetaRad = -dThetaDeg * pi / 180
'Set scale modes to pixels
For nX = 0 To Picture2.ScaleWidth
nX1 = nX - Picture2.ScaleWidth \ 2
For nY = 0 To Picture2.ScaleHeight
nY1 = nY - Picture2.ScaleHeight \ 2
'Rotate picture by dThetaRad
dX2 = nX1 * Cos(-dThetaRad) + nY1 * Sin(-dThetaRad)
dY2 = nY1 * Cos(-dThetaRad) - nX1 * Sin(-dThetaRad)
'Translate to center of picture box
dX3 = dX2 + Picture1.ScaleWidth \ 2
dY3 = dY2 + Picture1.ScaleHeight \ 2
'If data point is in picOne, set its color in picTwo
If dX3 > 0 And dX3 < Picture1.ScaleWidth - 1 _
And dY3 > 0 And dY3 < Picture1.ScaleHeight - 1 Then
Picture2.PSet (nX, nY), Picture1.Point(dX3, dY3)
End If
Next nY
Next nX
End SubPrivate Sub Form_Load()
Picture1.ScaleMode = 3
Picture2.ScaleMode = 3
'设定旋转角度
dThetaDeg = 30
Set Picture1.Picture = LoadPicture("D:\chinavb.net\test.bmp")End Sub
PaintPicture只能翻转图片,而不是旋转图片
Public Function Rotate90() As Boolean
If mhDib = 0 Then Exit Function
Dim OldData() As Long
Dim MapArr() As Long
Dim i As Long, MaxI As Long
Dim j As Long, MaxJ As Long
Dim Width As Long
Dim Height As Long
Dim SA As SAFEARRAY2D, OldPtr As Long
If mhDC = 0 Then Exit Function
If Me.ColorBit = 32 Then
Width = mBmpInfoHeader.biWidth - 1
Height = mBmpInfoHeader.biHeight - 1
ReDim OldData(0 To Width, 0 To Height) As Long
CopyMemory OldData(0, 0), ByVal mPtr, mBmpInfoHeader.biSizeImage
If mBmpInfoHeader.biWidth <> mBmpInfoHeader.biHeight Then
Me.Create mBmpInfoHeader.biHeight, mBmpInfoHeader.biWidth, 32
If Me.hDC = 0 Then Exit Function
End If
OldPtr = MapArray2D(VarPtrArray(MapArr), SA)
For i = 0 To Height
For j = 0 To Width
MapArr(i, j) = OldData(j, Height - i)
Next j
Next i
UnMapArray VarPtrArray(MapArr), OldPtr
End If
Rotate90 = True
End Function其实就是这句 MapArr(i, j) = OldData(j, Height - i)
是关键
速度要比 plgblt快一半左右!