力技ですが、やってみました。
ボタン等のオブジェクトは配置できないので、使い勝手はあまりよろしくないと思いますが。
//・元の画面はバッファ1に対して描画します。(ボタン等のオブジェクトは配置できません)
//・modeの値によって画面が何度回転するかが決まります。
//・「makewindow」でmodeの値に応じたウィンドウ0を作成し、バッファ1の内容を反映させます。
//・「reflect x座標,y座標,横幅,縦幅」でバッファ1の内容をウィンドウ0に反映させます。
//・reflect実行後は描画先がウィンドウ0になります。
//・「get_point x座標,y座標」で、ウィンドウ0上のx座標とy座標を元の画面のそれに変換し、変数mxとmyに代入します。
//・「get_point2 x座標,y座標」で、元の画面上のx座標とy座標をウィンドウ0のそれに変換し、変数mxとmyに代入します。
#include "gdi32.as"
#include "user32.as"
#module
#deffunc mouse2 int c_x,int c_y //mouse命令のウィンドウ上の座標を指定する版
dim poi,2 : poi=c_x,c_y
ClientToScreen hwnd,varptr(poi)
mouse poi(0),poi(1)
return
#global
w_wid=640 //元の画面の横幅
w_hei=480 //元の画面の縦幅
mode=0 //0:通常 1:90度回転 2:180度回転 3:270度回転
dim point,6 //回転処理時に使う
buffer 1,w_wid,w_hei : gsel 1 : hdc1=hdc //hdc1はバッファ1のhdc
//以下、元の画面の描画はバッファ1に対して行う。
gsel 1
color 255,0,0 : boxf 100,100,199,199
color 0,255,0 : boxf 500,120,599,219
color 0,0,255 : boxf 130,300,229,399
color 255,255,0 : boxf 520,320,619,419
color 255,0,255 : circle 280,200,360,280
make_window
onclick gosub *click
stop
*click
get_point mousex,mousey
if (mx>=280)&(mx<=360)&(my>=200)&(my<=280) { //丸をクリックした場合
mode++ : if mode>3 : mode=0
make_window
//マウスカーソルの位置を丸の位置に移動させる
get_point2 mx,my : mouse2 mx,my
return
}
flag=0
if (mx>=100)&(mx<=199)&(my>=100)&(my<=199) {
flag=1 : s="赤がクリックされました"
}
if (mx>=500)&(mx<=599)&(my>=120)&(my<=219) {
flag=1 : s="緑がクリックされました"
}
if (mx>=130)&(mx<=229)&(my>=300)&(my<=399) {
flag=1 : s="青がクリックされました"
}
if (mx>=520)&(mx<=619)&(my>=320)&(my<=419) {
flag=1 : s="黄がクリックされました"
}
if flag {
gsel 1
color 255,255,255 : boxf 0,460,639,479
color 0,0,0 : pos 0,460 : mes s
reflect 0,460,639,20
}
return
#define ctype tern(%1,%2,%3) ((%2)-((%1)=0)*((%2)-(%3))) //%1が条件を満たしているなら%2を、満たしていないなら%3を返す
#deffunc make_window
gsel 0
screen 0,tern(mode\2,w_hei,w_wid),tern(mode\2,w_wid,w_hei),0,ginfo_wx1,ginfo_wy1
hdc0=hdc //hdc0はウィンドウのhdc。(ウィンドウを作り直すたびに取得する必要あり)
reflect 0,0,w_wid,w_hei
return
#deffunc get_point int mx0,int my0
switch mode
case 1
mx=my0 : my=w_hei-1-mx0
swbreak
case 2
mx=w_wid-1-mx0 : my=w_hei-1-my0
swbreak
case 3
mx=w_wid-1-my0 : my=mx0
swbreak
default
mx=mx0 : my=my0
swbreak
swend
return
#deffunc get_point2 int mx1,int my1
switch mode
case 1
mx=w_hei-1-my1 : my=mx1
swbreak
case 2
mx=w_wid-1-mx1 : my=w_hei-1-my1
swbreak
case 3
mx=my1 : my=w_wid-1-mx1
swbreak
default
mx=mx1 : my=my1
swbreak
swend
return
#deffunc reflect int s_x,int s_y,int s_w,int s_h
//grotateは回転角度が実数指定で、きっちり90度回転できるかどうか怪しいので、
//WinAPIのPlgBltで回転処理を行います。
//参考:https://motchy99.blog.fc2.com/blog-entry-60.html
switch mode
case 1
dx=w_hei-1-s_y-s_h
dy=s_x
point=dx+s_h,dy,dx+s_h,dy+s_w,dx,dy
swbreak
case 2
dx=w_wid-1-s_x-s_w
dy=w_hei-1-s_y-s_h
point=dx+s_w-1,dy+s_h-1,dx-1,dy+s_h-1,dx+s_w-1,dy-1
swbreak
case 3
dx=s_y
dy=w_wid-1-s_x-s_w
point=dx,dy+s_w,dx,dy,dx+s_h,dy+s_w
swbreak
default
dx=s_x : dy=s_y
point=dx,dy,dx+s_w,dy,dx,dy+s_h
swbreak
swend
PlgBlt hdc0,varptr(point),hdc1,s_x,s_y,s_w,s_h,0,0,0
gsel 0
if mode\2 {
redraw 1,dx,dy,s_h,s_w
} else {
redraw 1,dx,dy,s_w,s_h
}
return