WinBlitz3D full GUI intergration to blitz3d

Blitz3D Forums/Blitz3D Programming/WinBlitz3D full GUI intergration to blitz3d

Hello All

WinBlitz3D has undergone a total rewrite and now offers full GUI intergration to blitz3d, standard winapi gui support to that of a level close to blitzplus as been added.

for a demo of mixed gui and standard gui intergration can be downloaded from the link below.
Download WinBlitz3D Demo

your feedback is welcome.

thanks
kev

well I only can say it looks awesome! great work!

My mouse cursor (slower system) is now stuttering, that is something I noticed.

looking good, how long till this is released?

@Jeroen, thanks for the comments. what system spec's are you testing on?

@Chevron, soon. ive still to finish the docs. if the public demo reports no problems then the final version will be ready once there done.

thanks
kev

its nice that you have also added column lists, which Blitzmax even doesnt have ;-)

I am testing this on a different computer than my own, which is a Celeron 1.7 ghz, 768 mb memory, Windows XP and a Geforce 2 MX. (Yuck!)

Get an unhandled exception when I exit the demo (mixed). One of those send, dont send errors.

@Jeroen, events are queued so it would be possable to disable the mouse move events. these are generated when the mouse is moved over any gadget. this will not affect blitz3d own mouse movement. or maybe a flushevents() would keep the queue from building up.

@Dark Half, does that happen each time you quit?

some more information

when gadgtes are created you pass a null for there default style. but if req you can pass standard api const's and build the gadget any way you require. also its possable to create all windows and gadgets hidden before showing them.


kev

And thats what I'm really waiting for ... nice demos ..

thanks HyderMan.

having doing some debugging ive looked over the crash Dark Half reported. and ive now fixed this. it was a problem when a popup window was opend ie. 'splash window' not beein destroyed when the demo's ended.

ive uploaded a fixed version.

kev

This is pretty cool. How much will it cost?

thanks Boiled Sweets, ive no price just yet.

heres the start of a form editor being wrote by one of winblitz3d's beta testers 'Danny van der Ark'

Download SCHNOK!

press F1 for help

thanks
kev

That's pretty cool. It's working fine and i wait for release. The other site: i can kill my own gui project :(

...but hey...now i have more time for other projects.

thanks for the feedback East-Power-Soft, nice gui you have there.

kev

It seems keyboard input isn't working here, apart from that it looks great!

Very nice, a real Load and Save dialogue window :) That could be very handy in one of my projects.

Yeah, We've been waiting for this for a long while.

I'm going to assume it doesnt work fullscreen though, am i right? I hope it does work, thatd be great :D

@fredborg, blitz3d's own keyboard/mouse commands working fine. gadget mouse working, there keyboard events allmost done.

@Cygnus, sorry no full screen.

thanks
kev

looks nice

by the way, the Enter key doesn't seem to do anything in any boxes. I mean, it should trigger the OK button's shouldn't it? Can that be defined in the code?

Also question - can you change the colors it uses? If you don't want it to look just like the Windows desktop, I mean.

also, haven't tried it but just noticing from other guis... file selectors rarely remember the previously selected folder. they tend to open at the root, or the current folder. root is useless and annoying. current folder, less than useful too. even in major applications they sometimes open in their root, which is not where i would store files. i move to another folder, open my file, then go to save it, it sticks me back in the root. it's a waste of user time. even max 8 does annoying crap like that. you'd think they'd have figured it out by now.

when will we be able to use this? (some docs, gui editor being usable, able to incorporate it into our proggies)

it looks like a winner so far.

hi ryan


by the way, the Enter key doesn't seem to do anything in any boxes. I mean, it should trigger the OK button's shouldn't it? Can that be defined in the code?



the keyboard hook is still being coded in, WaitEvent() returns $101 for the keypress. EventData() still needs more work for the keycode that was pressed.


Also question - can you change the colors it uses? If you don't want it to look just like the Windows desktop, I mean.



yes its possable to change some but not all gadgets colors.

more info.

ive just finished adding system tray icon support, with context menu support. with a little extra coding this now enables gadgets to have there own context menus also. drag and drop coming also.

ummm i must stop coding and start finishing the docs. for the final version. docs are one of my most hated part of coding this gui lib.

thanks
kev

On my Athlon 64 3000+ system it is smooth as a glass baby's rear end... on my wifes DURON (duran duran) system it does stutter some but she only has 256mb mem and an ATI RAD 7000

Demos look good. This would be great stuff to add to Decorator!

hi all

just a update the above examples now have been updated. newly added is system tray icon support. any gadget context menus and multi-file drag and drop.(added to the runtimewindow) although any window or gadget can use drag and drop.

