关于VB用API改变分辨率问题?

jhtzz 2004-09-17 12:55:15
关于VB用API改变分辨率问题,改I改变分辨率问题倒是没有问题,问题是在XP中只要改变的话刷新率就跟着改成默认的60MHZ了,请问题用API能不能实现更变分辨率的同时也能更改刷新率呀?
...全文
68 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
junki 2004-09-18
  • 打赏
  • 举报
回复
引用:rainstormmaster大哥的,怎样求某一屏幕分辨率下的最大刷新率?


Private Const DM_DISPLAYFREQUENCY = &H400000
并将DEVMODE的dmFields指定为:
DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL Or DM_DISPLAYFREQUENCY
下面是修改后的程序:
Option Explicit

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As DEVMODE) As Long
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As DEVMODE, ByVal dwFlags As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Const DM_BITSPERPEL = &H40000
Private Const DM_PELSWIDTH = &H80000
Private Const DM_PELSHEIGHT = &H100000
Private Const DM_DISPLAYFREQUENCY = &H400000

Private Const CDS_UPDATEREGISTRY = &H1
Private Const CDS_TEST = &H4
Private Const DISP_CHANGE_SUCCESSFUL = 0
Private Const DISP_CHANGE_RESTART = 1
Private Const ENUM_CURRENT_SETTINGS = -1
Private Const ENUM_REGISTRY_SETTINGS = -2

Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type

' Return the caption for this device mode information.
Private Function DevModeCaption(dev_mode As DEVMODE) As String
DevModeCaption = _
Format$(dev_mode.dmPelsWidth) & " x " & _
Format$(dev_mode.dmPelsHeight) & " (" & _
Format$(dev_mode.dmBitsPerPel) & ") " & _
", Freq: " & _
Format$(dev_mode.dmDisplayFrequency) & _
" Flags: " & _
Format$(dev_mode.dmDisplayFlags)
End Function
' Select the indicated mode.
Private Sub cmdSetMode_Click()
Dim dev_mode As DEVMODE
Dim mode_num As Long

' Refetch information about this mode.
mode_num = cboMode.ItemData(cboMode.ListIndex)
If EnumDisplaySettings(ByVal vbNullString, _
mode_num, dev_mode) = 0 _
Then
MsgBox "Error refetching mode data."
Exit Sub
End If

' Confirm.
If MsgBox("Do you want to select the mode " & _
DevModeCaption(dev_mode), vbYesNo) = vbNo _
Then Exit Sub

' Select the mode.
dev_mode.dmFields = _
DM_PELSWIDTH Or _
DM_PELSHEIGHT Or _
DM_BITSPERPEL Or _
DM_DISPLAYFREQUENCY

dev_mode.dmSize = Len(dev_mode)
dev_mode.dmDriverExtra = 0

' Test the change.
Select Case ChangeDisplaySettings(dev_mode, CDS_TEST)
Case DISP_CHANGE_RESTART
If MsgBox("The system must reboot to make this change. Do you want to reboot?", _
vbYesNo) = vbYes _
Then
If ChangeDisplaySettings(dev_mode, CDS_UPDATEREGISTRY) _
<> DISP_CHANGE_SUCCESSFUL _
Then
MsgBox "Error setting the new mode."
Else
ExitWindowsEx EWX_REBOOT, 0
End If
End If

Case DISP_CHANGE_SUCCESSFUL
If ChangeDisplaySettings(dev_mode, CDS_UPDATEREGISTRY) _
= DISP_CHANGE_SUCCESSFUL _
Then
MsgBox "Mode changed."
Else
MsgBox "Error setting the new mode."
End If
Case Else
MsgBox "Error setting the new mode."
End Select
End Sub
' Load the available device modes.
Private Sub Form_Load()
cmdSetMode.Caption = "设置显示模式"
Dim dev_mode As DEVMODE
Dim mode_num As Long

' Get the available modes.
mode_num = 0
Do
' Stop when the function fails.
If EnumDisplaySettings(ByVal vbNullString, _
mode_num, dev_mode) = 0 _
Then Exit Do

' Add this choice to the ComboBox.
cboMode.AddItem DevModeCaption(dev_mode)
cboMode.ItemData(cboMode.NewIndex) = mode_num

mode_num = mode_num + 1
Loop

' Make sure we got some modes.
If mode_num = 0 Then
MsgBox "EnumDisplaySettings returned no display modes."
Exit Sub
End If

' Get the current mode.
If EnumDisplaySettings(ByVal vbNullString, _
ENUM_CURRENT_SETTINGS, dev_mode) = 0 _
Then
MsgBox "Unable to get the current mode."
Exit Sub
End If

' Select the current mode.
cboMode.Text = DevModeCaption(dev_mode)
End Sub
leolan 2004-09-17
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/2705/2705267.xml?temp=.8693964

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