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


ごろぉ:じゃー初めにVC編からいってみようか
はずな:VB編の方先やったじゃない
ごろぉ:お…お前が『ここしか見ない人居るかもしれないのに『まず』も何も』とか言うからだろうが!
…まぁいい。説明いくぞ。
先ほどダウンロードしたファイルを解凍すると、以下のファイルが出てくる。
●Display.h…ヘッダファイル。クラスの宣言
●Display.cpp…ソースファイル。クラス内のコード
はずな:そんだけ?
ごろぉ:そ。この2つだけ
はずな:で、これでどうするの?
ごろぉ:ふむ。じゃ、VCを起動して、新規作成-プロジェクト-Win32 Console Applicationを選ぼう。
これは、コマンドプロンプト(MS-DOSプロンプト)で実行されるプロジェクトだ。
ごろぉ:プロジェクト名は…そうだな。"DisplayTest"とでもしとけ。
んで、新規作成-ファイル-C++ソースファイルで一つソースファイルを作れ。
名前は"main.cpp"とでも。
はずな:OK。
ごろぉ:んで、解凍できた2つのファイルを追加する。
はずな:できたよ。

これでいい?
ごろぉ:OKだ。
ごろぉ:それじゃ、クラスを使えるようにするぞ。以下のコードを"main.cpp"に記述してくれ
#include <iostream>
#include <windows.h>
#include "Display.h"
using namespace std;

int main()
{
    DisplayMode m_Display;
    return 0;
}
ごろぉ:C++の細かい説明は省くぞ。m_Displayというのがディスプレイ解像度を操作するクラスだ。
はずな:これで画面の解像度変更できるの?
ごろぉ:ああ。準備は出来たことになる。
ごろぉ:使えるようになったところで、ディスプレイ解像度変更クラスの各関数を説明しておこう
関数名 引数 戻り値 説明
GetWidth なし int 現在の画面の幅(ピクセル)が返る。
GetWidth int n int  設定リストのn番目の設定での幅(ピクセル)が返る。
GetHeight なし int  現在の画面の高さ(ピクセル)が返る。
GetHeight int n int  設定リストのn番目の設定での高さ(ピクセル)が返る。
GetBit なし int  現在の色深度(bit)が返る。
GetBit int n int  設定リストのn番目の設定での色深度(bit)が返る。
GetDisplayMode なし int  設定リストを取得する。また、現在の画面情報をデフォルトにする。
 この関数は、クラスが変数に宣言されたときに呼び出される為、通常必要ない。
 設定リストの数が返る。
GetDisplayModeNumber なし int  設定リストの数が返る。
ChangeDisplayMode なし int  デフォルトの解像度に変更する。
 関数が成功するとDISP_CHANGE_SUCCESSFULが返る。
ChangeDisplayMode int n int  設定リストのn番目の設定を使用し、解像度を変更する。
 関数が成功するとDISP_CHANGE_SUCCESSFULが返る。
ChangeDisplayMode int w
int h
int b
Long  wを幅、hを高さ、bをビット深度として自動的に設定を探して解像度を変更する。
 関数が成功するとDISP_CHANGE_SUCCESSFULが返る。
はずな:同じ名前の関数があるね。
ごろぉ:ああ。C++は同じ名前の関数も使えるんだよ。
取り合えずmain関数を以下のように追記してみようか
int main()
{
    DisplayMode m_Display;
    forint i=0; i < m_Display.GetDisplayModeNumber(); i++ )
        cout << m_Display.GetWidth( i ) << " x " <<
                m_Display.GetHeight( i ) << " " <<
                m_Display.GetBit( i ) << " bit\n";
    return 0;
}
はずな:ん、書けたよ
ごろぉ:このコードは、利用できる解像度を列挙して出力している。
実行してみ
はずな:はーい

あ、出たねぇ
ごろぉ:よしよし。
これで、利用できる解像度は取得できたからな。次はいよいよ変更だ。
さらに追記する。
int main()
    forint i=0; i < m_Display.GetDisplayModeNumber(); i++ )
        cout << i << ":" <<
                m_Display.GetWidth( i ) << " x " <<
                m_Display.GetHeight( i ) << " " <<
                m_Display.GetBit( i ) << " bit\n";
    int n = 0;
    while(n!=-1){
        cin >> n;
        m_Display.ChangeDisplayMode( n );
    }
    return 0;
}
ごろぉ:これで数字を入力すれば、入力された数字に対応する設定に変更されるんだ。
はずな:へぇ。それだけなんだ
ごろぉ:ああ。これだけだ。
はずな:思ったよりも少なかったなぁ
ごろぉ:ちなみに、ChangeDisplaySettingを以下のように変更しても同じ結果が得られるはずだ。
m_Display.ChangeDisplayMode( m_Display.GetWidth( n ) , m_Display.GetHeight( n ) , m_Display.GetBit( n ));
はずな:こっちは画面サイズと色深度で指定してるのね
ごろぉ:そうそう。良く分かったな。
ただ、設定の種類によっては再起動の必要があるものがある…4bitの物とかそうらしいけど。
このクラスではその場合、変更できなくなっている。
はずな:4bitっていうと…2…4…8……16色?最近のゲームで16色はあまり使わないから大丈夫だね
ごろぉ:おぉ、よく知ってたな。色数計算
今現在のゲームだったら大体8bit(256色)とかだし、問題はなかろうな。
はずな:それで、解像度を元に戻すのはどうやるの?
ごろぉ:うむ。引数無しのChangeDisplayModeを呼び出すんだけどな…
…まぁ、そんな事しなくてもいい。一度解像度を変更して、-1を入力してプログラムを終了させてみ?
はずな:え? うん…
はずな:あ、元の解像度に戻った。
ごろぉ:そう。このクラスは、自身が破棄されるときに解像度を元に戻すようになってるから、特に解像度を戻すことは考えなくてよくなっている。
まぁ、念のため終了時、引数なしのChangeDisplayModeを呼び出すのも良いが
はずな:へぇ。便利だねぇ
ごろぉ:まぁな。しかし、問題はある
はずな:
ごろぉ:main.cppを次のように書き換えてみ?
#include <iostream>
#include <windows.h>
#include "Display.h"
using namespace std;

void func()
{
    DisplayMode m_Display2;
    m_Display2.ChangeDisplayMode( 800 , 600 , 16 );
}

int main()
{
    func();
    getchar();
    return 0;
}
はずな:これは…実行したときに解像度を800×600の16ビットカラーにする命令だよね?
ごろぉ:そう。ただし、変更は別の関数上で行っている。
さ、実行してみろ。
はずな:わかった……
…あれ? 確かに解像度は変わるけど、一瞬で元に戻っちゃうよ?
ごろぉ:その通り。func関数内で宣言された変数はfunc関数が終了されると破棄される。
よって、一瞬で解像度が元に戻ってしまう。
はずな:なるほどねぇ
ごろぉ:だから、ディスプレイ解像度変更クラスは、パブリック変数で宣言するとか、main関数内で宣言するとか、プログラム終了まで保持されるものにすると良いだろう。
はずな:は〜い。了解しましたぁ
ごろぉ:さて。これで一通りの説明は終わったが。何か質問は?
はずな:ん〜っとね…
そういえば、さっきから思ってたんだけど…何でワタシがプログラミングしてるの?
ごろぉ:……今更かよ
今回作った『ディスプレイ解像度変更』のサンプルはこちらです。(zip圧縮 4,721 バイト)

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