Re: Where do I call setHint for statusbar?
- Posted by Derek Parnell <ddparnell at bigpond.com> Mar 15, 2007
- 596 views
Actually the Win32lib is reasonable extendable. Here is a simple Fake StatusBar subsystem...
----- sb.e --------- include Win32lib.ew as win without warning sequence vWINList sequence vSBList sequence vFLDList sequence vFLDIDList vWINList = {} vSBList = {} vFLDList = {} vFLDIDList = {} -- Ensure 'statusbar' always spans the window. with trace procedure Resize_Window(integer self, integer event, sequence parms) integer id sequence lRect id = find(self, vWINList) if id = 0 then return end if id = vSBList[id] lRect = win:getRect(id) lRect[4] -= lRect[2] win:setRect(id, 0, {w32AltEdge, -lRect[4]}, 0.99999,lRect[4], 1) end procedure global function create(integer pParent, integer pHeight, object pFields) integer id integer sbHeight sequence lRect integer x integer lType integer lWidth integer lHeight id = find(pParent, vWINList) if id != 0 then return 0 end if if pHeight <= 0 then lHeight = win:getTextHeight(pParent, "M") + 10 else lHeight = pHeight end if id = win:createEx(Label, "", pParent, 0, 0, 0, lHeight, WS_BORDER, WS_EX_CLIENTEDGE) win:setHandler(pParent, w32HResize, routine_id("Resize_Window")) vWINList &= pParent vSBList &= id vFLDList &= {pFields} vFLDIDList &= {{}} if atom(pFields) then return id end if x = 0 for i = 1 to length(pFields) do if atom(pFields[i]) then lType = Label lWidth = pFields[i] else lType = pFields[i][1] lWidth = pFields[i][2] end if vFLDIDList[$] &= win:createEx(lType, "", id, x, -1, lWidth, lHeight - 4, WS_BORDER, WS_EX_STATICEDGE) x += lWidth + 2 end for return id end function global function getFlds(integer sb) integer id id = find(sb, vSBList) if id = 0 then return {} end if return vFLDIDList[id] end function --------------
And here is how is could be used ...
---------------- include sb.e as sb include Win32lib.ew without warning -- Window Window1 constant Window1 = createEx( Window, "Window1", 0, Default, Default, 400, 300, 0, 0 ) constant FakeSB = sb:create(Window1, 0, {100, {Button,100}, {CheckBox, 80}}) constant FakeSBFlds = sb:getFlds(FakeSB) setText(FakeSBFlds[1], "First Field") setText(FakeSBFlds[2], "Second Field") setText(FakeSBFlds[3], "Third Field") setHint ( FakeSBFlds[1],"Content of field1" ) setHint ( FakeSBFlds[2],"Content of field2" ) setHint ( FakeSBFlds[3],"Content of field3" ) setWindowBackColor(FakeSB, Blue) setWindowBackColor(FakeSBFlds[1], BrightCyan) setTextColor(FakeSBFlds[1], Brown) setWindowBackColor(FakeSBFlds[3], Yellow) setTextColor(FakeSBFlds[3], Red) procedure Clicker(integer self, integer event, sequence parms) setVisible(FakeSBFlds[2], not isChecked(self)) end procedure setHandler(FakeSBFlds[3], w32HClick, routine_id("Clicker")) WinMain( Window1,Normal ) ----------------
This can be extended to do all sort of neat stuff. Let me know if you find it useful and what else you would like to do with status bars? -- Derek Parnell Melbourne, Australia Skype name: derek.j.parnell