craig20120
asked on
MS Word Addin C++ COM w/o ATL - Determine what toolbar button was clicked??
I am using C++ and COM without using ATL to write a Word 2003 addin. I used the MSDN article below as the basis for my for my project.
http://support.microsoft.com/support/kb/articles/Q230/6/89.ASP
The example only has a single toolbar button so I added several which all get added and initalized fine. When I click on a button the Invoke method gets called as it should. My question is how do I tell which button was clicked.
Help, I am already bald enough...
http://support.microsoft.com/support/kb/articles/Q230/6/89.ASP
The example only has a single toolbar button so I added several which all get added and initalized fine. When I click on a button the Invoke method gets called as it should. My question is how do I tell which button was clicked.
Help, I am already bald enough...
ASKER
I like option two the best and actually was actually trying to see how to get the pointer to the control before I posted this. I figured it was in one of the arguments, but I am still not sure how to retrieve pCtrl and get the text. I am somewhat new to COM programming. ATL makes more sense to me then straight COM.
Thanks!
Thanks!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Since the idea is to instantiate a button handler for each individual button, that should be easy to handle:
// Now, set up an event sink for the Button...
m_pButtonHandler = new CButtonHandler(); // <------ Option 1: Pass a button ID to the handler in the construcotr
if (NULL == m_pButtonHandler) goto cleanup;
m_pButtonHandler->AddRef()
m_pButtonHandler->SinkEven
Alternatively, you can do that in the 'Invoke()' handler:
/*************************
* CButtonHandler::Invoke()
*
* The click event is fired by this Invoke call. There is only
* one event for this interface (0x00000001) and it takes two
* parameters:
*
* LPDISPATCH pCtrl -- The primary interface of the button
* being pressed.
*
* VARIANT_BOOL bCancel -- Determines whether the default action
* should be cancled.
*
**************************
STDMETHODIMP CButtonHandler::Invoke(DIS
{
if (IID_NULL != riid)
return DISP_E_UNKNOWNINTERFACE;
if (dispIdMember != 0x00000001)
return DISP_E_MEMBERNOTFOUND;
if (NULL == pDispParams) return E_POINTER;
if (pDispParams->cArgs != 2) return DISP_E_BADPARAMCOUNT;
// <---------- Option 2: Obtain 'pCtrl' from 'pDispParams' so you can simply read the button text
// We don't do anything special with this event, so we'll just pop up
// a message box to let the user know we are here. For a production
// addin, you would want to forward the event to a callback function
// in your main addin class. There your addin could handle the event
// in a more controled manner.
MessageBox(NULL, "The Click event was fired!!", "My Addin", MB_SETFOREGROUND);
return S_OK;
}