I did a first version of what could be the HiScore script with the rotated text.
To run the example, just put the ahk in the same folder of the GDIP.ahk, or adjust the path in the #include.
#include gdip.ahk
#SingleInstance Force
pToken := Gdip_Startup()
Gui, Destroy
contents =
(
GRAND CHAMPION
KEF 75.000.000
HIGHEST SCORES
#1 G G 60.000.000
#2 C G 50.000.000
#3 XAQ 45.000.000
#4 M G 40.000.000
DESTROY RING CHAMPION
EYE - 10:00.00
)
;vertical distance of Hiscore window
HiScoreTopDistance := 100
;Gui 1 - hidden horizontal Gui
Gui, 1: Color, 0b40e4
Gui, 1: Font, s15, Quartz
Gui, 1: Add, Text, Cffffff Center, %contents%
Gui, 1: +AlwaysOnTop -Caption +Lastfound
hwnd := WinExist()
Gui, 1: Show, NA
WinGetPos,scorex,scorey, scorew, scoreh, ahk_id %hwnd%
pBitmap := Gdip_BitmapFromScreen("hwnd:" hwnd)
Gui, 1: Show, Hide
;Gui 2 - hiscore background image
imageW := scoreh+20, imageH := scorew+40
Gui, 2: -Caption +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop
Gui, 2: Show, NA
hwnd1 := WinExist()
hbm := CreateDIBSection(imageW, imageH)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(G, 4)
pBrush1 := Gdip_BrushCreateSolid(0xff0ffffff)
pBrush2 := Gdip_BrushCreateSolid(0xff00C32A5)
pBrush3 := Gdip_BrushCreateSolid(0xff0b40e4)
Gdip_FillRoundedRectangle(G, pBrush1, 0, 0, imageW, imageH, 20)
Gdip_FillRoundedRectangle(G, pBrush2, 5, 5, imageW-10, imageH-10, 15)
Gdip_FillRoundedRectangle(G, pBrush3, 10, 10, imageW-20, imageH-20, 10)
Gdip_DeleteBrush(pBrush1)
Gdip_DeleteBrush(pBrush2)
Gdip_DeleteBrush(pBrush3)
UpdateLayeredWindow(hwnd1, hdc, HiScoreTopDistance, (A_ScreenHeight-imageH)//2, imageW, imageH)
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(G)
;Gui 3 - rotated vertical Gui
Gui, 3: -Caption +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop
Gui, 3: Show, NA
hwnd2 := WinExist()
bitmapW := scoreh, bitmapH := scoreW
hbm := CreateDIBSection(bitmapW, bitmapH)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
G := Gdip_GraphicsFromHDC(hdc)
UpdateLayeredWindow(hwnd2, hdc, HiScoreTopDistance+10, (A_ScreenHeight-bitmapH)//2, bitmapW, bitmapH)
Gdip_ImageRotateFlip(pBitmap, 3)
Gdip_DrawImage(G, pBitmap)
UpdateLayeredWindow(hwnd2, hdc)
Gdip_DisposeImage(pBitmap)
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(G)
return
I used GDI+ rectangles to construct the appearance. This could be a faster way to construct the hiscore window. I really do not know. If you want i can adjust the code to use a pre made png file. Blur, you decide. The only thing more important is that by using the GDI+ rectangles, I made the HiScore windows resizable depending of the hiscore contents lines (as different pinball tables have a different number of hiscore categories).
I hope that this is what you had in mind. I do not have the future pinball in my computer, so I do not know how it is the hiscore visualization under it, so I tried to keep the same appearance of the pause menu in a HiScore menu to be put above it.
My first idea was also to use the transparency in the rotated text to put it directly above the table image when in pause menu. But I am having problems with setting the transparency in the rotated bitmap created. If I, or someone else, solve this, we could do any kind of presentation for the hiscores.
It is also possible to do many animations or use GDI+ advanced text with the score in the way that I present here. However i decided to keep it simple in order to avoid using too much resources. Any animation requires a loop in rotated bitmaps that could use something of the computer resources. If any of you have in mind something specific, just tell me and I can try to implement in the HiScore menu.
Please give me your opinions.
PS: It is a not revised code, so it is possible, and very probable, to have some unnecessary lines in the middle of the code.