当前位置:编程学习 > VB >>

vb 自适应分辨率 改变图片位置以及大小

 怎么让这段代码只改变位置 不改变image 大小??? 因为改了之后会失真

Private Type ctrObj
  Name As String
  Index As Long
  Parrent As String
  Top As Long
  Left As Long
  Height As Long
  Width As Long
  ScaleHeight As Long
  ScaleWidth As Long
End Type

Private FormRecord() As ctrObj
Private ControlRecord() As ctrObj
Private bRunning As Boolean
Private MaxForm As Long
Private MaxControl As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ReleaseCapture Lib "USER32" () As Long

Function ActualPos(plLeft As Long) As Long

  If plLeft < 0 Then
    ActualPos = plLeft + 75000

  Else
    ActualPos = plLeft
  End If

End Function

Function FindForm(pfrmIn As Form) As Long

  Dim i As Long
  FindForm = -1

  If MaxForm > 0 Then
    For i = 0 To (MaxForm - 1)
    If FormRecord(i).Name = pfrmIn.Name Then
        FindForm = i
        Exit Function
      End If
    Next i
  End If

End Function


Function AddForm(pfrmIn As Form) As Long

  Dim FormControl As Control
  Dim i As Long
  ReDim Preserve FormRecord(MaxForm + 1)

  FormRecord(MaxForm).Name = pfrmIn.Name
  FormRecord(MaxForm).Top = pfrmIn.Top
  FormRecord(MaxForm).Left = pfrmIn.Left
  FormRecord(MaxForm).Height = pfrmIn.Height
  FormRecord(MaxForm).Width = pfrmIn.Width
  FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight
  FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth
  AddForm = MaxForm
  MaxForm = MaxForm + 1

  For Each FormControl In pfrmIn
  
    i = FindControl(FormControl, pfrmIn.Name)
    If i < 0 Then
      i = AddControl(FormControl, pfrmIn.Name)
    End If
  Next FormControl

End Function

Function FindControl(inControl As Control, inName As String) As Long

  Dim i As Long
  FindControl = -1

  For i = 0 To (MaxControl - 1)
    If ControlRecord(i).Parrent = inName Then
      If ControlRecord(i).Name = inControl.Name Then
        On Error Resume Next
        If ControlRecord(i).Index = inControl.Index Then
          FindControl = i
          Exit Function
        End If
        On Error GoTo 0
      End If
    End If
  Next i
End Function

Function AddControl(inControl As Control, inName As String) As Long

  ReDim Preserve ControlRecord(MaxControl + 1)
  On Error Resume Next
  ControlRecord(MaxControl).Name = inControl.Name
  ControlRecord(MaxControl).Index = inControl.Index
  ControlRecord(MaxControl).Parrent = inName

  If TypeOf inControl Is Line Then
    ControlRecord(MaxControl).Top = inControl.Y1
    ControlRecord(MaxControl).Left = ActualPos(inControl.X1)
    ControlRecord(MaxControl).Height = inControl.Y2
    ControlRecord(MaxControl).Width = ActualPos(inControl.X2)
  Else
    ControlRecord(MaxControl).Top = inControl.Top
    ControlRecord(MaxControl).Left = ActualPos(inControl.Left)
    ControlRecord(MaxControl).Height = inControl.Height
    ControlRecord(MaxControl).Width = inControl.Width
  End If

  inControl.IntegralHeight = False
  On Error GoTo 0
  AddControl = MaxControl
  MaxControl = MaxControl + 1
End Function

Function PerWidth(pfrmIn As Form) As Long

  Dim i As Long
  i = FindForm(pfrmIn)

  If i < 0 Then
    i = AddForm(pfrmIn)
  End If

  PerWidth = (pfrmIn.ScaleWidth * 100) / FormRecord(i).ScaleWidth
End Function

