16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"画面解像度の動的変更"
この発言に対し以下のコメントが寄せられています
#00811 佐藤 充男 さん RE:画面解像度の動的変更
こんにちは、佐藤 充男です。
☆説明
nifty:FDELPHI/MES/16/460 Satobeさんサンプルを元に、動的変更に改良
しました。
Button1 を押すと解像度を640×480へ、
Button2 を押すと元の解像度に戻ります。
☆準備
1.フォームにButton1、Button2を置く。
2.フォームの OnCreate、OnCloseQuery イベントとButtonの OnClick
イベントに以下のコードを記述。
☆補足
・Delphi4で作成、Windows98、NT4.0WSで動作確認。
・解像度切り替えを連続して行うとディスプレイが壊れる危険性があります。
パチパチ切りかえるのはやめましょう(^^;
======================================================================
var
ScrW: Integer; // Screen Width
ScrH: Integer; // Screen Height
ScrC: Integer; // Screen Color (Bit/Pixel)
RRate: Integer; // Refresh Rate
ChgFlag: Boolean; // 変更フラグ
procedure TForm1.FormCreate(Sender: TObject);
var
hDC: THandle;
OSVer: TOSVersionInfo; // OSバージョン情報
begin
// OSバージョンチェック
OSVer.dwOSVersionInfoSize := Sizeof(TOSVersionInfo);
GetVersionEx(OSVer);
// 画面情報を得る
hDC := GetDC( 0 );
ScrW := GetDeviceCaps( hDC, HORZRES );
ScrH := GetDeviceCaps( hDC, VERTRES );
ScrC := GetDeviceCaps( hDC, BITSPIXEL ) *
GetDeviceCaps( hDC, PLANES );
if OSVer.dwPlatformId = VER_PLATFORM_WIN32_NT then
// NTならば現在のリフレッシュレートを得る
RRate := GetDeviceCaps( hDC, VREFRESH )
else
RRate := 1; // default refresh rate
ReleaseDC( 0, hDC );
ChgFlag := False; // 変更なし
end;
(* 640 x 480 モード *)
procedure TForm1.Button1Click(Sender: TObject);
var
DevMode: TDeviceModeA;
begin
DevMode.dmSize := Sizeof(TDeviceModeA);
DevMode.dmBitsPerPel := ScrC;
DevMode.dmPelsWidth := 640;
DevMode.dmPelsHeight := 480;
DevMode.dmDisplayFrequency := 1; // 面倒なのでdefaultを採用
DevMode.dmFields := DM_PELSWIDTH or
DM_PELSHEIGHT or
DM_BITSPERPEL or
DM_DISPLAYFREQUENCY;
ChangeDisplaySettings(DevMode,0);
ChgFlag := True; // 変更あり
end;
(* 元のモードに戻す *)
procedure TForm1.Button2Click(Sender: TObject);
var
DevMode: TDeviceModeA;
begin
if ChgFlag = True then
begin
DevMode.dmSize := Sizeof(TDeviceModeA);
DevMode.dmBitsPerPel := ScrC;
DevMode.dmPelsWidth := ScrW;
DevMode.dmPelsHeight := ScrH;
DevMode.dmDisplayFrequency := RRate;
DevMode.dmFields := DM_PELSWIDTH or
DM_PELSHEIGHT or
DM_BITSPERPEL or
DM_DISPLAYFREQUENCY;
ChangeDisplaySettings(DevMode,0);
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
DevMode: TDeviceModeA;
begin
if ChgFlag = True then
begin
DevMode.dmSize := Sizeof(TDeviceModeA);
DevMode.dmBitsPerPel := ScrC;
DevMode.dmPelsWidth := ScrW;
DevMode.dmPelsHeight := ScrH;
DevMode.dmDisplayFrequency := RRate;
DevMode.dmFields := DM_PELSWIDTH or
DM_PELSHEIGHT or
DM_BITSPERPEL or
DM_DISPLAYFREQUENCY;
ChangeDisplaySettings(DevMode,0);
end;
end;
======================================================================
【参考】
nifty:FDELPHI/MES/16/460
Satobeさんの「画面のモード(解像度や色数)変更」
nifty:FDELPHI/MES/11/4315
miniminiさん、tacさんの「色数と解像度の変更」
99/1/28(木) 05:14pm LDM03756 佐藤 充男
Original document by 佐藤 充男 氏 ID:(LDM03756)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|