Forms 在ms access中创建独立于分辨率的表单

Forms 在ms access中创建独立于分辨率的表单,forms,vba,ms-access,ms-access-2010,Forms,Vba,Ms Access,Ms Access 2010,我已经在1280*1024结果中设计了我的表单。它们在我的显示器上看起来很好,但如果我在另一个显示器上看到,它们看起来非常混乱。有什么办法可以解决这个问题吗?不太容易。这就是MVC非常方便的地方,您可以区分不同的组件。对于不同的设备,您可以有不同的视图。不幸的是VBA不支持这一点,您必须实现自己的框架来处理不同的屏幕分辨率 避免重新实现用户表单设计的最简单方法是在编写一行代码之前在头脑中进行设计。想想你的软件将支持的不同分辨率(设备),你使用的语言支持的是什么,你的选择是什么。一般来说,仔细考虑

我已经在1280*1024结果中设计了我的表单。它们在我的显示器上看起来很好,但如果我在另一个显示器上看到,它们看起来非常混乱。有什么办法可以解决这个问题吗?

不太容易。这就是MVC非常方便的地方,您可以区分不同的组件。对于不同的设备,您可以有不同的视图。不幸的是VBA不支持这一点,您必须实现自己的框架来处理不同的屏幕分辨率

避免重新实现用户表单设计的最简单方法是在编写一行代码之前在头脑中进行设计。想想你的软件将支持的不同分辨率(设备),你使用的语言支持的是什么,你的选择是什么。一般来说,仔细考虑一下。在VBA中,我通常只选择默认大小,以避免安装其他人屏幕的麻烦

您必须重新设计整个用户表单。不是直观地设置,而是通过编程设置userform的宽度和高度,使控件在当前分辨率下可靠。我不建议这样做,但这仍然是一个解决方案

您可以通过访问当前分辨率并修改
Userform\u Initialize()
事件来实现这一点

例如,如果当前分辨率为1024x768,则将
宽度
高度
设置为
currentWidth-100px
currentHeight-100px

如果打开新工作簿并创建空的userform。转到其代码隐藏并添加

Private Sub UserForm_Initialize()

    Me.Width = GetCurrent(0) - 600
    Me.Height = GetCurrent(1) - 800

End Sub
然后插入一个模块并添加

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long

Sub A()

    UserForm1.Show
    Unload UserForm1

End Sub

Function GetCurrent(x As Long) As Long
    GetCurrent = GetSystemMetrics(x)
End Function
这将根据当前分辨率显示不同大小的userform

你可以(但我不推荐)使用这种技术。注意:根据你有多少控件,这可能是最好的方法,但是如果你在userform上有很多控件,我会寻找一个替代方法


或者,您可以使用下面的代码检查当前屏幕分辨率,警告用户并询问用户是否要更改其分辨率

下面的代码来自,原始作者是

将工作簿中的第一部分代码粘贴到后面

Option Explicit 

Private Sub Workbook_Open() 

    Call VerifyScreenResolution 

End Sub 
以及模块中的以下部分

Option Explicit 

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long 
Const SM_CXSCREEN = 0 
Const SM_CYSCREEN = 1 

Sub VerifyScreenResolution(Optional Dummy As Integer) 

    Dim x  As Long 
    Dim y  As Long 
    Dim MyMessage As String 
    Dim MyResponse As VbMsgBoxResult 

    x = GetSystemMetrics(SM_CXSCREEN) 
    y = GetSystemMetrics(SM_CYSCREEN) 
    If x = 1024 And y = 768 Then 
    Else 
        MyMessage = "Your current screen resolution is " & x & " X " & y & vbCrLf & "This program " & _ 
        "was designed to run with a screen resolution of 1024 X 768 and may not function properly " & _ 
        "with your current settings." & vbCrLf & "Would you like to change your screen resolution?" 
        MyResponse = MsgBox(MyMessage, vbExclamation + vbYesNo, "Screen Resolution") 
    End If 
    If MyResponse = vbYes Then 
        Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3") 
    End If 

End Sub 
更新

您的初始化事件在这里


这并不容易。这就是MVC非常方便的地方,您可以区分不同的组件。对于不同的设备,您可以有不同的视图。不幸的是VBA不支持这一点,您必须实现自己的框架来处理不同的屏幕分辨率

避免重新实现用户表单设计的最简单方法是在编写一行代码之前在头脑中进行设计。想想你的软件将支持的不同分辨率(设备),你使用的语言支持的是什么,你的选择是什么。一般来说,仔细考虑一下。在VBA中,我通常只选择默认大小,以避免安装其他人屏幕的麻烦

您必须重新设计整个用户表单。不是直观地设置,而是通过编程设置userform的宽度和高度,使控件在当前分辨率下可靠。我不建议这样做,但这仍然是一个解决方案

您可以通过访问当前分辨率并修改
Userform\u Initialize()
事件来实现这一点

例如,如果当前分辨率为1024x768,则将
宽度
高度
设置为
currentWidth-100px
currentHeight-100px

如果打开新工作簿并创建空的userform。转到其代码隐藏并添加

Private Sub UserForm_Initialize()

    Me.Width = GetCurrent(0) - 600
    Me.Height = GetCurrent(1) - 800

End Sub
然后插入一个模块并添加

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long

Sub A()

    UserForm1.Show
    Unload UserForm1

End Sub

Function GetCurrent(x As Long) As Long
    GetCurrent = GetSystemMetrics(x)
End Function
这将根据当前分辨率显示不同大小的userform

你可以(但我不推荐)使用这种技术。注意:根据你有多少控件,这可能是最好的方法,但是如果你在userform上有很多控件,我会寻找一个替代方法


或者,您可以使用下面的代码检查当前屏幕分辨率,警告用户并询问用户是否要更改其分辨率

下面的代码来自,原始作者是

将工作簿中的第一部分代码粘贴到后面

Option Explicit 

Private Sub Workbook_Open() 

    Call VerifyScreenResolution 

End Sub 
以及模块中的以下部分

Option Explicit 

Private Declare Function GetSystemMetrics Lib "user32.dll" (ByVal nIndex As Long) As Long 
Const SM_CXSCREEN = 0 
Const SM_CYSCREEN = 1 

Sub VerifyScreenResolution(Optional Dummy As Integer) 

    Dim x  As Long 
    Dim y  As Long 
    Dim MyMessage As String 
    Dim MyResponse As VbMsgBoxResult 

    x = GetSystemMetrics(SM_CXSCREEN) 
    y = GetSystemMetrics(SM_CYSCREEN) 
    If x = 1024 And y = 768 Then 
    Else 
        MyMessage = "Your current screen resolution is " & x & " X " & y & vbCrLf & "This program " & _ 
        "was designed to run with a screen resolution of 1024 X 768 and may not function properly " & _ 
        "with your current settings." & vbCrLf & "Would you like to change your screen resolution?" 
        MyResponse = MsgBox(MyMessage, vbExclamation + vbYesNo, "Screen Resolution") 
    End If 
    If MyResponse = vbYes Then 
        Call Shell("rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3") 
    End If 

End Sub 
更新

您的初始化事件在这里


谢谢你的回答。只有一件事。我看不到表单的初始化事件?这是一个事件还是别的什么?@Kaja我添加了一个截图。右键单击userform1并选择查看代码,然后在代码窗口顶部有两个下拉列表。选择UserForm,然后在右侧初始化为“确定您的答案”,我正在使用MS Access,但未找到此事件:/@Kaja我认为您可以在Word或Excel中创建一个UserForm,并将其保存在光盘上,然后从Access导入文件谢谢您的回答。只有一件事。我看不到表单的初始化事件?这是一个事件还是别的什么?@Kaja我添加了一个截图。右键单击userform1并选择查看代码,然后在代码窗口顶部有两个下拉列表。选择UserForm,然后在右侧初始化为OK you作为答案,我正在使用MS Access,我找不到此事件:/@Kaja我认为您可以在Word或Excel中创建一个UserForm,并将其保存在光盘上,然后从Access导入文件