ive also added a flushevents() to the mousemove events, for the people what has stutter movments. can you retest and see if its now not stuttering.

thanks
kev

Going good.

(on the WinBlitz3DGUIDemo.exe)
The listbox doesn't seem to select items and the Radio buttons will not select.

Intersted to see how it pans out. :)

thanks lee


The listbox doesn't seem to select items


they should on a double click? does even double click not generate a messagebox.


the Radio buttons will not select.


theres some problems with auto radio updating, they can be used but you have to update there status yourself using SetButtonState()

thanks
kev

Hi Kev,

they should on a double click? does even double click not generate a messagebox.


Double clicking does select one, the first time.

Single clicking makes it act like a text box with a cursor line. After that, the list will not scroll or accept any other input. Either way, no messagebox is shown.

theres some problems with auto radio updating, they can be used but you have to update there status yourself using SetButtonState()


Fair enough :)

thanks lee

is there any order in the way to generate this problem, ie clicking gadgets in any order? and it does not happen when testing Winblitz3DMixedGUIDemo.exe?

as it does not happen here. other than that i might have to revert back to no icons in the listbox gadgets.

kev

Just launch the demo (WinBlitz3DGUIDemo.exe)

Go to the left hand window (the black one)

Then (single) click an item in the list box in the left hand window (The cursor line appears).

Use the up/down arrow keys on the keyboard to try to move down the list.

This appears to trigger the list be become unresponsive.

[edit]

It looks like any keyboard input to any of the listboxes disables them.

thank lee

i still cant recreate it? anyone else able to? the only diffance im using winxp sp1. i will update to sp2 and see if the problem happens.


thanks
kev

Not sure if it helps, but once this happens, the repaint events are disabled as well, so when another window occludes the list box, it will go white and no longer repaint or respond to events.

Sounds like the event queue for the gadget is getting clogged somehow.

hi lee

ok im not sure but did you try the last version? before the update. if so did it function correct? its possable that flushing the mousemove events might have messed the listbox events.

ive put a example below without flushing the mouse events, can you try this please. just copy to the same folder as the download you was testing.

Download Test

thanks
kev

Hi Kev,

Same problem. No difference between the versions. The one I was testing was the most recent one with the tray.

ok thanks lee, check your email.

kev

I've found the bug in the old WinBlitz3D where it doesnt response when i close the window. It works now!!!
It seems that the bug was in WaitEvent(), because i played a little around with it and now it works. Code here, and i've added a useful command PeekEvent():

