● 선언
Function ChangeDisplaySettings Lib "User32" Alias "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
● 인수
lpDevMode

dwflags

다은은 소스의 폼 이미지이다.
바꾸고 싶은 해상도 모드에서 더블 클릭하면 지정행의 해상도 모드로 변경된다
원래대로 버튼은 초기 이미지로 변경한다
다음은 소스이다
Option Explicit
Private Declare Function EnumDisplayDevices Lib "user32" Alias "EnumDisplayDevicesA" (Unused As Any, ByVal iDevNum As Long, lpDisplayDevice As DISPLAY_DEVICE, ByVal dwFlags As Long) As Boolean
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As DEVMODE) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Const CCDEVICENAME = 32
Private Const CCFORMNAME = 32
Private Const ENUM_CURRENT_SETTINGS = -1
Private Const DISPLAY_DEVICE_ACTIVE As Long = &H1
Private Type DISPLAY_DEVICE
cb As Long
DeviceName As String * 32
DeviceString As String * 128
StateFlags As Long
DeviceID As String * 128
DeviceKey As String * 128
End Type
Private Type DEVMODE
dmDeviceName As String * CCDEVICENAME
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 * CCFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Private DisplayDeviceInfo As DISPLAY_DEVICE ' 디스플레이 다바이스 정보 구조체
Private CurrentDisplayInfo As DEVMODE ' 초기 디스플레이 설정 정보 구조체
Private Sub Command1_Click() ' 원래대로
ChangeDisplaySettings CurrentDisplayInfo, 0
End Sub
Private Sub Form_Load()
Dim DisplayInfo As DEVMODE ' 디스플레이 설정 정보 구조체
Dim DNum As Long ' 디바이스 인덱스 번호, 디스플레이 모드 인덱스 번호
Dim Ret As Long ' 반환값
Me.AutoRedraw = True
mfgMode.SelectionMode = flexSelectionByRow
Ret = -1 ' 활성중인 디스플레이 장치의 정보를 얻는다.
DNum = 0
DisplayDeviceInfo.cb = Len(DisplayDeviceInfo)
Do
If Not Ret = -1 Then
If (DisplayDeviceInfo.StateFlags And DISPLAY_DEVICE_ACTIVE) = DISPLAY_DEVICE_ACTIVE Then
Exit Do
End If
DNum = DNum + 1
End If
DisplayDeviceInfo.cb = Len(DisplayDeviceInfo)
Ret = EnumDisplayDevices(ByVal 0&, DNum, DisplayDeviceInfo, ByVal 0&)
Loop While Not Ret = 0
Ret = -1 ' 활성중인 디스플레이 장치에 대한 디스플레이 모드를 구한다.
DNum = 0
With mfgMode
.Rows = 2
.Cols = 5
.FixedCols = 0
.FixedRows = 1
.Row = 0
.Col = 0
.FixedAlignment(.Col) = flexAlignCenterCenter
.ColAlignment(.Col) = flexAlignCenterCenter
.Text = "모드 인덱스 번호"
.ColWidth(.Col) = Me.TextWidth(.Text) + 100
.Col = 1
.FixedAlignment(.Col) = flexAlignCenterCenter
.ColAlignment(.Col) = flexAlignCenterCenter
.Text = "수평 해상도"
.ColWidth(.Col) = Me.TextWidth(.Text) + 100
.Col = 2
.FixedAlignment(.Col) = flexAlignCenterCenter
.ColAlignment(.Col) = flexAlignCenterCenter
.Text = "수직 해상도"
.ColWidth(.Col) = Me.TextWidth(.Text) + 100
.Col = 3
.FixedAlignment(.Col) = flexAlignCenterCenter
.ColAlignment(.Col) = flexAlignCenterCenter
.Text = "색상 비트수"
.ColWidth(.Col) = Me.TextWidth(.Text) + 100
.Col = 4
.FixedAlignment(.Col) = flexAlignCenterCenter
.ColAlignment(.Col) = flexAlignCenterCenter
.Text = "모니터 재생율"
.ColWidth(.Col) = Me.TextWidth(.Text) + 100
Do
If Not Ret = -1 Then
.Rows = DNum + 2
.Row = .Rows - 1
.Col = 0
.Text = DNum
.Col = 1
.Text = Format(DisplayInfo.dmPelsWidth, "@@@@")
.Col = 2
.Text = Format(DisplayInfo.dmPelsHeight, "@@@@")
.Col = 3
.Text = DisplayInfo.dmBitsPerPel
.Col = 4
.Text = DisplayInfo.dmDisplayFrequency & "Hz"
DNum = DNum + 1
End If
Ret = EnumDisplaySettings(DisplayDeviceInfo.DeviceName, DNum, DisplayInfo)
Loop While Not Ret = 0
Ret = EnumDisplaySettings(DisplayDeviceInfo.DeviceName, ENUM_CURRENT_SETTINGS, CurrentDisplayInfo)
End With
End Sub
Private Function GetVBStringFromAPIString(ByVal Str As String) As String ' API에서 사용한 문자열이 담겨있는 버퍼에 유용한 문자열만 취한다.
GetVBStringFromAPIString = Left$(Str, InStr(1, Str, vbNullChar) - 1)
End Function
Private Sub mfgMode_DblClick() ' 디스플레이 설정 변경
Dim DisplayInfo As DEVMODE ' 디스플레이 설정 정보 구조체
Dim Ret As Long
With mfgMode
If Not .RowSel = .FixedRows - 1 Then ' 고정 행이 아닐때
.Col = 0
Ret = EnumDisplaySettings(DisplayDeviceInfo.DeviceName, CLng(.Text), DisplayInfo)
Debug.Print DisplayInfo.dmPelsWidth, DisplayInfo.dmPelsHeight, DisplayInfo.dmBitsPerPel, DisplayInfo.dmDisplayFrequency
ChangeDisplaySettings DisplayInfo, 0
End If
End With
End Sub
'API' 카테고리의 다른 글
CreateCompatibleBitmap을 사용한 메모리를 이용한 이미지 복사 (0) | 2011.09.30 |
---|---|
CreateCompatibleDC를 사용한 이미지의 DC를 생성하자. (0) | 2011.09.30 |
EnumDisplaySettings을 사용한 현재 디스플레이애 대한 모든 모드 정보 얻기 (0) | 2011.09.29 |
EnumDisplayDevices를 사용한 디스플레 장치 정보 얻기 (0) | 2011.09.28 |
WM_MOUSEWHEEL 윈도우 메세지를 사용한 휠 버튼 사용 (0) | 2011.09.26 |