最終更新日 2024-09-25

void カスタム::On_ウィンドウ解像度切替時()

void カスタム::On_ウィンドウ解像度切替時() {
}

タイミング

一般的用途

例①

void カスタム::On_ウィンドウ解像度切替時() {

  // アプリとしての解像度変更の直後に「デスクトップの画面解像度」自体を変更してしまう。
  int iScreenWidth = 1024;
  int iScreenHeight = 768;

  // 天翔記のウィンドウハンドル
  HWND hwnd = FindWindow("Tenshouki95", NULL);

  // アプリケーション内部の描画範囲を取得しておく。
  RECT clientRect;
  GetClientRect(hwnd, &clientRect);

  // フルスクリーン用
  static DEVMODE devmode;

  // メモリクリア
  ZeroMemory( &devmode, sizeof(devmode) );

  // デスクトップの画面自体の解像度を変更してしまう
  devmode.dmSize = sizeof(devmode);
  devmode.dmPelsWidth  = iScreenWidth;
  devmode.dmPelsHeight = iScreenHeight;
  devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;

  // このアプリ実行中解像度切替。
  ChangeDisplaySettings( &devmode, CDS_FULLSCREEN );

  // アプリにはタイトルバーの幅や境界線幅(いわゆるボーダー)があるのでそのピクセル数を求める
  int iBorderX = GetSystemMetrics(SM_CXSIZEFRAME); // 境界線幅X方向
  int iBorderY = GetSystemMetrics(SM_CYSIZEFRAME); // 境界線幅Y方向
  int iHeightCaption = GetSystemMetrics(SM_CYCAPTION);   // タイトルバーの高さ

  // 左座標は、指定の幅から真ん中に配置
  int iLeft = (iScreenWidth-clientRect.right)/2;
  // 上座標の真ん中は求めておくけとまぁ使わないかな。
  int iTop  = (iScreenHeight-clientRect.bottom)/2;

  // 携帯用解像度などもあるのでTOPは常に一番上で、左右は真ん中。
  MoveWindow(hwnd, iLeft-iBorderX, -iBorderY-iHeightCaption, 0, 0, TRUE);
}