Function WaitEvent(events=1)
	

	apiSetWindowLong runtimewindow,GWL_WNDPROC,GRAB_BankAddr(WinProcBank)	
	ret_event=0
	.again
	PokeInt WinProcReturn,$04,0
	apiGetMessage(WinProcReturn,0,0,0)
	apiTranslateMessage(WinProcReturn) 
	apiDispatchMessage(WinProcReturn) 
			
	eventsource_RAW = 0
	eventdata_RAW = 0
	eventX_RAW = 0
	eventY_RAW = 0

	this_event = PeekInt(WinProcReturn,$04)
	
	
	Select this_event

		Case WM_RBUTTONUP
			ret_event = $202
			;
			If apiIsWindow(PeekInt(WinProcReturn,0)) <> 0 Then
			
				Gadget_BankDATA = apiGetWindowLong(PeekInt(WinProcReturn,0),GWL_USERDATA)
				If Gadget_BankDATA > 0 Then 
					If PeekInt(Gadget_BankDATA,$00) = PeekInt(WinProcReturn,0)
						;PopUpGadgetMenu(PeekInt(Gadget_BankDATA,$00))
					EndIf
				EndIf
				
			EndIf
			
		Case WM_KILLFOCUS

			apiGetMessage(WinProcReturn,0,0,0)
			apiTranslateMessage(WinProcReturn) 
			apiDispatchMessage(WinProcReturn) 
		
			ret_event = $401
			eventsource_RAW = apiGetFocus()
						
		Case WM_HSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
			
			;WM_HSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_HSCROLL_pos,True)
			
							
		Case WM_VSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))

			;WM_VSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_VSCROLL_pos,True)
	
			
		Case WM_ACTIVATE
		
			If LOWORD(PeekInt(WinProcReturn,$08)) = WA_CLICKACTIVE Then
				ret_event = $804
				eventsource_RAW = PeekInt(WinProcReturn,$00)
			EndIf
			
		Case WM_ACTIVATEAPP
			eventName$ = "WM_ACTIVATEAPP"
						
		Case WM_NOTIFY
			
			
			
			If a = 1 Then
			;	PokeByte b,0,$CC
			EndIf
			a = a + 1	
			
			nmhdr_addr = PeekInt(WinProcReturn,$0C)
			apiCallWindowProcF b,0,0,GRAB_BankAddr(NMHDR),nmhdr_addr
			;Notify PeekInt(NMHDR,$04)		
				
			Select PeekInt(NMHDR,$08)
			
				Case NM_CLICK,TCN_SELCHANGE ; tabber
					ret_event = $401
					eventsource_RAW = PeekInt(NMHDR,$00)
					eventdata_RAW = apiSendMessage(eventsource_RAW,TCM_GETCURSEL,0,0)
																					
			Default
			;	ret_event = $401
			;	eventsource_RAW = PeekInt(NMHDR,$00)
			End Select
											
			;Notify "here "+PeekInt(NMHDR,$00)+" "+toolbar
			
																
		Case WM_COMMAND
								
			; check menu selected or gadget event
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			If eventsource_RAW = 0 Then
				If HIWORD(PeekInt(WinProcReturn,$08)) = 0 Then
					eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
					If eventdata_RAW > 0 Then
						ret_event = $1001
					EndIf	
				EndIf
			Else
				ret_event = $401
			EndIf	
			
			;Notify HIWORD(PeekInt(WinProcReturn,$08))
			
		Case WM_SIZE
			ret_event = $802
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
						
			; reposition status bars.
			If apiIsWindow(eventsource_RAW) <> 0 Then
				GAD_ID = apiGetWindowLong(eventsource_RAW,GWL_USERDATA)
				If GAD_ID > 0 Then
					statusbar = PeekInt(GAD_ID,4)
					If statusbar > 0 Then
						;SetGadgetShape statusbar,0,0,GadgetWidth(eventsource_RAW),GadgetHeight(statusbar)
						;apiInvalidateRect statusbar,0,True
						;apiSendMessage statusbar,WM_SIZE,0,0
					EndIf
				EndIf
			EndIf
						
		Case WM_MOVE
			
			ret_event = $801
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
		
		Case WM_CLOSE
		DebugLog "WM_CLOSE"
				
		Case WM_DESTROY
		DebugLog "WM_DESTROY"
			ret_event = $803
			eventsource_RAW = PeekInt(WinProcReturn,$00)
											
	End Select

	; cleanup events
	PokeInt(WinProcReturn,$00,0)
	PokeInt(WinProcReturn,$04,0)
	PokeInt(WinProcReturn,$08,0)
	PokeInt(WinProcReturn,$0C,0)
	If ret_event=0 Then Goto again
	
	apiSetWindowLong runtimewindow,GWL_WNDPROC,WinProcBlitz3D
	
	Return ret_event
	
End Function

