在进行平移操作前,将代码恢复到最早的状态。切记,在代码编写过程中,对于不用的代码,最好使用注释而不是删除。虽然这样可能增加代码的阅读难度,但便于回溯。
接下来进行平移操作。平移操作的逻辑是,按下鼠标可获得当前鼠标的指针位置;在移动鼠标的过程中,可不断地获得鼠标指针的位置;减去鼠标移动的差量,即获得移动数据;松开鼠标后,平移操作停止。
首先,需要定义鼠标操作的变量:
Public PICT_OLD_X As Integer, PICT_OLD_Y As Integer Public LEFT_MOUSE_DOWN As Boolean, MIDDLE_MOUSE_DOWN As Boolean Public mQuadX As GLfloat, mQuadY As GLfloat
然后,在窗体布置中双击工作区WorkPic控件,进入代码编辑区,添加下列代码:
Private Sub WorkPic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then LEFT_MOUSE_DOWN = True OGL.PICT_OLD_X = X OGL.PICT_OLD_Y = Y End If End Sub Private Sub WorkPic_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If LEFT_MOUSE_DOWN = True Then mQuadX = (X - OGL.PICT_OLD_X)/ Me.WorkPic.ScaleWidth mQuadY = (OGL.PICT_OLD_Y - Y)/ Me.WorkPic.ScaleHeight Call OGL.Display(Me.WorkPic) End If End Sub Private Sub WorkPic_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then LEFT_MOUSE_DOWN = False End If End Sub
注意,mQuadY =(OGL.PICT_OLD_Y - Y)/ Me.WorkPic.ScaleHeight。在OpenGL的坐标系中,左下角为(0,0);而在窗体坐标系中,(0,0)是位于左上角。此外,之前将坐标范围定义为(0,0)到(1,1),相应地,鼠标在PictureBox中的位置需要进行转换,并进行归一化,以将窗体坐标与OpenGL坐标对应起来。
最后,在Display函数中,在设置绘图坐标系后添加以下代码:
glMatrixMode mmProjection glLoadIdentity GLU.gluOrtho2D 0, 1, 0, 1 GL.glTranslatef mQuadX, mQuadY, mQuadZ
平移运行结果如图3-19所示。
图3-19 平移运行结果
以上代码实现了单次平移。但是,在下次平移的时候,mQuadX和mQuadY初始值为0,即再次回到初始位置。如何在下次单击的时候保留上次停留的位置?我们可以在鼠标MouseDown事件中添加以下代码:
Private Sub WorkPic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then LEFT_MOUSE_DOWN = True OGL.PICT_OLD_X = X - mQuadX * Me.WorkPic.ScaleWidth OGL.PICT_OLD_Y = Y + mQuadY * Me.WorkPic.ScaleHeight End If End Sub
以上代码存在一个逻辑缺漏:在当前绘制三角形时,三角形的移动位置属于三角形,而不是其他图元,比如四边形、多边形。因此,在绘制其他图元的时候,需要对mQuadX和mQuadY进行一次初始化。在命令按钮下修改代码:
Private Sub QuadsCmd_Click() mQuadX = 0 mQuadY = 0 OGL.ShapeType = 4 Call OGL.Display(Me.WorkPic) End Sub
以上是四边形的修改代码,其他图元以此类推。