Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Näyttöasetusten vaihto

Sivun loppuun

ErroR++ [28.03.2012 18:35:45]

#

Moi!

Tästä onkin monet puhunut jo, mutta en ole löytänyt sopivia vastauksia edes Googlella.

Miten siis vaihdetaan resoluutio ja näyttötila + muita näytön asetuksia WinAPIlla?
Olen yrittänyt seuraavaa koodia:

 Public Structure DEVMODE
        <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Dim dmDeviceName As String
        Dim dmSpecVersion As Short
        Dim dmDriverVersion As Short
        Dim dmSize As Short
        Dim dmDriverExtra As Short
        Dim dmFields As Integer
        Dim dmOrientation As Short
        Dim dmPaperSize As Short
        Dim dmPaperLength As Short
        Dim dmPaperWidth As Short
        Dim dmScale As Short
        Dim dmCopies As Short
        Dim dmDefaultSource As Short
        Dim dmPrintQuality As Short
        Dim dmColor As Short
        Dim dmDuplex As Short
        Dim dmYResolution As Short
        Dim dmTTOption As Short
        Dim dmCollate As Short
        <System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst:=32)> Dim dmFormName As String
        Dim dmUnusedPadding As Short
        Dim dmBitsPerPel As Short
        Dim dmPelsWidth As Integer
        Dim dmPelsHeight As Integer
        Dim dmDisplayFlags As Short
        Dim dmDisplayFrequency As Long
    End Structure
    Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
    Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As DEVMODE, ByVal dwFlags As Integer) As Integer


'seuraava koodi on yhdessä aliohjelmassa:
Try
            Call EnumDisplaySettings(0&, -1&, DevOrg)
            Dim DevNew As DEVMODE = DevOrg
            DevNew.dmPelsWidth = 640
            DevNew.dmPelsHeight = 480
            DevNew.dmBitsPerPel = 16
            DevNew.dmDisplayFrequency = 75
            Dim test As Long
            test = ChangeDisplaySettings(DevNew, &H4) 'tällä rivillä tökkää
            Select Case test
                Case 0
                    Call ChangeDisplaySettings(DevNew, &H1)
                    'näytön asetukset vaihdettu
                Case Else
                    'näytön asetuksia ei vaihdettu
            End Select
        Catch ex As Exception
            MsgBox(ex.Message, 16, "Error!")
        End Try

Minulla on kyllä koodi, millä palautan asetukset.
Missähän päin on ongelma? Itse epäilen tuota DevMode-struktia (ainakin tällä hetkellä tulee dmPelsWidth:iin ja dmPelsHeight:iin oikeat arvot).

neau33 [29.03.2012 14:36:57]

#

Höpö höpö ErroR++!

tässä heti pari linkkiä

ErroR++ [29.03.2012 15:28:32]

#

Samassa kohassa tökkää. Kumpikaan ei toiminut.

Grez [29.03.2012 16:33:51]

#

Onko noi 640x480x16bpp @75Hz yleisesti tuettu näyttötila, eli saatko saman suoraan windowsin näyttöasetuksista käyttöön?

Minkä virheen se heittää kun tökkää?

ErroR++ [29.03.2012 20:20:27]

#

Ei heitä mitään virhettä, vaan tkkäää vaan eli kun koodi saapuu sille riville, ohjelman suoritus vain jatkuu eli aivan kun se olisi hypännyt yllättäen tapahtumakäsittelijästä pois.

Lisäys: *tökkää

neau33 [29.03.2012 21:28:28]

#

Moi taas ErroR++!

kokeiles tätä

groovyb [29.03.2012 21:32:24]

#

Oletko debugannut rivi riviltä ja katsonut mikä jää suorittamatta?

(jos visual studio käytössä, niin heitä breakpoint alkuun ja painele F10:llä eteenpäin)

ErroR++ [30.03.2012 13:53:04]

#

Olen debugannut rivi riviltä ja tökkää just sillä rivillä.

groovyb [30.03.2012 15:23:03]

#

Kokeileppa seuraavaa, jos structistasi pitää luoda uusi instanssi ennen asetusta.

Dim DevNew As New DEVMODE()
DevNew = DevOrg

Oletko tarkistanut myös että sisältääkö structisi DevOrg mitään sisällään?

ErroR++ [30.03.2012 16:44:36]

#

Strukti sisältää suurinpiirtein kaikki oikeat tiedot.
Mutta tuo DispaySetting toimii! Kiitos! Ainut harmi on se, että maksimoitujen ikkunoiden koko muuttuu aika epämukavasti.

Lisäys: Juu en lähe enää näytön asetuksia vaihtamaan. Sovelsin tota ittelleni ja kuinka ollakkaan, kun testasin sitä niin ei se alussa vaihtanut niitä asetuksia. Sitten taas kun ne piti vaihtaa takasin, se vaihtokin 320 x 200-resoluution. Ei ollut kivaa :(

groovyb [30.03.2012 21:36:42]

#

Ohjelman alussa tallenna nykyinen resoluutiosi, ja ohjelman päätyttyä vaihda takaisin alkuperäiseen.

ErroR++ [31.03.2012 09:00:03]

#

Niinhän minä yritin tehdä, mutta kutsuin EnumDisplaySettingsiä niin, että iModeNum oli 1 tai 0 (en oikein muista kumpi). Eli se haki pienimmän resoluution mikä vain on tuettu. Värisyvyyskin oli aika inhottava, 8 bittiä eli 256 väriä.

groovyb [01.04.2012 11:21:00]

#

Nyt kyllä enemmän haiskahtaa enemmän siltä että tuo sun resoluutionvaihto on tehty väärin. tuohon on valmiita kirjastojakin olemassa, käytä vaikka niitä jos on ongelmia.

Itse testasin tällä valmiilla koodinpätkällä: http://dotnet.mvps.org/dotnet/faqs/?id­=setscreenresolution&lang=en

ja tuo toimi ainakin ihan hyvin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta