게임

스타크래프트 유저를 위한 모니터 해상도 토글 소스

Resolution Change applications

윈7를 사용하는데, 언제부터인지 스타크래프트를 실행하면 화면이 넘쳐서 짤리는 현상이 생겼습니다. 이것저것 시도해보다가 윈도우를 저해상도로 바꾸니 제대로 화면이 나오기는 하는데, 끝나면 다시 원래 해상도로 바꾸는 작업이 영 귀찮아서, 델파이로 해상도 토글 소스를 간단히 만들게 되었습니다.

대상과 기능

  • 대상 : 스타크래프트를 실행하면 윈7등에서 화면이 짤리는 분.
    윈도우 제어판에서 일일히 변경하는게 영 귀찮으신 분.
  • 기능 : 실행하면 resolution.ini에 기록된 2가지 해상도대로 원클릭으로 상호 전환됩니다.

사용법

  1. 해상도토글.exe를 실행합니다.
  2. 처음 실행하면 바로 종료되는데, 같은 폴더 위치에 resolution.ini파일이 생깁니다. 메모장으로 이 파일을 엽니다.
  3. 전환하기를 원하는 본인의 모니터의 2가지 해상도를 [toggle1]의 해상도와 [toggle2]의 해상도 항목에 각각 수정주1하여 저장하고 닫습니다.
  4. 해상도토글.exe를 다시 실행하면 바로 해상도가 전환됩니다.

델파이 소스

unit _fmMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TfmMain = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure do_readini;
    procedure do_writeini;
  private
    { Private declarations }
    function SetScreenResolution(Width, Height, ColorBit: integer; Fhz: DWORD): Longint;
  public
    { Public declarations }
    t1_r : string;
    t2_r : string;
  end;

var
  fmMain: TfmMain;

implementation

{$R *.dfm}

uses
  iniFiles;

procedure TfmMain.do_readini;
var
  iniSet   :TIniFile;
  iFile : string;
begin
  iFile := ExtractFilePath(Application.ExeName)+'resolution.ini';
  // file exist?
  if not FileExists(iFile) then
     do_writeini;

  iniSet := TIniFile.Create(iFile);
  //     1280 x 1024 32bit 60HZ
  try
    t1_r := iniSet.ReadString('toggle1', '해상도', '');
    t2_r := iniSet.ReadString('toggle2', '해상도', '');
  finally
    iniSet.Free;
  end;
end;

procedure TfmMain.do_writeini;
var
  i,j,k,l: string;
  iniSet:TIniFile;
  iFile :string;
begin
  // defalut
  i:= '1280 x 1024 32bit 75HZ';
  j:= '1680 x 1050 32bit 60HZ';

  iFile := ExtractFilePath(Application.ExeName)+'resolution.ini';

  // INI파일 만들기(기존에 파일있는 경우는 파일 열기로 됨)
  iniSet := TIniFile.Create(iFile);
  try
    iniSet.WriteString('toggle1','해상도',i);
    iniSet.WriteString('toggle2','해상도',j);
  finally
    // INI파일 닫기
    iniSet.Free;
    timer1.Enabled := true;  // ini만 만들고 종료
  end;

end;

function TfmMain.SetScreenResolution(Width, Height, ColorBit: integer; Fhz: DWORD): Longint;
var
  DeviceMode: TDeviceMode;
begin
  with DeviceMode do begin
    dmSize := SizeOf(TDeviceMode);
    dmPelsWidth := Width;
    dmPelsHeight := Height;
    dmBitsPerPel := ColorBit;
    dmDisplayFrequency := Fhz;
    dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;

  end;
  Result := ChangeDisplaySettings(DeviceMode, CDS_UPDATEREGISTRY);
end;

procedure TfmMain.Timer1Timer(Sender: TObject);
var
  XForm: TForm;
begin
  XForm := Screen.ActiveForm;
  XForm.Close;
end;

procedure TfmMain.Button1Click(Sender: TObject);
var
  li_Pos,li_Width,li_Height,li_ColorBit : Integer;
  t_Pos,t1_Width,t2_Width : Integer;
  li_Frequncy : Dword;
  DevMode    : TDevMode;
  procedure FormatResolution( Reso : String );
  begin
    //ori_r des_r 변환 1280 x 1024 32bit 75HZ
    // w
    li_Pos := Pos('x',Reso)-2;
    li_Width := StrToInt(Copy(Reso,1,li_Pos));
    Reso := copy(Reso,li_pos+4,Length(Reso)-li_Pos+3);
    // h
    li_Pos := Pos(' ',Reso)-1;
    li_Height := StrToInt(Copy(Reso,1,li_Pos));
    Reso := copy(Reso,li_pos+2,Length(Reso)-li_Pos);
    // b
    li_Pos := Pos(' ',Reso)-4;
    li_ColorBit := StrToInt(Copy(Reso,1,li_Pos));
    Reso := copy(Reso,li_pos+5,Length(Reso)-li_Pos+3);
    // f
    li_Frequncy := StrToint(Copy(Reso,1,2));
  end;
begin
  do_readini;
  t_Pos := Pos('x',t1_r)-2;
  t1_Width := StrToInt(Copy(t1_r,1,t_Pos));
  t_Pos := Pos('x',t2_r)-2;
  t2_Width := StrToInt(Copy(t2_r,1,t_Pos));

  if GetSystemMetrics(SM_CXSCREEN) = t1_Width then
    FormatResolution(t2_r)
  else if GetSystemMetrics(SM_CXSCREEN) = t2_Width then begin
    FormatResolution(t1_r)
  end;
  SetScreenResolution(li_Width,li_Height,li_ColorBit,li_Frequncy);
  timer1.Enabled := true;
end;
end.

ini 소스

[toggle1]
해상도=1280 x 1024 32bit 60HZ
[toggle2]
해상도=1680 x 1050 32bit 59HZ

맺음말

  • 스타크래프트의 화면 깨짐현상을 해결하려면, 제 경우는 75HZ로 변경해야 하더군요. 그래서 1280 x 1024 32bits 75HZ로 바꾸고 사용하였습니다.
  • 듀얼모니터이신 분은 프로그램을 변경하고자 하는 모니터에서 프로그램을 실행하시면 잘 실행 될 것 같습니다.
  • ini의 해상도가 구현 가능한 해상도가 아니면 작동하지 않습니다.
  • 구현 가능한 해상도의 목록을 모두 표시하고 선택하게 코드를 짰으면 편리하긴 한데, 짜기 귀찮아서 ini에 변경하는 형식을 취하였습니다.

내려받기

해상도토글


각주.
  1. 형식은 가로 x 세로 비트수bits 주파수hz 입니다. ex.)1280 x 1024 32bits 75hz [Back]