ChangeDisplaySettingsでフルスクリーンにするには?

解決


かたい肝はマズいんだよなぁ  2013-09-16 20:15:41  No: 45270  IP: [192.*.*.*]

作っているゲームをフルスクリーンに対応したいんですが、ChangeDisplay〜
の使い方がよくわかりません。

ウィンドウサイズは640,480なので、
画面解像度を4:3に設定したいんですが、
DevModeの設定と、ディスプレイが対応している解像度をプログラムから調べる方法が解りません。教えてください。

編集    削除
Harry  2013-09-24 01:36:03  No: 45271  IP: [192.*.*.*]

レスが付かないので…。
どこまで分かるのか、どこまで出来たのか、それを(具体的なコードを添えて)十分に説明した方が良いです。

ゲームとかフルスクリーンとかほとんど知らないんですが、MSDNを見てみると、ディスプレイが対応している
解像度はEnumDisplayDevices→EnumDisplaySettings(Ex)で取得できるんじゃないでしょうか。
それが出来れば、ChangeDisplaySettings(Ex)で変更できそうな感じですね。
検索すればサンプルも見つかると思います。
やってみて分からなければ、その時点でまた聞けば良いです。

あと、環境を書きましょう!

編集    削除
 2013-09-25 05:31:17  No: 45272  IP: [192.*.*.*]

すいません。
質問内容が分かりにくかったかもしれません。

Change〜の使い方は、知人に聞いて解決したので、解決とさせていただきます。
APIムズカシイ

編集    削除
 2013-11-24 20:01:03  No: 45273  IP: [192.*.*.*]

忘れてたけど、後から見る人がいるかもしれないからコード上げておきます。

var
  Form1: TForm1;
  aa:    DEVMODE;
  bb:    DEVMODE;    

procedure TForm1.Button1Click(Sender: TObject);
begin
  //Formの枠を消す
  Form1.BorderStyle := bsNone;
  //フルスクリーンモードにする
  Form1.WindowState := wsFullScreen;
  //大きさを一応設定
  Form1.Width  := 40 * 16;
  Form1.Height := 30 * 16;

  //なぜかもう一回やる
  Form1.BorderStyle := bsNone;
  Form1.WindowState := wsFullScreen;
  Form1.Width  := 40 * 16;
  Form1.Height := 30 * 16;

  //設定変更
  ChangeDisplaySettings(bb,CDS_FULLSCREEN);
end;    

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Formの長さ
  Form1.Width  := 40 * 16;
  Form1.Height := 30 * 16;
  //ディスプレイ情報を取得する
  FULL_SCREEN;
end;   

procedure TForm1.FULL_SCREEN;
var
  i:   Cardinal;
  dev: Array[0..50] of DEVMODE;

begin
  //  ディスプレイのレジストリ内の設定をロード
  EnumDisplaySettings(nil,ENUM_CURRENT_SETTINGS,bb);
  for i := 1 to 50 do
  begin
    EnumDisplaySettings(nil,ENUM_CURRENT_SETTINGS,dev[i]);
  end;
  //ループ準備
  i := 0;
  //ループ
  repeat
    //失敗しても成功しても50個の設定を読む
    //MSDNがサイズをどうこうしろといってた。意味は知らない。
    dev[i].dmSize := SizeOf(dev[i]);
    //設定の取得
    EnumDisplaySettings(nil,i,dev[i]);
    //画面比率。 4:3にしたいので、取得したものが4:3になっているか調べる
    if (dev[i].dmPelsHeight / 3) = (dev[i].dmPelsWidth / 4) then
    begin
      //取得したモードが、32bitカラー、bbに格納されているものより縦横が小さい、640*480以上のときはbbに代入
      if (bb.dmPelsWidth > dev[i].dmPelsWidth)and(bb.dmPelsHeight > dev[i].dmPelsHeight)and
      (dev[i].dmBitsPerPel = 32)and(dev[i].dmPelsWidth >= 640)and(dev[i].dmPelsHeight >= 480)      then
      begin
        bb := dev[i];
      end;
    end;
    i += 1;
    //ループ。インデックス番号
  until (i >= 50);

end;

編集    削除
Mr.XRAY  2013-11-25 04:09:53  No: 45274  IP: [192.*.*.*]

>あと、環境を書きましょう!

提示コードから判断すると,もしかしたら Lazarus かも知れません.
バージョンや OS とそのバージョンは,... 全く判断できません.

参考リンク
[Lazarus For Delphi Users/ja - Free Pascal wiki]
http://wiki.freepascal.org/Lazarus_For_Delphi_Users/ja

[Lazarus - Wikipedia]
http://ja.wikipedia.org/wiki/Lazarus

編集    削除
Mr.XRAY  2013-11-25 04:24:28  No: 45275  IP: [192.*.*.*]

>提示コードから判断すると,もしかしたら Lazarus かも知れません.

もし,そうだとすると,上のコードは,Delphi ではコンパイル時にエラーとなる
可能性があるということです.多分.あくまでも多分ですが.

編集    削除
 2013-11-25 04:37:14  No: 45276  IP: [192.*.*.*]

環境は
エディタ
Lazarus 1.2 RC1
OS CPU
WinXP HomePremium 32bit  Intel CoreDuo T2300 1.66GHz
です。

やっぱりAPIとか使うような質問はLazarusユーザーは避けたほうがいいんですかね・・・
どのレベルまでならここ使っていいんでしょうか。

編集    削除
硬い肝  2013-11-25 04:39:41  No: 45277  IP: [192.*.*.*]

ちなみに上のコードはLazarusコンパイルでは正常に動作してます。

編集    削除
Mr.XRAY  2013-11-25 08:47:04  No: 45278  IP: [192.*.*.*]

>やっぱりAPIとか使うような質問はLazarusユーザーは避けたほうがいいんですかね・・・

そういう問題じゃないと思いますけどね.

編集    削除
Harry  2013-11-29 08:46:05  No: 45279  IP: [192.*.*.*]

Mr.XRAYさん
なるほど、wsFullScreenはLazarusなのですね。
肝(?)さんには、出来るだけハッキリとお伝えしないと理解してもらえないと思います。


肝(?)さん
>やっぱりAPIとか使うような質問はLazarusユーザーは避けたほうがいいんですかね・・・
>どのレベルまでならここ使っていいんでしょうか。

DelphiとLazarus(Free Pascal)は似てますから、環境として Lazarus 1.2 RC1/WinXP HomePremium(SP?) 32bit
のように明記してもらった上で、「Delphiのコードで教えてもらえれば、あとは頑張ってLazarusで動かします」とか
宣言するなら、質問してもかまわないんじゃないでしょうか。
ただ、DelphiとLazarusでは、場合によりまるで違うコードになるおそれもありますのでご注意。

で…、↓ここの部分ですが、むしろ逆じゃないかと。
>APIとか使うような質問はLazarusユーザーは避けたほうがいいんですか

ほぼ純粋にAPIだけを使う、今回の TForm1.FULL_SCREEN のようなコードなら、DelphiとLazarusでだいたい同一に
なると思います。ですから一番質問しやすいジャンルではないでしょうか。
ただし、関数の定義(ヘッダ)の違いや、定数の定義の有り無しなどの差異によって動作しない場合は、自分で
解決することが前提になると思います。
※エラー内容の全てと、関数の定義部分等を提示してもらえるなら、助言できる人もいると思います。

一方、Delphiと大きく異なる文字列関係などは、ここで質問しても厳しそうですね。


なお、特に主義主張が無いのであれば、ハンドル名を変化させないで固定してください。
ハンドル名は掲示板における識別子ですので、質問者はスレッド内でのコテハンを維持してもらわないと困ります。

編集    削除