Here is the 'hard' way. Perhaps not as hard as I initially thought it would be.
winapp
module surge_arrester_mod
use clrwin
implicit none
integer, parameter :: dp = kind(1.d0)
! Data points correspond to IEEE WG 3.4.11
integer, parameter :: n_a0 = 12
real(dp), parameter :: a0_ka(n_a0) = [0.0000001d0,0.000001d0,0.00001d0,0.0001d0,0.001d0,0.01d0,0.1d0,1.0d0,&
3.816d0,10.d0,20.d0,100.d0]
real(dp), parameter :: a0_a(n_a0) = a0_ka*1000.d0
real(dp), parameter :: a0_vpu(n_a0) = [1.10d0,1.28d0,1.33d0,1.37d0,1.39d0,1.42d0,1.52d0,1.65d0,1.75d0,1.90d0, &
2.10d0,3.69d0]
integer, parameter :: n_a1 = 12
real(dp), parameter :: a1_ka(n_a1) = [0.0000001d0,0.000001d0,0.00001d0,0.0001d0,0.001d0,0.01d0,0.1d0,1.0d0, &
3.816d0,10.0d0,20.0d0,100.0d0]
real(dp), parameter :: a1_a(n_a1) = a1_ka*1000.d0
real(dp), parameter :: a1_vpu(n_a1) = [0.72d0,1.00d0,1.08d0,1.11d0,1.15d0,1.18d0,1.23d0,1.36d0,1.45d0,1.55d0, &
1.65d0,1.95d0]
real(dp) :: vr0 = 458.75d0, vr1 = 570.d0 !Rated voltages
real(dp) a0_kv(n_a0), a1_kv(n_a1)
integer :: n_pl(2) = [n_a0,n_a1]
integer :: uid_gr = 1
character(len=12), parameter :: pl_scale(4) = ['Lin X, Lin Y','Log X, Lin Y','Lin X, Log Y','Log X, Log Y']
integer :: pl_scale_selected = 1
contains
integer function gui()
integer iw
a0_kv = a0_vpu*vr0 ; a1_kv = a1_vpu*vr1
iw = winio@('%mn[Exit]&','exit')
iw = winio@('%bg&',rgb@(220,220,220))
iw = winio@('%fn[Consolas]&')
iw = winio@('%ob&')
iw = winio@('%`gr[white]&',800,500,uid_gr)
iw = winio@('%`bg[white]%`^ls&',pl_scale,size(pl_scale,kind=3),pl_scale_selected,change_pl_scale_cb)
iw = winio@('%cb&')
iw = winio@('%sc&',change_pl_scale_cb)
iw = winio@('')
gui = 1
end function gui
integer function change_pl_scale_cb()
integer iw, i
integer :: uid_pl = 2
i = create_graphics_region@(uid_pl,800,500)
i = select_graphics_region@(uid_pl)
call winop@('%pl[native,n_graphs=2,gridlines,smoothing=5,frame]')
call winop@('%pl[x_array,independent]')
if (pl_scale_selected .eq. 2) call winop@('%pl[scale=linear_log]')
if (pl_scale_selected .eq. 3) call winop@('%pl[scale=log_linear]')
if (pl_scale_selected .eq. 4) call winop@('%pl[scale=log_log]')
call winop@('%pl[colour=red,symbol=1,tension=0.2]')
call winop@('%pl[colour=blue,symbol=1,tension=0.2]')
call winop@('%pl[width=2]')
call winop@('%pl[x_axis=Amps,y_axis=kV]')
iw = winio@('%pl[external]&',n_pl,a0_a,a0_kv,a1_a,a1_kv)
iw = winio@('')
i = copy_graphics_region@(uid_gr,1,1,800,500,uid_pl,1,1,800,500,13369376)
i = delete_graphics_region@(uid_pl)
change_pl_scale_cb = 1
end function change_pl_scale_cb
end module surge_arrester_mod
program main
use surge_arrester_mod
i = gui()
end program main