お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"画面のモード(解像度や色数)変更"



  画面のモード(解像度や色数)を変更するサンプルです。




《要点》
  EnumDisplaySettings   API で設定可能な画面モードを取得、
  ChangeDisplaySettings API で設定を変更する。

《サンプル》#動作確認:Delphi3.1 + Win95a
  Formに ListBox1,
         Button1[画面モード取得]ボタン,
         Button2[画面モード変更]ボタン を置いて、
         以下のコードを記述する。

《サンプルの実行方法》
  [画面モード取得]ボタンのクリックで、設定可能な画面モードが
  ListBox1に列挙されます。

  ListBox1の「目的の画面モード」を選択(クリック)して、
  [画面モード変更]ボタンをクリックすれば、画面モードが
  変更されます。

---------- ここから ----------
var
  DevMode: array[0..20] of TDeviceModeA;

//Button1[画面モード取得]ボタンのクリックイベント
procedure TForm1.Button1Click(Sender: TObject);
var
  count: DWORD;
  s: String;
begin
  //設定可能な画面モードを取得して ListBox1にセット
  ListBox1.Items.Clear;
  count := 0;
  while EnumDisplaySettings(nil, count, DevMode[count]) do begin
    s := Format('%d x %d(Color:%dBit)',
               [ DevMode[count].dmPelsWidth,         //横
                 DevMode[count].dmPelsHeight,        //縦
                 DevMode[count].dmBitsPerPel ] );    //色数(bit)
    ListBox1.Items.Add(s);
    inc(count);
    if count > 20 then Break; //←手抜き f(^^;
  end;
end;

//Button2[画面モード変更]ボタンのクリックイベント
procedure TForm1.Button2Click(Sender: TObject);
var
  rc: Integer;
begin
  //ListBox1で選択された画面モードに変更する
  if ListBox1.ItemIndex >= 0 then begin
    rc := ChangeDisplaySettings(DevMode[ListBox1.ItemIndex],
                                CDS_UPDATEREGISTRY);
    case rc of
      DISP_CHANGE_SUCCESSFUL:
        ; //画面のモード変更に成功
      DISP_CHANGE_RESTART:
        begin
          //レジストリを変更したが、再起動が必要である
          if Application.MessageBox(
             '再起動が必要です。再起動しますか?',
             '確認', MB_ICONQUESTION or MB_YESNO) = IDYES then
            ExitWindowsEx(EWX_REBOOT, 0);
        end;
      else
        ; //画面モード変更失敗
          //DISP_CHANGE_BADFLAGS   エラーコードについては
          //DISP_CHANGE_FAILED     API関連のヘルプを参照して下さい
          //DISP_CHANGE_BADMODE
          //DISP_CHANGE_NOTUPDATED
    end;
  end;
end;
---------- ここまで ----------

《ご注意》
  ※DevMode: array[0..20] of TDeviceModeA; というのは
    思いっきり手抜きです。(^^;
    TDeviceModeA型の領域を動的に確保するのが本当でしょうね。

  ※再起動が必要な場合に、ExitWindowsEx APIを使っています。
    Win95ならこれで問題ありませんが、WinNTの場合、再起動には
    SE_SHUTDOWN_NAME特権が必要であるため、このままでは WinNT
    で再起動が動作しない可能性があります。
    詳しくは ExitWindowsEx APIについて調べて下さい。

                                 98/03/19(木) 14:55 Satobe(JCG00336)

Original document by Satobe          氏 ID:(JCG00336)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum