• Welcome to Jose's Read Only Forum 2023.
 

Use of Unicode strings

Started by Chris Chancellor, October 09, 2018, 06:49:00 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Chris Chancellor

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



Chris Chancellor

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