如何在 microsoft word 加入按鈕 |
答題得分者是:darnell
|
david0927
一般會員 發表:12 回覆:7 積分:2 註冊:2008-11-11 發送簡訊給我 |
|
darnell
版主 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
|
david0927
一般會員 發表:12 回覆:7 積分:2 註冊:2008-11-11 發送簡訊給我 |
各位前輩, 好
首先感謝各位前輩的指引, 我有到 MSOAddIn v.1.0.2 by Vadim Krochak http://www.torry.net/authorsmore.php?id=2843 去下載相關的程式碼,可是卻無法打開其 dpr 檔, (好像不可以從檔案 中直接開啟), 不好意思只好再打擾各位前輩指點迷津
------
陳效聖 |
darnell
版主 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
|
david0927
一般會員 發表:12 回覆:7 積分:2 註冊:2008-11-11 發送簡訊給我 |
|
darnell
版主 發表:25 回覆:103 積分:145 註冊:2003-03-04 發送簡訊給我 |
照著以下步驟~
1.建立一個新的ActiveX Library專案(New Items->切換到ActiveX頁->ActiveX Library) 2.將你下載的那個程式碼中,使用Add file to Project(Shift F11)全都加入進來 //必需的檔案 EventSink.pas MSOEventSink.pas MSOfficeAddIn.pas MSOAddIn_Utils.pas //你想操作的應用程式 Word_TLB.pas Outlook_TLB.pas Excel_TLB.pas //你想操作的方式 Office_TLB.pas VBIDE_TLB.pas 3.建立一個新的Automation Object單元(New Items->切換到ActiveX頁->Automation Object) 會出現一個精靈視窗自己取個類別名稱(其他預設即可)-->按OK 4.這時會產生一個可以寫程式碼的單元(Unit1自己可以改檔名存)(要讓你寫功能的地方) 5.將其中TAutoObject 改成 TMSOfficeAddIn-->參考範例中的部分改 6.將其中TAutoObjectFactory.Create 改成 TMSOAddInFactory.Create-->參考範例中的部份改 7.開始開發你想要的功能... OutlookAddIn_IMPL.pas ->Outlook範例 WordAddIn_IMPL.pas ->Word範例 ExcelAddIn_IMPL.pas ->Excel範例 8.完成後按Complier若都無錯誤->功能表-->Run->Register ActiveX Server 9.完成開Office看看效果
編輯記錄
darnell 重新編輯於 2008-11-26 18:38:55, 註解 無‧
|
david0927
一般會員 發表:12 回覆:7 積分:2 註冊:2008-11-11 發送簡訊給我 |
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
MSOAddIn我曾經在2007年接觸過,當時試著在BCB編譯卻失敗了
最近又看到有人重新發問,花了快兩個禮拜的時間終於用BCB6編譯成功 雖然這篇文章屬於Delphi討論區,但這篇有MSOAddIn的詳細步驟 我還是在這裡回文並且附上AddinImpl.cpp和AddinImpl.h原始碼 方便以後的網友google到這篇文章。 趁此機會還是要抱怨一下,當初在網路上搜尋時完全找不到BCB相關資料 找到的Delphi資料又無法用在BCB,因為DELPHI用的是DAX(Delphi ActiveX Extension) BCB用的是ATL(Active Template Library),技術上反而和MS VC比較相近。 最後我還找了Visual C 6.0再搭配CodeProject的範例來了解其中的機制 只是要將程式碼轉移到BCB又是困難重重,不是編譯錯誤就是符號沒定義 我只能看Office_TLB.h和Word_TLB.h靠嘗試錯誤來猜要怎麼改才能編譯成功
|
bugmans
高階會員 發表:95 回覆:322 積分:188 註冊:2003-04-12 發送簡訊給我 |
AddinImpl.cpp
[code cpp] // ADDINIMPL : Implementation of TAddinImpl (CoClass: Addin, Interface: _IDTExtensibility2) #include #pragma hdrstop #include "ADDINIMPL.H" #pragma link "AddInDesignerObjects_OCX" ///////////////////////////////////////////////////////////////////////////// // TAddinImpl STDMETHODIMP TAddinImpl::OnAddInsUpdate(LPSAFEARRAY* custom) { return E_NOTIMPL; } STDMETHODIMP TAddinImpl::OnBeginShutdown(LPSAFEARRAY* custom) { return E_NOTIMPL; } STDMETHODIMP TAddinImpl::OnConnection(LPDISPATCH Application, Addindesignerobjects_tlb::ext_ConnectMode ConnectMode, LPDISPATCH AddInInst, LPSAFEARRAY* custom) { CComQIPtr CComPtr ATLASSERT(spApp); spApp->get_CommandBars(&spCmdBars); CComVariant vtName(_T("Universal Addin")); CComVariant vtPos(1); // position it below all toolbands CComVariant vtTemp(VARIANT_TRUE); // is temporary CComVariant vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR); CComPtr < Office_tlb::CommandBar> spNewCmdBar; spNewCmdBar = spCmdBars->Add( vtName,vtPos, vtEmpty, vtTemp); ATLASSERT(spNewCmdBar); CComPtr < Office_tlb::CommandBarControls> spBarControls; spBarControls = spNewCmdBar->get_Controls(); ATLASSERT(spBarControls); CComVariant vtToolBarType(1); CComPtr < Office_tlb::CommandBarControl> spNewBar; CComVariant vtShow(VARIANT_TRUE); // add button spNewBar = spBarControls->Add(vtToolBarType, vtEmpty, vtEmpty, vtEmpty, vtShow); ATLASSERT(spNewBar); // get CommandBarButton interface so we can specify button styles and stuff // each button displays a bitmap and caption next to it CComQIPtr < Office_tlb::CommandBarButton> spCmdButton(spNewBar); ATLASSERT(spCmdButton); spCmdButton->set_Style(Office_tlb::msoButtonCaption); spCmdButton->set_Visible(VARIANT_TRUE); spCmdButton->set_Caption(OLESTR("Button")); spCmdButton->set_Enabled(VARIANT_TRUE); spCmdButton->set_TooltipText(OLESTR("Tooltip for Button")); spCmdButton->set_Tag(OLESTR("Button")); spCmdButton->set_Caption(OLESTR("Button")); spCmdButton->set_Visible(VARIANT_TRUE); spNewCmdBar->set_Visible(VARIANT_TRUE); m_spButton=spCmdButton; DispEventAdvise((IDispatch*)m_spButton, &__uuidof(_CommandBarButtonEvents)); return S_OK; } STDMETHODIMP TAddinImpl::OnDisconnection( Addindesignerobjects_tlb::ext_DisconnectMode RemoveMode, LPSAFEARRAY* custom) { DispEventUnadvise((IDispatch*)m_spButton, &__uuidof(_CommandBarButtonEvents)); return S_OK; } STDMETHODIMP TAddinImpl::OnStartupComplete(LPSAFEARRAY* custom) { return E_NOTIMPL; } void __stdcall TAddinImpl::OnClickButton(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault) { ::MessageBox(NULL,"OnClickButton",NULL,MB_OK); } [/code] AddinImpl.h [code cpp] // ADDINIMPL.H : Declaration of the TAddinImpl #ifndef AddinImplH #define AddinImplH #define ATL_APARTMENT_THREADED #include "OfficeAddin_TLB.h" #include "AddInDesignerObjects_OCX.h" #include "Office_TLB.h" #include "Word_TLB.h" #include static _ATL_FUNC_INFO OnClickButtonInfo={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}}; ///////////////////////////////////////////////////////////////////////////// // TAddinImpl Implements _IDTExtensibility2, default interface of Addin // ThreadingModel : Apartment // Dual Interface : TRUE // Event Support : FALSE // Default ProgID : Project1.Addin // Description : ///////////////////////////////////////////////////////////////////////////// class ATL_NO_VTABLE TAddinImpl : public CComObjectRootEx public CComCoClass public IDispatchImpl<_IDTExtensibility2, &IID__IDTExtensibility2, &LIBID_OfficeAddin>, public IDispEventSimpleImpl<1,TAddinImpl,&DIID__CommandBarButtonEvents> { public: TAddinImpl() { } // Data used when registering Object // DECLARE_THREADING_MODEL(otApartment); DECLARE_PROGID("OfficeAddin.Addin"); DECLARE_DESCRIPTION(""); // Function invoked to (un)register object // static HRESULT WINAPI UpdateRegistry(BOOL bRegister) { TRegistry *registry = new TRegistry(); AnsiString Key="Software\\Microsoft\\Office\\Word\\Addins\\" AnsiString(GetProgID()); if(bRegister) {registry->RootKey=HKEY_CURRENT_USER; registry->OpenKey(Key,true); registry->WriteString("Description","WordAddin"); registry->WriteString("FriendlyName","WordAddin"); registry->WriteInteger("LoadBehavior",3); registry->CloseKey(); } else {registry->RootKey=HKEY_CURRENT_USER; registry->DeleteKey(Key); } delete registry; TTypedComServerRegistrarT regObj(GetObjectCLSID(), GetProgID(), GetDescription()); return regObj.UpdateRegistry(bRegister); } BEGIN_COM_MAP(TAddinImpl) COM_INTERFACE_ENTRY(_IDTExtensibility2) COM_INTERFACE_ENTRY2(IDispatch, _IDTExtensibility2) END_COM_MAP() BEGIN_SINK_MAP(TAddinImpl) SINK_ENTRY_INFO(1, DIID__CommandBarButtonEvents,/*dispid*/ 0x01, OnClickButton, &OnClickButtonInfo) END_SINK_MAP() // _IDTExtensibility2 public: void __stdcall OnClickButton(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault); STDMETHOD(OnAddInsUpdate(LPSAFEARRAY* custom)); STDMETHOD(OnBeginShutdown(LPSAFEARRAY* custom)); STDMETHOD(OnConnection(LPDISPATCH Application, Addindesignerobjects_tlb::ext_ConnectMode ConnectMode, LPDISPATCH AddInInst, LPSAFEARRAY* custom)); STDMETHOD(OnDisconnection( Addindesignerobjects_tlb::ext_DisconnectMode RemoveMode, LPSAFEARRAY* custom)); STDMETHOD(OnStartupComplete(LPSAFEARRAY* custom)); private: CComPtr }; #endif //AddinImplH [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |