Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Грамотно работаем с экранным разрешением Добавлено: 12.10.04 20:43  

Автор вопроса:  Unheilig | Web-сайт: www.tarjaturunen.narod.ru | ICQ: 336859855 
Этот вопрос на форуме поднимался неоднократно, но...

Значит так, мне нужно чтобы приложение определяло параметры дисплея, и если эти параметры не подходят, то появляется мсг бокс с вопросом, изменить разрешение(а также частоту,кол-во цветов) на требуемое программой.Это всё я сделал. При обратной смене(восстановление настроек пользователя), всегда теряется герцовка, она просто падает самым хамским способом до 60! А это совсем не нужно. Так вот кто это проблему решил успешно, прошу поделится решением в этом топике.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Unheilig



ICQ: 336859855 

Вопросов: 9
Ответов: 32
 Web-сайт: www.tarjaturunen.narod.ru
 Профиль | | #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 раз
в секунду обновлялся :)
Но если они не нужны, их ведь можно и не выводить?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам