首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

!I关于接口OleInPlaceSite:方法GetWindowContext

2013-08-06 
求救!!I关于接口OleInPlaceSite::方法GetWindowContext本帖最后由 xwhmm 于 2013-08-01 14:32:06 编辑IOle

求救!!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中的窗口组件会变成无窗口形式的,如果你把你的组件放到其它地方,就可以触发一般的窗口消息了

热点排行