Oxygen Basic
Programming => Example Code => General => Topic started by: Arnold on April 02, 2014, 07:47:05 AM
-
After having studied many of the examples supplied with Oxygenbasic I finally started an own project (learning by doing). My intention was to run the examples of the theForger's Win32 Api tutorial in Oxygenbasic.
To my surprise it turned out that porting the examples from C to Oxygenbasic was not too difficult. So maybe there is some interest in reading the tutorial and experiment with the examples. Please pay attention to the readme.txt
If the zip file is unzippeded correctly there will be a directory "theForger_o2h" with several subdirectories. The structure of the subfolders reflect the structure of the tutorial. There are the following distinctions:
DirName file.o2bas runs directly with gxo2.exe
DirName_d file.o2bas runs with gxo2 but needs a resource.dll to work correctly
DirName_e file.o2bas must be compiled and linked with a resource file to an executable
Each subdirectory contains batch files to build and run the correspondent example file. If the path for Oxygenbasic is not c:\Oxygenbasic, then this must be corrected in _util/getpath.bat.
Although the programs run as expected on my system, perhaps the more experienced users of Oxygenbasic could help a little bit with checking the examples. I would like to create some templates for further projects.
Are there logical errors in the structure of the examples?
Are there places where I could use built-in functions of Oxygenbasic?
For some examples I used $/inc/FileDialog.inc. Maybe there are other include files which could also be used?
Roland
.
-
Maybe there are other include files which could also be used?
If you whish you can try mine awinh.inc include file which is mostly oriented to
win32 GUI functions.
Here is minimum code for GUI program in Oxygen Basic with awinh.inc .
$ Filename "skeleton.exe" ' Oxygen Basic
include "RTL32.inc"
include "awinh.inc"
INT win,x=0,y=0,w=400,h=300,wstyle = WS_MINMAXSIZE
win=SetWindow("Skeleton GUI App...",x,y,w,h,0,wstyle)
Wait() 'message loop
Function WndProc (sys hwnd,wmsg,wparam,lparam) as sys callback
SELECT hwnd
CASE win
Select wmsg
CASE WM_CLOSE
CloseWindow(win)
EndProgram
End Select
END SELECT
RETURN Default
END FUNCTION
.
-
Hi Aurel,
sorry for the delayed answer. I had to take care for some other duties.
I already use a libray in another language. I can do a lot of nice things with it, but at some time there is a limit. Therefore I want to start it at a lower level, and Oxygenbasic seems to be the right tool for this purpose.
As the aspect of using resource dlls is new for me too, I sat down and started a little project. What is your code for this little (nonsense) app. This is mine:
$ filename "controls.exe"
includepath "$/inc/"
'#include "RTL32.inc"
'#include "RTL64.inc"
#include "MinWin.inc"
includepath ""
#include "res/resource.h"
s = error()
if s then
print s
end
end if
'=======================
'MAIN CODE
'=======================
dim nCmdline as asciiz ptr, hInstance as sys
&nCmdline = GetCommandLine
hInstance = GetModuleHandle(0)
'========================================'
% IMAGE_BITMAP = 0
% PBM_SETPOS = 1026
% SB_SETPARTS = 1028
% SB_SETTEXT = 1025
% SBARS_SIZEGRIP = 256
% TB_ADDBITMAP = 1043
% TB_ADDBUTTONS = 1044
% TB_BUTTONSTRUCTSIZE = 1054
% TBSTATE_ENABLED = 4
% TBSTYLE_BUTTON = 0
% STATUSCLASSNAME = "msctls_statusbar32"
% TOOLBARCLASSNAME = "ToolbarWindow32"
type TBADDBITMAP
sys hInst
sys nID
end type
type TBBUTTON
int iBitmap
int idCommand
BYTE fsState
BYTE fsStyle
BYTE bReserved[2]
dword dwData
int iString
end type
! GetDlgItem lib "user32.dll" alias "GetDlgItem" (sys hDlg, nIDDlgItem) as sys
! InitCommonControls lib "comctl32.dll" alias "InitCommonControls" ()
! LoadMenu lib "user32.dll" alias "LoadMenuA"(sys hInstance, sys lpMenuName) as sys
function DialogBox(sys hInstance, lpTemplate, hWndParent, lpDialogFunc) as sys
return DialogBoxParam(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0)
end function
InitCommonControls()
sys hResources = loadlibrary "controls.dll"
if not hResources then print "Error: controls.dll not found"
function DlgProc(sys hwnd, Message, wParam, lParam) as bool callback
switch Message
case WM_INITDIALOG
// This is where we set up the dialog box, and initialise any default values
hMenu=LoadMenu(hResources, IDR_MAINMENU)
SetMenu(hwnd, hMenu)
TBADDBITMAP tbab
TBBUTTON tbb[14]
hToolBar = CreateWindowEx( 0, TOOLBARCLASSNAME,
NULL,
WS_CHILD or WS_VISIBLE, 0, 0, 0, 0,
hWnd,
IDC_TBR1,
hResources, NULL )
if hToolBar = NULL then
MessageBox(hwnd, "Could not create tool bar.", "Error", MB_OK or MB_ICONERROR)
end if
sys hToolBitmap = LoadImage( hResources, ID_TBBmp, IMAGE_BITMAP, 0, 0, 0 )
if not hToolBitmap then
Messagebox(hWnd, "Load Bitmap Failed!","Error!",0 )
end if
// Send the TB_BUTTONSTRUCTSIZE message, which is required for
// backward compatibility.
SendMessage( hToolBar, TB_BUTTONSTRUCTSIZE, sizeOf(TBBUTTON), 0 )
tbab.hInst = NULL
tbab.nID = hToolBitmap
SendMessage(hToolBar, TB_ADDBITMAP, 14, &tbab)
for x=1 to 14
tbb[x].iBitmap = x-1
tbb[x].fsState = TBSTATE_ENABLED
tbb[x].fsStyle = TBSTYLE_BUTTON
next x
SendMessage( hToolBar, TB_ADDBUTTONS, spanof(tbb), &tbb )
// Create Status bar
sys hStatus
int statwidths[] = {100, -1}
hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL,
WS_CHILD or WS_VISIBLE or SBARS_SIZEGRIP, 0, 0, 0, 0,
hwnd, IDC_SBR1, GetModuleHandle(NULL), NULL)
SendMessage(hStatus, SB_SETPARTS, 2, &statwidths)
SendMessage(hStatus, SB_SETTEXT, 0, "Hi there :)")
case WM_COMMAND
switch loword(wParam)
case IDC_StartButton
hProgress = GetDlgItem(hwnd, IDC_Progressbar)
for x = 1 to 100
SendMessage(hProgress, PBM_SETPOS, x, 0)
Sleep(20)
next x
Sleep(1000)
SendMessage(hProgress, PBM_SETPOS, 0, 0)
case IDM_Close
EndDialog(hwnd, 0)
case IDC_CloseButton
EndDialog(hwnd, 0)
case IDM_About
MessageBox(hwnd, "Tiny Application" + chr(13) + "Does nothing!",
"About Tiny Application", MB_OK)
end switch
case WM_CLOSE
EndDialog(hwnd, 0)
case else
return FALSE
end switch
return TRUE
end function
function WinMain(sys nCmdShow) as sys
return DialogBox(hResources, IDD_DLG1, NULL, @DlgProc)
end function
'WINDOWS START
'=============
'
WinMain(SW_NORMAL)
This app does not much. It shows a Menu, a Toolbar, some controls. You can start a Progressbar, close the app via menu or button. I was not in the mood for handling the toolbar. And this should be enough for about 90 lines of code.
In my opinion the problem is not to create the many controls which exist, but the day after. If I should manage some of the many messages and notifications some day I would be happy. Maybe I should continue reading Petzold's book.
Roland
.
-
Hi Roland,
As the aspect of using resource dlls is new for me too, I sat down and started a little project.
Is using standard control theming in your O2 resource plans?
Example
(http://files.allbasic.info/ScriptBasic/cust_w7.png)
-
Hehe John,
I was about to ask the same question a few minutes before you published yours but then I deleted my message. :)
In Windows, a (theming) manifest can be either precompiled into the binary (dll or exe) directly or saved as a standalone file under the same name plus the .manifest extension (say, mybinary.dll.manifest) in the folder together with the binary to exactly the same effect.
I guess doing either of these manually for a small test-case library (unless the compiler does it for you automatically) would be just an extra PITA. :)
-
Hi Arnold
-What is your code for this little (nonsense) app. This is mine?
First of all ,i don't use DIALOG type of windows forms
because they have special purpose.
Second i don't use this way of application structure which
means put everything in functions.
I prefer to hold my GUI functions inside include file.
And if you look into ASciEdit2 source code you will see how i create controls. ;)
-
Hi John,
your example looks very nice. Was it done with ScriptBasic?
BTW I do not want to compete with anyone or anything. My capabilities would be too much limited. All I would like to do is learning a little bit more about doing some things in Windows using Oxygenbasic.
Roland
-
Arnold
This thing what John presented here is GUI program created with IUP gui framework.
And there is no competition between some thirdParty gui-s with native winApi
which is a full-powered GUI system for Windows.
Anyway you can create GUI programs in Oxygen on many ways using native winApi
or using some other alternatives like is iup,wx,..etc
Oxygen is a great tool to lern how things work on low-level .
In my include i use few methods for creating functions and some are modified versions
of VB functions and some not.
-
Charles,
I was going to point Roland to the ProjectB\IUP folder for examples of using IUP with O2. I get this error dialog with each example I try in that folder.
(http://files.allbasic.info/O2/iuperror.png)
Would that Hex2Bin.sb example be toying with the idea of using SB as an assembler?
-
Hi John,
This is bust (in iup.h), and so is my brain!
typedef int (*Icallback)(Ihandle*);
But this works:
typedef sys Icallback
-
Can this be handled with a #ifdef so the iup.h can be used with C or O2?
-
It will be fixed on the next update.
-
typedef int (*Icallback)(Ihandle*);
The biggest problem with C is its short circuit syntax rules that make it unparsable to anything other than the compilers that allow it.
-
typedef int (*Icallback)(Ihandle*);
I think void* would be less problematic. Ther is no advantage in being so specific.
Also: Int is not correct for 64 bit systems, since a function pointer is returned.
This would simplify the IUP headers:
typedef void *handle, *pCallback;
oxygen:
typedef sys handle, pCallback
-
This would simplify the IUP headers:
typedef void *handle, *pCallback;
This worked for me.
// typedef int (*Icallback)(Ihandle*);
typedef void *Icallback, *Ihandle;