Страница: 1 |
Страница: 1 |
Вопрос: Грамотно работаем с экранным разрешением
Добавлено: 12.10.04 20:43
Автор вопроса: Unheilig | Web-сайт:
Этот вопрос на форуме поднимался неоднократно, но...
Значит так, мне нужно чтобы приложение определяло параметры дисплея, и если эти параметры не подходят, то появляется мсг бокс с вопросом, изменить разрешение(а также частоту,кол-во цветов) на требуемое программой.Это всё я сделал. При обратной смене(восстановление настроек пользователя), всегда теряется герцовка, она просто падает самым хамским способом до 60! А это совсем не нужно. Так вот кто это проблему решил успешно, прошу поделится решением в этом топике.
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
Unheilig
ICQ: 336859855
Вопросов: 9
Ответов: 32
Web-сайт:
Профиль | | #1
Добавлено: 12.10.04 20:44
И ещё, система Windows XP Pro, а не 98.
Номер ответа: 2
Автор ответа:
Piton_4m
Вопросов: 10
Ответов: 26
Профиль | | #2
Добавлено: 13.10.04 06:53
Не знаю точьно, но помоему в реестре есть ключь отвечающий за частоту,,, там же можно и поменять разрешение вплоть до 400x200, но новые параметры только после перезагрузки,,,
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 13.10.04 09:24
У меня все работает нормально. Возьми пример из API-Guide
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 13.10.04 09:29
Увы, исходников своей проги не нашел, могу только откомпилиную скинуть, что в общем бесполезно.
Могу только сказать что я делал через EnumDisplaySettings и ChangeDisplaySettings. И разрешение и частота меняются без перезагрузки.
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 13.10.04 09:44
Хотя бы вот так... Закинь на форму листбокс и по двойному клику тестируй разрешения
Option Explicit
Const WM_DISPLAYCHANGE = &H7E
Const HWND_BROADCAST = &HFFFF&
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const DM_BITSPERPEL = &H40000
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
Const DISP_CHANGE_SUCCESSFUL = 0
Const DISP_CHANGE_RESTART = 1
Const BITSPIXEL = 12
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
Dim DevModes() As DEVMODE
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Sub Form_Load()
Dim Index As Long
Dim Res As Long
Dim DM As DEVMODE
Do
Res = EnumDisplaySettings(0, Index, DM)
If Res = 0 Then Exit Do
ReDim Preserve DevModes(Index)
List1.AddItem DM.dmPelsWidth & "x" & DM.dmPelsHeight & "x" & DM.dmBitsPerPel & " bits " & DM.dmDisplayFrequency & " Hz"
DevModes(Index) = DM
Index = Index + 1
Loop
End Sub
Private Sub List1_DblClick()
ChangeDisplaySettings DevModes(List1.ListIndex), CDS_TEST
End Sub
Номер ответа: 6
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #6
Добавлено: 13.10.04 14:26
Выставлю примерчик который уже выставляли на форуме (но, увы, я не помню
кто)
Надо Text1, List1
(При закрытии проги разрешения возвращается само)
Все в форме:
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 Long, ByVal iModeNum As
Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias
"ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long
Const CCDEVICENAME = 32
Const CCFORMNAME = 32
Const CDS_UPDATEREGISTRY = &H1
Const CDS_TEST = &H4
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
Dim DM() As DEVMODE
Private Sub Combo1_Click()
End Sub
Private Sub Form_Load()
Dim DD As DISPLAY_DEVICE
Dim Ret As Long
DD.cb = Len(DD)
Ret = EnumDisplayDevices(ByVal 0&, 0, DD, 0&
Text1.Text = DD.DeviceString
Dim Index As Long
Do
ReDim Preserve DM(Index)
DM(Index).dmSize = Len(DM(Index))
Ret = EnumDisplaySettings(0&, Index, DM(Index))
If Ret = 0 Then Exit Do
List1.AddItem DM(Index).dmPelsWidth & "x" & DM(Index).dmPelsHeight & "x" &
DM(Index).dmDisplayFrequency & "Hz" & " " & DM(Index).dmBitsPerPel & " bits"
Index = Index + 1
Loop
End Sub
Private Sub List1_DblClick()
ChangeDisplaySettings DM(List1.ListIndex), CDS_TEST
End Sub
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 13.10.04 14:54
Ага, кажись это и есть мой потерянный исходник )
Только принципиального отличия от того что я по памяти накидал выше нету, разве что название видеокарты показывает
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 13.10.04 15:03
Ага, точно,
http://vbnet.ru/forum/show.aspx?id=54238
я тогда задавал вопрос по поводу двух паразитных режимов в конце списка. Ответа так и не получил
Номер ответа: 9
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #9
Добавлено: 13.10.04 21:02
Ну вот, и автор нашелся
Допишу обязательно в комментах
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 14.10.04 08:42
ZagZag, у тебя тоже эти два псевдорежима показываются, с частотой 1 Гц ? Лажа какая-то, откуда они?
Номер ответа: 11
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #11
Добавлено: 14.10.04 11:34
Показываются
Откуда? А я почем знаю? Но если бы там действительно 1Гц был... экран 1 раз
в секунду обновлялся
Но если они не нужны, их ведь можно и не выводить?