Rebar Control, Problem & FIX and dress-up
- Posted by jordah ferguson <jorfergie03 at yahoo.com> Jul 24, 2002
- 416 views
Hi Derek, I have found a serious bug in win32lib control - Rebar. It affects all the routines associated to the control, luckily very few people around use rebars. Matt Choose the wrong path having to use the lParam to store the ids of the Bands in the REBARBANDINFO structure. Reasons why: 1) Most or all of the band messages are flucky or return wrong results cause they require zero - based indeces of the bands and RB_IDTOINDEX always fails cause it relies on wID member of the REBARBANDINFO structure 2) The bands are unuable to support custom draw since they need wID not lParam 3) He has to do dirty look-ups in AddToBand to find correct bands instead of simply using RB_IDTOINDEX 4)its a bit more compatible, as you don't fall under this restrictive if directive #if (_WIN32_IE >= 0x0400) where the lParam lies Here is the full make-up/full fix to all rebar - related routines. Unless the lParam is explicitly needed in other routines associated with band, omit it and use wID, i have tested wID and it works! FIX (1) ======= Needed constant for fMask member constant RBBIM_ID = #00000100 Fix for the createEX You no longer need lParam, wID is needed. so use RBBIM_ID instead of RBBIM_LPARAM for fMask member and fill wID instead of lParam member. struct = struct_REBARBANDINFO( or_all( {RBBIM_ID, -- changed RBBIM_SIZE, RBBIM_TEXT, RBBIM_STYLE } ), or_all( { RBBS_CHILDEDGE, RBBS_GRIPPERALWAYS, styleFlags }), 0, 0, caption, 0, 0, 0, 0, cx, 0, id, --changed: wID member now holds the id 0, 0, 0, 0, 0, --changed: lParam nolonger needed wID does its work 0 ) FIX (2) ======= Needed constant for this fix constant RB_IDTOINDEX = (WM_USER + 16) In this fix, i remove the tideous look-ups using lParam, and produce cleaner code. All uncommented code is by Matt. i have left it there to just show you 'work made simple', plus i deleted unneeded declarations in the Proc. global procedure addToBand( integer id, integer band ) atom rb, -- Jordah: bandIndex -- End sequence size size = getCtlSize( id ) bandIndex = sendMessage(window_owner[band],RB_IDTOINDEX,band,0) -- -- numbands = sendMessage( window_owner[band], RB_GETBANDCOUNT, 0, 0 ) -- rb = acquire_mem(0, SIZEOF_REBARBANDINFO ) -- store( rb, REBARBANDINFO_fMask, RBBIM_LPARAM ) -- for i = 0 to numbands - 1 do -- VOID = sendMessage( window_owner[band], RB_GETBANDINFO, i, rb ) -- info = fetch( rb, REBARBANDINFO_lParam ) -- if info = band then -- numbands = i -- exit -- end if -- end for store( rb, REBARBANDINFO_hwndChild, window_handle[ id ] ) store( rb, REBARBANDINFO_lpText, getText( id ) )-- This is needed but won't work --until its Mask is specified.Below is a fix store( rb, REBARBANDINFO_cx, size[1] ) store( rb, REBARBANDINFO_cyMinChild, size[2] ) store( rb, REBARBANDINFO_fMask, or_all( { RBBIM_CHILD, RBBIM_CHILDSIZE,RBBIM_TEXT} )) -- Added Mask for band text store( rb, REBARBANDINFO_cbSize, SIZEOF_REBARBANDINFO ) -- store( rb, REBARBANDINFO_hwndChild, window_handle[ id ] )-- You already filled -- this. VOID = sendMessage( window_owner[band], RB_SETBANDINFO,bandIndex, rb )-- Changed release_mem( rb ) end procedure Fix (3) ======= Another historical fact of win32lib, "Some functions are denied their use" Why is it that in addToBand, the REBARBANDINFO structure had to be filled from scratch? Why deny struct_REBARBANDINFO() its use? Suggestion ========== Derek, i was just wondering is their a handler already in win32lib to simulate RBN_HEIGHTCHANGE for rebars. if not please add it so that incase rebar bands move and the Rebar resizes so could the clientarea of the window, just like you did 4 the status bar and Toolbar. The notification is desparately needed if you have multiple resizable-Rebars bands. It is very eazy to implement, though i'm not sure how i would elegantly place it in win32lib. in API, i simply call GETRECT() for the rebar-size then i adjust pointers holding the clientarea size. Then i invalidateRect() of the affected window. Other ===== Well, That is all for now on rebar controls. Actually Derek, The Rebar Control needs more routines to bring the best out of it. Just cause many people don't use it, it doesn't mean that id should be ignored and care about other controls. And to all win32lib users, start using this control to improve your GUI(Trust me the GUI looks good esp if Multiple bands are used) I'm currently looking up functions that are/or will be essential when users use rebars in their programs. And seeing how i can add them to existing code. Jordah Ferguson.