最終更新日 2024-09-25

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

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

タイミング

一般的用途

例①

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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);
}