BT410 Phase 5.3.29: the panel titles -- 94.8% identical to the shipped cockpit
Reading the art settled where the titles live: qsensors/qmyomers/qermlas/ qppc/qstrk6.pcc are 299x26 TITLE BANNERS, while the qblh0..7.pcc strings the cfg hands vehicleSubSystems are 77x120 MECH ICONS (already lit by the 5.3.28 placement fix). So the authored auxScreenLabel IS the panel title -- it just belongs on the MFD panel, not only the ENG page. SubsystemCluster now builds a titleBanner child from the cached label. Placement was MEASURED against the shipped framebuffer through the A/B rig (BackgroundBitmap places by left/BOTTOM): a bring-up BT_TITLE_DY knob, then a green-pixel correlation over the title band, then baked at x+0x09, y+0xb3 from the panel origin. "SENSOR CLUSTER", "MYOMERS", "TYPE II 65 TONS" and both "ERMED LASER RANGE 500M" banners now render where the shipped binary puts them. Score progression vs the shipped cockpit on identical GAUGE content: 5.3.26 birth 90.1% identical / 82% coverage 5.3.28 authored screens 93.2% / 85% 5.3.29 titles tuned 94.8% / 91% Also: grab.ps1 now focuses the target window before capturing -- the screen-copy grabbed whatever was in front, which cost two junk captures (a white frame and an unrelated 3-D app window). Gauge fight 11/11 rounds and smoke both clean, zero faults. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,52 +1,54 @@
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string]$Out,
|
||||
[string]$Match = "DOSBox-X"
|
||||
)
|
||||
|
||||
Add-Type @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
public class W {
|
||||
[DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
|
||||
[DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RECT r);
|
||||
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h);
|
||||
[DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h);
|
||||
[DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int GetWindowText(IntPtr h, System.Text.StringBuilder s, int n);
|
||||
[DllImport("user32.dll")] public static extern bool EnumWindows(EnumProc cb, IntPtr p);
|
||||
public delegate bool EnumProc(IntPtr h, IntPtr p);
|
||||
[StructLayout(LayoutKind.Sequential)] public struct RECT { public int L, T, R, B; }
|
||||
}
|
||||
"@
|
||||
|
||||
$found = @()
|
||||
$cb = [W+EnumProc]{
|
||||
param($h, $p)
|
||||
if ([W]::IsWindowVisible($h)) {
|
||||
$sb = New-Object System.Text.StringBuilder 512
|
||||
[void][W]::GetWindowText($h, $sb, 512)
|
||||
$t = $sb.ToString()
|
||||
if ($t -like "*$Match*") { $script:found += ,@($h, $t) }
|
||||
}
|
||||
return $true
|
||||
}
|
||||
[void][W]::EnumWindows($cb, [IntPtr]::Zero)
|
||||
|
||||
if ($found.Count -eq 0) { Write-Output "NO-WINDOW"; exit 1 }
|
||||
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
$i = 0
|
||||
foreach ($f in $found) {
|
||||
$h = $f[0]; $title = $f[1]
|
||||
$r = New-Object W+RECT
|
||||
[void][W]::GetWindowRect($h, [ref]$r)
|
||||
$w = $r.R - $r.L; $ht = $r.B - $r.T
|
||||
if ($w -le 0 -or $ht -le 0) { continue }
|
||||
$bmp = New-Object System.Drawing.Bitmap $w, $ht
|
||||
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
||||
$g.CopyFromScreen($r.L, $r.T, 0, 0, (New-Object System.Drawing.Size $w, $ht))
|
||||
$path = if ($found.Count -eq 1) { $Out } else { $Out -replace '\.png$', "_$i.png" }
|
||||
$bmp.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)
|
||||
$g.Dispose(); $bmp.Dispose()
|
||||
Write-Output "SAVED $path ${w}x${ht} [$title]"
|
||||
$i++
|
||||
}
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][string]$Out,
|
||||
[string]$Match = "DOSBox-X"
|
||||
)
|
||||
|
||||
Add-Type @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
public class W {
|
||||
[DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
|
||||
[DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RECT r);
|
||||
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h);
|
||||
[DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h);
|
||||
[DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int GetWindowText(IntPtr h, System.Text.StringBuilder s, int n);
|
||||
[DllImport("user32.dll")] public static extern bool EnumWindows(EnumProc cb, IntPtr p);
|
||||
public delegate bool EnumProc(IntPtr h, IntPtr p);
|
||||
[StructLayout(LayoutKind.Sequential)] public struct RECT { public int L, T, R, B; }
|
||||
}
|
||||
"@
|
||||
|
||||
$found = @()
|
||||
$cb = [W+EnumProc]{
|
||||
param($h, $p)
|
||||
if ([W]::IsWindowVisible($h)) {
|
||||
$sb = New-Object System.Text.StringBuilder 512
|
||||
[void][W]::GetWindowText($h, $sb, 512)
|
||||
$t = $sb.ToString()
|
||||
if ($t -like "*$Match*") { $script:found += ,@($h, $t) }
|
||||
}
|
||||
return $true
|
||||
}
|
||||
[void][W]::EnumWindows($cb, [IntPtr]::Zero)
|
||||
|
||||
if ($found.Count -eq 0) { Write-Output "NO-WINDOW"; exit 1 }
|
||||
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
$i = 0
|
||||
foreach ($f in $found) {
|
||||
$h = $f[0]; $title = $f[1]
|
||||
[void][W]::SetForegroundWindow($h)
|
||||
Start-Sleep -Milliseconds 1200
|
||||
$r = New-Object W+RECT
|
||||
[void][W]::GetWindowRect($h, [ref]$r)
|
||||
$w = $r.R - $r.L; $ht = $r.B - $r.T
|
||||
if ($w -le 0 -or $ht -le 0) { continue }
|
||||
$bmp = New-Object System.Drawing.Bitmap $w, $ht
|
||||
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
||||
$g.CopyFromScreen($r.L, $r.T, 0, 0, (New-Object System.Drawing.Size $w, $ht))
|
||||
$path = if ($found.Count -eq 1) { $Out } else { $Out -replace '\.png$', "_$i.png" }
|
||||
$bmp.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)
|
||||
$g.Dispose(); $bmp.Dispose()
|
||||
Write-Output "SAVED $path ${w}x${ht} [$title]"
|
||||
$i++
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user