Scenic Ribbon won't show up in Delphi Form // Has anybody an idea? -
i've played little bit scenic ribbon api (windows ribbon framework). result:
program ribtest; uses windows, messages, activex, comobj; {$r 'e:\ribbon\test.res'} type ui_viewtype = (ui_viewtype_ribbon = 1); ui_viewverb = (ui_viewverb_create = 0, ui_viewverb_destroy = 1, ui_viewverb_size = 2, ui_viewverb_error = 3); ui_commandtype = (ui_commandtype_unknown = 0, ui_commandtype_group = 1, ui_commandtype_action = 2, ui_commandtype_anchor = 3, ui_commandtype_context = 4, ui_commandtype_collection = 5, ui_commandtype_commandcollection = 6, ui_commandtype_decimal = 7, ui_commandtype_boolean = 8, ui_commandtype_font = 9, ui_commandtype_recentitems = 10, ui_commandtype_coloranchor = 11, ui_commandtype_colorcollection = 12); ui_executeverb = (ui_executionverb_execute = 0, ui_executionverb_preview = 1, ui_executionverb_cancelpreview = 2); iuiribbon = interface ['{803982ab-370a-4f7e-a9e7-8784036a6e26}'] function getheight(var cy: uint32): hresult; stdcall; function loadsettingsfromstream(stream: istream): hresult; stdcall; function savesettingstostream(stream: istream): hresult; stdcall; end; iuisimplepropertyset = interface ['{c205bb48-5b1c-4219-a106-15bd0a5f24e2}'] function getvalue(key: tpropertykey; var value: tpropvariant): hresult; stdcall; end; iuicommandhandler = interface ['{75ae0a2d-dc03-4c9f-8883-069660d0beb6}'] function execute(commandid: uint32; verb: ui_executeverb; key: tpropertykey; value: tpropvariant; execprops: iuisimplepropertyset): hresult; stdcall; function updateproperty(commandid: uint32; key: tpropertykey; currvalue: tpropvariant; var newvalue: tpropertykey): hresult; stdcall; end; iuiapplication = interface ['{d428903c-729a-491d-910d-682a08ff2522}'] function onviewchanged(viewid: uint32; typeid: ui_viewtype; view: iunknown; verb: ui_viewverb; reasoncode: int32): hresult; stdcall; function oncreateuicommand(commandid: uint32; typeid: ui_commandtype; commandhandler: iuicommandhandler): hresult; stdcall; function ondestroyuicommand(commandid: uint32; typeid: ui_commandtype; commandhandler: iuicommandhandler): hresult; stdcall; end; ui_invalidations = (ui_invalidations_state = 1, ui_invalidations_value = 2, ui_invalidations_property = 4, ui_invalidations_allproperties = 8); iuiframework = interface ['{f4f0385d-6872-43a8-ad09-4c339cb3f5c5}'] function initialize(framewnd: hwnd; app: iuiapplication): hresult; stdcall; function loadui(instance: cardinal; recname: lpcwstr): hresult; stdcall; function getview(viedid: uint32; riid: tiid; var ppv: pointer): hresult; stdcall; function getuicommandproperty(commandid: uint32; key: tpropertykey; var value: tpropvariant): hresult; stdcall; function setuicommandproperty(commandid: uint32; key: tpropertykey; value: tpropvariant): hresult; stdcall; function invalidateuicommand(commandid: uint32; flags: ui_invalidations; const key: ppropertykey): hresult; stdcall; function flushpendinginvalidations: hresult; stdcall; function setmodes(imodes: int32): hresult; stdcall; end; ttest = class(tinterfacedobject, iuiapplication) public function onviewchanged(viewid: uint32; typeid: ui_viewtype; view: iunknown; verb: ui_viewverb; reasoncode: int32): hresult; stdcall; function oncreateuicommand(commandid: uint32; typeid: ui_commandtype; commandhandler: iuicommandhandler): hresult; stdcall; function ondestroyuicommand(commandid: uint32; typeid: ui_commandtype; commandhandler: iuicommandhandler): hresult; stdcall; end; const clsid_uiribbonframework: tguid = '{926749fa-2615-4987-8845-c33e65f2b957}'; var myapp: ttest; meinhandle: hwnd; tmpframew: iuiframework; function wndproc(hwnd: hwnd; umsg: uint; wparam: wparam; lparam: lparam): lresult; stdcall; var res: hresult; begin result := 0; case umsg of wm_create: begin coinitialize(nil); cocreateinstance(clsid_uiribbonframework, nil, clsctx_inproc_server, iuiframework, tmpframew); if succeeded(tmpframew.initialize(hwnd, iuiapplication(myapp))) begin res := tmpframew.loadui(hinstance, pchar('application_ribbon')); if not succeeded(res)then sleep(5); end; end; wm_destroy: begin postquitmessage(0); end; else result := defwindowproc(hwnd, umsg, wparam, lparam); end; end; var wc: twndclassex; msg: tmsg; { ttest } function ttest.oncreateuicommand(commandid: uint32; typeid: ui_commandtype; commandhandler: iuicommandhandler): hresult; begin result := e_notimpl; end; function ttest.ondestroyuicommand(commandid: uint32; typeid: ui_commandtype; commandhandler: iuicommandhandler): hresult; begin result := e_notimpl; end; function ttest.onviewchanged(viewid: uint32; typeid: ui_viewtype; view: iunknown; verb: ui_viewverb; reasoncode: int32): hresult; begin result := e_notimpl; end; begin myapp := ttest.create; wc.cbsize := sizeof(twndclassex); wc.style := 0; wc.cbclsextra := 0; wc.cbwndextra := 0; wc.hbrbackground := color_window; wc.lpszmenuname := nil; wc.lpszclassname := 'meinribbon'; wc.hiconsm := 0; wc.hinstance := hinstance; wc.hicon := loadicon(hinstance, makeintresource(1)); wc.hcursor := loadcursor(0, idc_arrow); wc.lpfnwndproc := @wndproc; registerclassex(wc); meinhandle := createwindow('meinribbon', 'testapp', ws_overlapped or ws_clipchildren or ws_sysmenu or ws_caption, integer(cw_usedefault), 0, integer(cw_usedefault), 0, hwnd_desktop, 0, hinstance, nil); showwindow(meinhandle, sw_shownormal); updatewindow(meinhandle); while true begin if not getmessage(msg, 0, 0, 0) break; translatemessage(msg); dispatchmessage(msg); end; exitcode := getlasterror; end. everything runs without error. i've made resource ribbon binary xml definition , got linked correctly executable. window appears without ribbon.
the important part in wndproc. framework gets initialized tmpframew.initialize (seems correct). reference counter of myapp (it's iuiapplication implementation) increases. call tmpframew.loadui ribbon definition should loaded. there no error in call (result 0 , no exception raises) reference counter of myapp decreases.
that's happens... have idea i'm doing wrong?
i've found error...
- i'm not familiar c or c++. (i guess) therefore i've overlooked asterisks ,
out's. there incorrect params leads minor bugs. - but main problem header file. in
uiribbon.hfunctioniuiframework.destroymissing. in online sdk , inuiribbon.idlfunction defined. added interface , works expected.
Comments
Post a Comment