ディスプレイ解像度を変更 VB編


ごろぉ:それでは、まず、VB編から
はずな:こっちを後から見たかも…
それに、ここしか見ない人居るかもしれないのに『まず』も何も
ごろぉ:…揚げ足取らんでいい。
えー、それでは、ダウンロードしたファイルを解答すると、以下のファイルが現れます。
●Display.cls…クラスモジュール。クラス本体
●Display.bas…標準モジュール。API宣言とか色々
はずな:…クラスモジュールっていうの、はじめて見たなぁ
ごろぉ:ああ。俺も今回はじめて作った
はずな:で、これでどうするの?
ごろぉ:まぁ取り合えずVBを起動して『標準EXE』を作成。んで、上記のファイルを追加する。
ごろぉ:必要に応じてオブジェクト名とかは適当に変更してくれ
はずな:できたよ。

それで、どうするの?
ごろぉ:まぁ、サンプルだから、簡単にいこうか。フォームモジュールに以下のコントロールを配置してくれ
コントロール プロパティ
リストボックス Name List1
ラベル Name Label1
コマンドボタン Name Command1
Caption 変更
ごろぉ:位置とサイズは適当に決めてくれ
はずな:ふんふん?

こんなかんじでいいの?
ごろぉ:上等だ。んじゃ中身いくぞ。
まず、フォームモジュールのコードの上のほうに次のように記述
Option Explicit

Dim m_Display As Display
ごろぉ:Option Explicitは別に書かなくても良いけどな。
m_Displayというのが解像度を扱うクラスになる。
はずな:これで解像度変更ができるの?
ごろぉ:や、まだこれは空っぽだからな。更に以下のコードを追加する。
Private Sub Form_Load()
    Set m_Display = New Display
End Sub
ごろぉ:別にコレはForm_Load内で書かなくても、起動時に一度だけ実行する部分ならどこでも良い。
これでm_Displayに中身が設定されて実際に解像度変更が出来るようになった。
はずな:ふ〜ん?
ごろぉ:使えるようになったところで、ディスプレイ解像度変更クラスの各関数を説明しておこう
関数名 引数 戻り値 説明
GetWidth n As Integer Integer  設定リストのn番目の設定での幅が返る。
 引数nを省略した場合、現在の画面の幅(ピクセル)が返る。
GetHeight n As Integer Integer  設定リストのn番目の設定での高さが返る。
 引数nを省略した場合、現在の画面の高さ(ピクセル)が返る。
GetBit n As Integer Integer  設定リストのn番目の設定での色深度が返る。
 引数nを省略した場合、現在の色深度(bit)が返る。
GetDisplayMode なし Integer  設定リストを取得する。また、現在の画面情報をデフォルトにする。
 この関数は、オブジェクトが作成されたときに呼び出される為、通常必要ない。
 設定リストの数が返る。
GetDisplayModeNumber なし Integer  設定リストの数が返る。
ChangeDisplayMode n As Integer
w As Integer
h As Integer
b As Integer
Long  設定リストのn番目の設定を使用し、解像度を変更する。
 nを省略した場合、wを幅、hを高さ、bをビット深度として自動的に設定を探して解像度を変更する。
 全ての引数を省略した場合、デフォルトの解像度に変更する。
関数が成功するとDISP_CHANGE_SUCCESSFULが返る。
はずな:ん〜? 何か良く分からない
ごろぉ:まぁ、実際使ってみよう。
Form_Loadに以下のコードを書いてみ
Private Sub Form_Load()
    Dim i As Integer
    Set m_Display = New Display
    For i = 0 To m_Display.GetDisplayModeNumber - 1
        List1.AddItem Format$(m_Display.GetWidth(i), "# x ") & _
                      Format$(m_Display.GetHeight(i), "#") & _
                      Format$(m_Display.GetBit(i), " # bit")
    Next i
    Label1.Caption = Format$(m_Display.GetWidth, "現在:# x ") & _
                      Format$(m_Display.GetHeight, "#") & _
                      Format$(m_Display.GetBit, " # bit")
End Sub
はずな:ん、書けたよ
ごろぉ:このコードは、利用できる解像度を列挙してリストボックスに出力し、現在の解像度をラベルに表示している。
実行してみ
はずな:はーい

あ、出たねぇ
ごろぉ:よしよし。
これで、利用できる解像度は取得できたからな。次はいよいよ変更だ。
以下のコードを追加する。
Private Sub Command1_Click()
    If List1.ListIndex > 0 Then
        m_Display.ChangeDisplayMode List1.ListIndex
    End If
End Sub
はずな:これだけ?
ごろぉ:ああ。これだけだ。画面の解像度が変更されるはず。
はずな:へぇ。
ごろぉ:ちなみに、以下のコードで実行しても同じ結果が得られるはずだ。
Private Sub Command1_Click()
    If List1.ListIndex > 0 Then
        m_Display.ChangeDisplayMode , m_Display.GetWidth(List1.ListIndex), _
                                      m_Display.GetHeight(List1.ListIndex), _
                                      m_Display.GetBit(List1.ListIndex)
    End If
End Sub
はずな:こっちは画面サイズと色深度で指定してるのね
ごろぉ:そうそう。良く分かったな。
ただ、設定の種類によっては再起動の必要があるものがある…4bitの物とかそうらしいけど。
このクラスではその場合、変更できなくなっている。
はずな:4bitっていうと…2…4…8……16色?最近のゲームで16色はあまり使わないから大丈夫だね
ごろぉ:おぉ、よく知ってたな。色数計算
今現在のゲームだったら大体8bit(256色)とかだし、問題はなかろうな。
はずな:それで、解像度を元に戻すのはどうやるの?
ごろぉ:うむ。引数を全て省略してChangeDisplayModeを呼び出すんだけどな…
…まぁ、そんな事しなくてもいい。一度解像度を変更して、プログラムを終了させてみ?
はずな:え? うん…
はずな:あ、元の解像度に戻った。
ごろぉ:そう。このクラスは、自身が破棄されるとき(この場合、プログラムの終了)に解像度を元に戻すようになってるから、特に解像度を戻すことは考えなくてよくなっている。
まぁ、念のため終了時、引数なしのChangeDisplayModeを呼び出すのも良いが
はずな:へぇ。便利だねぇ
ごろぉ:まぁな。しかし、問題はある
はずな:
ごろぉ:フォーム上にコマンドボタン(Command2)を置いて以下のコードを入力してみ?
Private Sub Command2_Click()
    Dim m_Display2 As Display
    Set m_Display2 = New Display
    m_Display2.ChangeDisplayMode , 800, 600, 16
End Sub
はずな:これは…ボタンを押したときに解像度を800×600の16ビットカラーにする命令だよね?
ごろぉ:そう。ただし、この時使用するオブジェクトは、Command2のClickイベント内で生成している。
さ、実行してみろ。
はずな:わかった……
…あれ? 確かに解像度は変わるけど、一瞬で元に戻っちゃうよ?
ごろぉ:その通り。Command2のClickイベント内で生成されたオブジェクトは、Command2のClickイベントが終了すると、破棄されてしまう。
だから、解像度が変わっても一瞬で元に戻ってしまうんだ。
はずな:なるほどねぇ
ごろぉ:だから、ディスプレイ解像度変更クラスは、実行するフォームのGeneralの部分で宣言するか、標準モジュールにPublicとして宣言しとくのが良いだろう。
はずな:は〜い。了解しましたぁ
ごろぉ:さて。これで一通りの説明は終わったが。何か質問は?
はずな:ん〜っとね…『調整の為先送りになった第二回』のテーマって何?
ごろぉ:今までの内容に全く関係ないじゃないか……
今回作った『ディスプレイ解像度変更』のサンプルはこちらです。(zip圧縮 4,289 バイト)

戻る
メインページ倉庫サンプル置き場ディスプレイ解像度変更