游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6584|回复: 21

如何取得当前系统的分辨率和颜色位数 ?

[复制链接]

88

主题

1125

帖子

1136

积分

金牌会员

Rank: 6Rank: 6

积分
1136
QQ
发表于 2007-7-11 21:00:00 | 显示全部楼层 |阅读模式
游戏中动态设置分辨率.  
但是首先先要记住系统现在的信息.
游戏退出时恢复到系统原来的状态.

注 不用DirectX
取得分辨率可以用  ..screen.Width \screen.TwipsPerPixelX     screen.height\screen.TwipsPerPixelY

17

主题

153

帖子

153

积分

注册会员

Rank: 2

积分
153
发表于 2007-7-11 21:27:00 | 显示全部楼层

Re:如何取得当前系统的分辨率和颜色位数 ?

screen.Width  方法并不好,在非正常改变Window的分辨率后,其返回值有误

你可以使用 DX7 只做改变分辨率的功能。另一种方法就是使用API,但这个比较危险,一旦程序没有执行还原分辨率的方法(例:非法退出)分辨率就不会还原,如果你把刷新率设的高出显示器的范围,后果可想而知!

下面是一个API改变分辨率的类
建一个类:CDisplaySetting

代码如下

'天魂制作
Option Explicit

Private Const CCHDEVICENAME As Integer = 32
Private Const CCHFORMNAME   As Integer = 32
Private Const DM_PELSWIDTH  As Long = &H80000
Private Const DM_PELSHEIGHT As Long = &H100000
Private Const DM_DISPLAYFREQUENCY As Long = &H400000 '刷新频率常量
Private Const DM_BITSPERPEL = &H40000 'BPP

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 Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type


'获得分辨率和色彩度
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long

'更改分辨率和色彩度
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByVal lpDevMode As Long, ByVal dwFlags As Long) As Long


Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

Private ScreenWidth As Integer
Private ScreenHeight As Integer
Private ScreenBPP As Integer
Private ScreenFreq As Integer
Private bReturn As Boolean

Public NewWidth  As Integer
Public NewHeight As Integer
Public NewFreq   As Integer
Public NewBPP    As Integer

'***************************************
'获取屏幕分辨率
'***************************************
Public Sub GetDisplayMode(ByRef Width As Integer, ByRef Height As Integer, ByRef BPP As Integer, ByRef Frequency As Integer)
    Dim hdesktopwnd As Long
    Dim hdccaps As Long
    Dim retVal As Long
   
    hdccaps = GetDC(hdesktopwnd)
    '色深
    BPP = GetDeviceCaps(hdccaps, 12)
    Width = GetDeviceCaps(hdccaps, 8)
    Height = GetDeviceCaps(hdccaps, 10)
    Frequency = GetDeviceCaps(hdccaps, 116)
   
    retVal = ReleaseDC(hdesktopwnd, hdccaps)
End Sub

'***************************************
'设置屏幕分辨率
'***************************************
Public Function SetDisplayMode(ByRef Width As Integer, ByRef Height As Integer, Optional ByRef BPP As Integer = 16, Optional ByRef Frequency As Integer = 75)
    If Width = 0 Or Height = 0 Or BPP = 0 Or Frequency = 0 Then Exit Function
   
    If bReturn = False Then
        ScreenWidth = 0
        ScreenHeight = 0
        ScreenBPP = 0
        ScreenFreq = 0
        
        GetDisplayMode ScreenWidth, ScreenHeight, ScreenBPP, ScreenFreq
        NewWidth = Width
        NewHeight = Height
        NewBPP = BPP
        NewFreq = Frequency

    End If
   
   
   
    Dim blnWorked As Boolean
    Dim i As Integer
    Dim pDevmode As Long
    Dim NewDevMode As DEVMODE

    Do
        blnWorked = EnumDisplaySettings(0, i, NewDevMode)
        i = i + 1
    Loop Until (blnWorked = False)

    With NewDevMode
        .dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL 'Or DM_DISPLAYFREQUENCY
        .dmPelsWidth = Width
        .dmPelsHeight = Height
        .dmBitsPerPel = BPP
        '刷新频率
        '.dmDisplayFrequency = Frequency
    End With
   
    pDevmode = lstrcpy(NewDevMode, NewDevMode)
    SetDisplayMode = ChangeDisplaySettings(pDevmode, 0)
   
    SetCursorPos Width, Height
End Function

Public Sub Reset()
    SetDisplayMode NewWidth, NewHeight, NewBPP, NewFreq
End Sub

Public Sub ReturnWindow()
    bReturn = True
    SetDisplayMode ScreenWidth, ScreenHeight, ScreenBPP, ScreenFreq
    bReturn = False
End Sub

17

主题

153

帖子

153

积分

注册会员

Rank: 2

积分
153
发表于 2007-7-11 21:29:00 | 显示全部楼层

Re:如何取得当前系统的分辨率和颜色位数 ?

SetDisplayMode 用来设置分辨率。这个方法不改变刷新率

0

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2007-7-12 10:35:00 | 显示全部楼层

Re:如何取得当前系统的分辨率和颜色位数 ?

你的方法不好。

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2007-7-14 13:23:00 | 显示全部楼层

Re:如何取得当前系统的分辨率和颜色位数 ?

得到分辨率:
int x = GetSystemMetrics(SM_CXSCREEN)
int y = GetSystemMetrics(SM_CYSCREEN)

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2007-7-14 13:58:00 | 显示全部楼层

Re:如何取得当前系统的分辨率和颜色位数 ?

找一个窗体最大化然后测量宽度和高度再转换成Pixel就可以了........
(这方法怎么样,呵呵~~)

0

主题

160

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2007-7-14 16:48:00 | 显示全部楼层

Re: Re:如何取得当前系统的分辨率和颜色位数 ?

Miu.C: Re:如何取得当前系统的分辨率和颜色位数 ?

找一个窗体最大化然后测量宽度和高度再转换成Pixel就可以了........
(这方法怎么样,呵呵~~)


你也懂VB

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2007-7-14 17:56:00 | 显示全部楼层

Re: Re: Re:如何取得当前系统的分辨率和颜色位数 ?

[quote]
[b]miucpp: Re: Re:如何取得当前系统的分辨率和颜色位数 ?[/b]



你也懂VB
[/quote]
我不懂,您懂。

0

主题

160

帖子

160

积分

注册会员

Rank: 2

积分
160
发表于 2007-7-14 18:42:00 | 显示全部楼层

Re: Re: Re: Re:如何取得当前系统的分辨率和颜色位数 ?

Miu.C: Re: Re: Re:如何取得当前系统的分辨率和颜色位数 ?


我不懂,您懂。


不懂游戏公司请你做什么, 做小姐吗

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2007-7-14 18:50:00 | 显示全部楼层

Re: Re: Re: Re: Re:如何取得当前系统的分辨率和颜色位数 ?

miucpp: Re: Re: Re: Re:如何取得当前系统的分辨率和颜色位数 ?



不懂游戏公司请你做什么, 做小姐吗

H是不好的!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 19:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表