Hello all
there is an example by Roland on how Unicode strings can be used
and it is located in the folder .\examples\Widechars in the oxygenbasicProgress.zip file
for example the HelloUnicode.o2bas is as below
$ filename "HelloUnicode.exe"
uses RTL64
' Note that this program uses Unicode and needs its strings
' to be wide string using the function wstring()
% CS_VREDRAW 1
% CS_HREDRAW 2
% IDI_APPLICATION 32512
% IDC_ARROW 32512
% WHITE_BRUSH 0
% SM_CXSCREEN 0
% SM_CYSCREEN 1
% WS_OVERLAPPEDWINDOW 0x00cf0000
% SW_SHOW 5
% WM_CLOSE 16
% WM_KEYDOWN 0x100
% WM_DESTROY 2
% SW_NORMAL 1
% WS_VISIBLE 0x10000000
% WS_CHILD 0x40000000
% WS_CHILDWINDOW WS_CHILD
type POINT
long x
long y
end type
'28 bytes
type MSG
sys hwnd
int message
sys wParam
sys lParam
dword time
POINT pt
end type
'40 bytes
type WNDCLASS
int style
sys lpfnwndproc
int cbClsextra
int cbWndExtra
sys hInstance
sys hIcon
sys hCursor
sys hbrBackground
sys lpszMenuName
sys lpszClassName
end type
extern lib "Kernel32.dll"
! GetCommandLine "GetCommandLineW" '0
! GetModuleHandle "GetModuleHandleW" '1
end extern
extern lib "User32.dll"
! CreateWindowEx "CreateWindowExW" '12
! DefWindowProc "DefWindowProcW" '4
! DispatchMessage "DispatchMessageW" '1
! GetClientRect '2
! GetMessage "GetMessageW" '4
! GetSystemMetrics '1
! LoadIcon "LoadIconW" '2
! LoadCursor "LoadCursorW" '2
! PostQuitMessage '1
! RegisterClass "RegisterClassW" '1
! SendMessage "SendMessageW" '4
! SetWindowText "SetWindowTextW" '2
! ShowWindow '2
! TranslateMessage '1
! UpdateWindow '1
end extern
extern lib "GDI32.dll"
! GetStockObject '1
end extern
declare function WinMain(sys inst, prevInst, asciiz2*cmdline, sys show) as sys
declare sub getwstrings()
'=========
'MAIN CODE
'=========
dim cmdline as wchar ptr, hInstance as sys
@cmdline=GetCommandLine
hInstance=GetModuleHandle 0
sys lbl[5]
wstring hellos[5]
'
'WINDOWS START
'=============
'
WinMain hInstance,0,cmdline,SW_NORMAL
end
function WinMain(sys inst, prevInst, asciiz2*cmdline, sys show) as sys
WndClass wc
MSG wm
sys hwnd, Wwd, Wht, Wtx, Wty, Tax
wstring classname="Demo"
wc.style = CS_HREDRAW or CS_VREDRAW
wc.lpfnWndProc = @WndProc
wc.cbClsExtra =0
wc.cbWndExtra =0
wc.hInstance =inst
wc.hIcon=LoadIcon 0, IDI_APPLICATION
wc.hCursor=LoadCursor 0,IDC_ARROW
wc.hbrBackground = GetStockObject WHITE_BRUSH
wc.lpszMenuName =null
wc.lpszClassName = strptr classname
RegisterClass (@wc)
' Size of the Main window
Wwd = 320 : Wht = 200
Tax = GetSystemMetrics SM_CXSCREEN
Wtx = (Tax - Wwd) /2
Tax = GetSystemMetrics SM_CYSCREEN
Wty = (Tax - Wht) /2
' draw the Main window
hwnd = CreateWindowEx 0,wc.lpszClassName, wstring("OXYGEN BASIC"),WS_OVERLAPPEDWINDOW,Wtx,Wty,Wwd,Wht,0,0,inst,0
' do the labels note that it needs wstring("static") bcos this is a unicode program
lbl[1]=CreateWindowEx(0, wstring("static"), wstring("Hello World"),WS_CHILDWINDOW|WS_VISIBLE, 20, 10,200,25, hwnd,0,inst,0)
lbl[2]=CreateWindowEx(0, wstring("static"), "",WS_CHILDWINDOW|WS_VISIBLE, 20, 35,200,25, hwnd,0,inst,0)
lbl[3]=CreateWindowEx(0, wstring("static"), "",WS_CHILDWINDOW|WS_VISIBLE, 20, 60,200,25, hwnd,0,inst,0)
lbl[4]=CreateWindowEx(0, wstring("static"), "",WS_CHILDWINDOW|WS_VISIBLE, 20, 85,200,25, hwnd,0,inst,0)
lbl[5]=CreateWindowEx(0, wstring("static"), "",WS_CHILDWINDOW|WS_VISIBLE, 20,110,200,25, hwnd,0,inst,0)
' read in the Unicode strings from the multi.txt file
getwstrings()
' display these text strings
SetWindowText(lbl[2], hellos[4]) 'Grecian
SetWindowText(lbl[3], hellos[3]) 'Japanese
SetWindowText(lbl[4], hellos[2]) 'Korean
SetWindowText(lbl[5], hellos[1]) 'Armenian
ShowWindow hwnd,SW_SHOW
UpdateWindow hwnd
sys bRet
do while bRet := GetMessage (@wm, 0, 0, 0)
if bRet = -1 then
'show an error message
else
TranslateMessage @wm
DispatchMessage @wm
end if
wend
end function
function WndProc ( hWnd, wMsg, wParam, lparam ) as sys callback
select wMsg
case WM_DESTROY
PostQuitMessage 0
case WM_KEYDOWN
Select wParam
Case 27 : SendMessage hwnd, WM_CLOSE, 0, 0 'ESCAPE
End Select
case else
function=DefWindowProc hWnd,wMsg,wParam,lParam
end select
end function ' WndProc
'===========================
' read in the Unicode strings from the multi.txt file
sub getwstrings()
'very simple
int n=0
int p1=1, p2, le
wstring wcrlf=wchr(13)+wchr(10)
wstring txt=(wstring) getfile "multi.txt"
if len(txt)=0 then mbox "Cannot load multi.txt"
while 1
p2=instr(p1,txt, wcrlf)
if p2=0 then exit while
le=p2-p1+1
n+=1
hellos[n]=mid(txt,p1,le)
p1=p2+2 'wcrlf'
wend
end sub
in this program he redefine the WinAPI functions wide using
extern lib "Kernel32.dll"
! GetCommandLine "GetCommandLineW" '0
! GetModuleHandle "GetModuleHandleW" '1
end extern
extern lib "User32.dll"
! CreateWindowEx "CreateWindowExW" '12
! DefWindowProc "DefWindowProcW" '4
! DispatchMessage "DispatchMessageW" '1
! GetClientRect '2
! GetMessage "GetMessageW" '4
! GetSystemMetrics '1
! LoadIcon "LoadIconW" '2
! LoadCursor "LoadCursorW" '2
! PostQuitMessage '1
! RegisterClass "RegisterClassW" '1
! SendMessage "SendMessageW" '4
! SetWindowText "SetWindowTextW" '2
! ShowWindow '2
! TranslateMessage '1
! UpdateWindow '1
end extern