Function PeekEvent(events=1)
	

	apiSetWindowLong runtimewindow,GWL_WNDPROC,GRAB_BankAddr(WinProcBank)	
	
	ret_event=0
		
	apiPeekMessage(WinProcReturn,0,0,0,0)
	apiTranslateMessage(WinProcReturn) 
	apiDispatchMessage(WinProcReturn) 
			
	eventsource_RAW = 0
	eventdata_RAW = 0
	eventX_RAW = 0
	eventY_RAW = 0

	this_event = PeekInt(WinProcReturn,$04)
	
	
	Select this_event

		Case WM_RBUTTONUP
			ret_event = $202
			;
			If apiIsWindow(PeekInt(WinProcReturn,0)) <> 0 Then
			
				Gadget_BankDATA = apiGetWindowLong(PeekInt(WinProcReturn,0),GWL_USERDATA)
				If Gadget_BankDATA > 0 Then 
					If PeekInt(Gadget_BankDATA,$00) = PeekInt(WinProcReturn,0)
						;PopUpGadgetMenu(PeekInt(Gadget_BankDATA,$00))
					EndIf
				EndIf
				
			EndIf
			
		Case WM_KILLFOCUS

			apiGetMessage(WinProcReturn,0,0,0)
			apiTranslateMessage(WinProcReturn) 
			apiDispatchMessage(WinProcReturn) 
		
			ret_event = $401
			eventsource_RAW = apiGetFocus()
						
		Case WM_HSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
			
			;WM_HSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_HSCROLL_pos,True)
			
							
		Case WM_VSCROLL
			ret_event = $401
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))

			;WM_VSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL) 
			;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_VSCROLL_pos,True)
	
			
		Case WM_ACTIVATE
		
			If LOWORD(PeekInt(WinProcReturn,$08)) = WA_CLICKACTIVE Then
				ret_event = $804
				eventsource_RAW = PeekInt(WinProcReturn,$00)
			EndIf
			
		Case WM_ACTIVATEAPP
			eventName$ = "WM_ACTIVATEAPP"
						
		Case WM_NOTIFY
			
			
			
			If a = 1 Then
			;	PokeByte b,0,$CC
			EndIf
			a = a + 1	
			
			nmhdr_addr = PeekInt(WinProcReturn,$0C)
			apiCallWindowProcF b,0,0,GRAB_BankAddr(NMHDR),nmhdr_addr
			;Notify PeekInt(NMHDR,$04)		
				
			Select PeekInt(NMHDR,$08)
			
				Case NM_CLICK,TCN_SELCHANGE ; tabber
					ret_event = $401
					eventsource_RAW = PeekInt(NMHDR,$00)
					eventdata_RAW = apiSendMessage(eventsource_RAW,TCM_GETCURSEL,0,0)
																					
			Default
			;	ret_event = $401
			;	eventsource_RAW = PeekInt(NMHDR,$00)
			End Select
											
			;Notify "here "+PeekInt(NMHDR,$00)+" "+toolbar
			
																
		Case WM_COMMAND
								
			; check menu selected or gadget event
			eventsource_RAW = PeekInt(WinProcReturn,$0C)
			If eventsource_RAW = 0 Then
				If HIWORD(PeekInt(WinProcReturn,$08)) = 0 Then
					eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
					If eventdata_RAW > 0 Then
						ret_event = $1001
					EndIf	
				EndIf
			Else
				ret_event = $401
			EndIf	
			
			;Notify HIWORD(PeekInt(WinProcReturn,$08))
			
		Case WM_SIZE
			ret_event = $802
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
						
			; reposition status bars.
			If apiIsWindow(eventsource_RAW) <> 0 Then
				GAD_ID = apiGetWindowLong(eventsource_RAW,GWL_USERDATA)
				If GAD_ID > 0 Then
					statusbar = PeekInt(GAD_ID,4)
					If statusbar > 0 Then
						;SetGadgetShape statusbar,0,0,GadgetWidth(eventsource_RAW),GadgetHeight(statusbar)
						;apiInvalidateRect statusbar,0,True
						;apiSendMessage statusbar,WM_SIZE,0,0
					EndIf
				EndIf
			EndIf
						
		Case WM_MOVE
			
			ret_event = $801
			eventsource_RAW = PeekInt(WinProcReturn,$00)
			EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
			EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
		
		Case WM_CLOSE
		DebugLog "WM_CLOSE"
				
		Case WM_DESTROY
		DebugLog "WM_DESTROY"
			ret_event = $803
			eventsource_RAW = PeekInt(WinProcReturn,$00)
											
	End Select

	; cleanup events
	PokeInt(WinProcReturn,$00,0)
	PokeInt(WinProcReturn,$04,0)
	PokeInt(WinProcReturn,$08,0)
	PokeInt(WinProcReturn,$0C,0)
	;If ret_event=0 Then Goto again  -- THIS IS PEEKEVENT SO JUST CONTINUE WITHOUT ANY EVENT!
	
	apiSetWindowLong runtimewindow,GWL_WNDPROC,WinProcBlitz3D
	
	Return ret_event
	
End Function



But are there anyone who knows how i can make the windows dont disapear when i press their close buttons, so i can ex. make a "Save before quit?" box?

Not always, but sometimes the Blitz-Helpfiles help:
2D Category --> System --> AppTitle

Or for a more advanced way look under "User Input" for "Blitz Close" in the Code Archives
http://www.blitzbasic.com/codearcs/codearcs.php?code=832

price?

i mean the windows i create with WinBlitz3D. Not the runtime window. The windows i create myself. Like in B+. Then when you press close, they dont disappear. I want the WinBlitz3D-windows to do the same.

@Qimmer,

see http://www.winblitz3d.co.uk/forum/ might be an idea to post your working version. when WM_CLOSE is processed in the windows api winproc it auto calls defwindowproc(). to enable winblitz3d's include version to disable this would need to re-write the custom asm bytecode.

the .dll version that will be available soon does this along with losts more, to much to be listed here.


@Boiled Sweets
15 UK Pounds this includes full access to bug-fixes, updates. winblitz3d's .dll is currently very stable :) the user has full access to winapi gadgets on the runtimewindow or there own window. full control over all windows\gadgets winapi styles using standard constants.

when will it be available to buy? well im still waiting on the docs to be returned from one of winblitz3d's beta testers 'Mr P' and ive still to finish more example. although they are coming along.

kev