Function PerHeight(pfrmIn As Form) As Double

  Dim i As Long
  i = FindForm(pfrmIn)

  If i < 0 Then
    i = AddForm(pfrmIn)
  End If
  
  PerHeight = (pfrmIn.ScaleHeight * 100) / FormRecord(i).ScaleHeight ''''
End Function

Public Sub ResizeControl(inControl As Control, pfrmIn As Form)

  On Error Resume Next
  Dim i As Long
  Dim widthfactor As Single, heightfactor As Single
  Dim minFactor As Single
  Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long
  yRatio = PerHeight(pfrmIn)
  xRatio = PerWidth(pfrmIn)
  i = FindControl(inControl, pfrmIn.Name)

  If inControl.Left < 0 Then
    lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
    lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
  Else
    lLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)
  End If

  lTop = CLng((ControlRecord(i).Top * yRatio) \ 100)
  lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)
  lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)
  If TypeOf inControl Is Line Then

    If inControl.X1 < 0 Then
      inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
    Else
      inControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100)
    End If

    inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)
    If inControl.X2 < 0 Then
   
      inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)
    Else
      inControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100)
    End If

    inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100)
  Else
    inControl.Move lLeft, lTop, lWidth, lHeight
    inControl.Move lLeft, lTop, lWidth
    inControl.Move lLeft, lTop
  End If

End Sub

Public Sub ResizeForm(pfrmIn As Form)

  Dim FormControl As Control
  Dim isVisible As Boolean
  Dim StartX, StartY, MaxX, MaxY As Long
  Dim bNew As Boolean

  If Not bRunning Then
    bRunning = True

    If FindForm(pfrmIn) < 0 Then
      bNew = True
    Else
      bNew = False
    End If
    If pfrmIn.Top < 30000 Then
      isVisible = pfrmIn.Visible
      On Error Resume Next
      If Not pfrmIn.MDIChild Then
        On Error GoTo 0
        ' ’ pfrmIn.Visible = False
      Else

        If bNew Then
          StartY = pfrmIn.Height
          StartX = pfrmIn.Width
          On Error Resume Next
          For Each FormControl In pfrmIn
            If FormControl.Left + FormControl.Width + 200 > MaxX Then
              MaxX = FormControl.Left + FormControl.Width + 200
            End If

            If FormControl.Top + FormControl.Height + 500 > MaxY Then
              MaxY = FormControl.Top + FormControl.Height + 500
            End If

            If FormControl.X1 + 200 > MaxX Then
              MaxX = FormControl.X1 + 200
            End If

            If FormControl.Y1 + 500 > MaxY Then
              MaxY = FormControl.Y1 + 500
            End If

            If FormControl.X2 + 200 > MaxX Then
              MaxX = FormControl.X2 + 200
            End If

            If FormControl.Y2 + 500 > MaxY Then
              MaxY = FormControl.Y2 + 500
            End If

          Next FormControl

          On Error GoTo 0
          pfrmIn.Height = MaxY
          pfrmIn.Width = MaxX
        End If

        On Error GoTo 0
      End If

      For Each FormControl In pfrmIn
        ResizeControl FormControl, pfrmIn
      Next FormControl

      On Error Resume Next

      If Not pfrmIn.MDIChild Then
        On Error GoTo 0
        pfrmIn.Visible = isVisible
      Else

        If bNew Then
        pfrmIn.Height = StartY
        pfrmIn.Width = StartX

        For Each FormControl In pfrmIn
          ResizeControl FormControl, pfrmIn
        Next FormControl

      End If
    End If
    On Error GoTo 0
  End If
  bRunning = False
End If

End Sub

Public Sub SaveFormPosition(pfrmIn As Form)

  Dim i As Long

  If MaxForm > 0 Then

    For i = 0 To (MaxForm - 1)

      If FormRecord(i).Name = pfrmIn.Name Then

        FormRecord(i).Top = pfrmIn.Top
        FormRecord(i).Left = pfrmIn.Left
        FormRecord(i).Height = pfrmIn.Height
        FormRecord(i).Width = pfrmIn.Width
        Exit Sub
      End If
    Next i

    AddForm (pfrmIn)
  End If
End Sub

Public Sub RestoreFormPosition(pfrmIn As Form)

  Dim i As Long
  If MaxForm > 0 Then
   
    For i = 0 To (MaxForm - 1)
      If FormRecord(i).Name = pfrmIn.Name Then
        If FormRecord(i).Top < 0 Then
          pfrmIn.WindowState = 2
        ElseIf FormRecord(i).Top < 30000 Then
          pfrmIn.WindowState = 0
          pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height
        Else
          pfrmIn.WindowState = 1
        End If
          Exit Sub
      End If
    Next i
  End If
End Sub

Public Sub Resize_ALL(Form_Name As Form)

  Dim OBJ As Object
  For Each OBJ In Form_Name
    ResizeControl OBJ, Form_Name
  Next OBJ
End Sub

Public Sub DragForm(frm As Form)

  On Local Error Resume Next
  Call ReleaseCapture
  Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)

End Sub


======================================================================================

Private Sub Form_Resize()
  Dim H, i As Integer
  On Error Resume Next
  Resize_ALL Me 'Me是窗体名,Form1,Form2等等都可以

End Sub

  谢谢 --------------------编程问答-------------------- 图片改变大小后丢失信息失真是正常的 --------------------编程问答--------------------
引用 1 楼 getemail 的回复:
图片改变大小后丢失信息失真是正常的

大胡子周末也在线呀 --------------------编程问答-------------------- 没有认真看代码,不过觉得可以说一下原理:
楼主用的代码估计是重画所有控件的代码,所有控件根据屏幕尺寸重新按比例确定大小,如果编程时与运行时屏幕尺寸比例不一样会造成变形。
有一种方法可以实现不变图形比例,方法是不使用以上的代码,自己编写代码,不过要规定自己的所有控件在屏幕上的相对位置,应该比较好实现。 --------------------编程问答-------------------- 楼主,别烦恼了,使用这个控件RESIZE32.OCX就解决了,只是之前老外写的,若有需要,我可以发给您。 --------------------编程问答-------------------- 借过,学习下。 --------------------编程问答-------------------- http://ishare.iask.sina.com.cn/f/9570436.html
这个?
引用 4 楼 cnuser1 的回复:
楼主,别烦恼了,使用这个控件RESIZE32.OCX就解决了,只是之前老外写的,若有需要,我可以发给您。
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,