求救!!I关于接口OleInPlaceSite::方法GetWindowContext
本帖最后由 xwhmm 于 2013-08-01 14:32:06 编辑
IOleInPlaceFrame* pOleInPlaceFrame=NULL;
IOleInPlaceUIWindow* pOleInPlaceUIwindow=NULL;
IOleInPlaceSite* pOleInPlaceSite=NULL;
OLEINPLACEFRAMEINFO oleInPlaceFrameInfo;
HRESULT hr;
oleInPlaceFrameInfo.cb=sizeof(oleInPlaceFrameInfo);
hr = m_pClientSite->QueryInterface(IID_IOleInPlaceSite, (LPVOID *) &pOleInPlaceSite);
if (hr != S_OK) {
return S_OK;
}
RECT rc1,rc2;
hr=pOleInPlaceSite->GetWindowContext(&pOleInPlaceFrame,&pOleInPlaceUIwindow,&rc1,&rc2,&oleInPlaceFrameInfo);
IOleInPlaceSite *pOleInPlaceSite = NULL;
if (NOERROR == m_pClientSite >QueryInterface(IID_IOleInPlaceSite,
(LPVOID *)&pOleInPlaceSite))
{
pOleInPlaceSite->GetWindow((HWND *)&m_hWndParent);
pOleInPlaceSite->Release();
}
想实现传说中在CRicheditCtr中插入一个OLE的小控件,用于显示超链接,控件是有窗口的,窗口也创建成功了,但是控件的窗口不跟着控件的大小一起变化,只好在OnDraw中取到pcRounds来将控件窗口MoveWindow一下,发现这样在富文本中插入控件第一行的时候没有问题,第二行的第一个也没有问题,自动换行后取到的pcRounds也是正确的但是第二行的第二个网格取到的矩形就不正确了,左边和右边是正确的,但是顶变和底边还是第一行的顶边和底边,但是我在双击的时候InPlaceActivate中取到的prcPosRect又是正确的,于是想通GetWindowContext来获取控件在CRicheditCtr中的位置,可是一直失败,下面的GetWindow却能正确执行,取到父窗口的句柄,真不知道怎么回事,初学COM组件,哪位高手知道原因的帮忙一下啊...... OleInPlaceSite GetWindowContext
[解决办法]
void EnumRichEditObjects()
{
IRichEditOle* lpRichEditOle = NULL;
::SendMessage(m_RichCtrl.m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle);
if (lpRichEditOle != NULL)
{
HRESULT hr = 0;
int objectCount = lpRichEditOle->GetObjectCount();
for (int i = 0; i < objectCount; i++)
{
REOBJECT reObj;
ZeroMemory(&reObj, sizeof(REOBJECT));
reObj.cbStruct = sizeof(REOBJECT);
hr = lpRichEditOle->GetObject(i, &reObj, REO_GETOBJ_ALL_INTERFACES);
if(SUCCEEDED(hr))
{
if (reObj.dwUser == 1)
{
LRESULT lRet = ::SendMessage(m_RichCtrl.m_hWnd, EM_POSFROMCHAR, (WPARAM)reObj.cp, NULL);
POINT point = {LOWORD(lRet), HIWORD(lRet)};
RECT rcOle = {point.x, point.y, point.x + reObj.sizel.cx, point.y + reObj.sizel.cy};
}
lpRichEditOle->Release();
}
}
}
}
上面代码是遍历得到控件的位置的代码,或许你有用
[解决办法]
对了,你的控件最好在REOBJECT的dwUser中添加自己的标识
[解决办法]
需要控件能够响应鼠标点击和鼠标悬乎这一些消息。
插入到richedit的时候,可以在父窗口richedit中判断,因为插入到richedit中的窗口组件会变成无窗口形式的,如果你把你的组件放到其它地方,就可以触发一般的窗口消息了