CHtmlView copy/paste
От: Fraggle  
Дата: 11.10.02 13:49
Оценка:
Подскажите, плз, как для объекта CHtmlView вызвать обработчики работы с клипбордом?

Т.е. есть объект, приходит событие — юзер нажал Cut или Copy — и нужно это довести до сведения CHtmlView.
Re: CHtmlView copy/paste
От: Аноним  
Дата: 11.10.02 15:26
Оценка:
Здравствуйте Fraggle, Вы писали:

F>Подскажите, плз, как для объекта CHtmlView вызвать обработчики работы с клипбордом?


F>Т.е. есть объект, приходит событие — юзер нажал Cut или Copy — и нужно это довести до сведения CHtmlView.


Определяем в CHtmlView такие фукции:

    afx_msg void OnEditCopy();
    afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI);
    afx_msg void OnEditCut();
    afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI);
    afx_msg void OnEditPaste();
    afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI);


Далее:


BEGIN_MESSAGE_MAP(CMyHtmlView, CHtmlView)
    //{{AFX_MSG_MAP(CMyHtmlView)
    ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
    ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
    ON_COMMAND(ID_EDIT_CUT, OnEditCut)
    ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
    ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
    ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)


Ну собственно реализация методов:


HRESULT CMyHtmlView::ExecFormCommand(const GUID *pGuid, long cmdID, long cmdExecOpt,
                                     VARIANT* pInVar, VARIANT* pOutVar) const
{
    CComQIPtr<IHTMLDocument2> spDoc(GetHtmlDocument());
    HRESULT hr = E_FAIL;

    if (spDoc)
    {
        CComQIPtr<IOleCommandTarget> spCmdTarg = spDoc;
        if (spCmdTarg)
        {
            hr = spCmdTarg->Exec(pGuid, cmdID, cmdExecOpt, pInVar , pOutVar);
        }
        else
            hr = E_NOINTERFACE;
    }

    return hr;
}

HRESULT CMyHtmlView::ExecFormCommand(long cmdID, long cmdExecOpt,
                                            VARIANT* pInVar, VARIANT* pOutVar) const
{
    return ExecFormCommand(&CGID_MSHTML, cmdID, cmdExecOpt, pInVar, pOutVar);
}

void CMyHtmlView::OnEditCopy() 
{
    ExecFormCommand(IDM_COPY, OLECMDEXECOPT_DODEFAULT);
}

void CMyHtmlView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
    UpdateCmdUIStatus(pCmdUI, QueryFormStatus(IDM_COPY));
}

void CMyHtmlView::OnEditCut() 
{
    ExecFormCommand(IDM_CUT, OLECMDEXECOPT_DODEFAULT);
}

void CMyHtmlView::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
    UpdateCmdUIStatus(pCmdUI, QueryFormStatus(IDM_CUT));
}

void CMyHtmlView::OnEditPaste() 
{
    ExecFormCommand(IDM_PASTE, OLECMDEXECOPT_DODEFAULT);
}

void CMyHtmlView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
{
    UpdateCmdUIStatus(pCmdUI, QueryFormStatus(IDM_PASTE));
}


Удачи!

Египко Николай,
www.nikeware.com
"Visual Comparer" — freeware file comparison utility with syntax highlight.
Re[2]: CHtmlView copy/paste
От: Аноним  
Дата: 11.10.02 15:54
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Fraggle, Вы писали:


F>>Подскажите, плз, как для объекта CHtmlView вызвать обработчики работы с клипбордом?


F>>Т.е. есть объект, приходит событие — юзер нажал Cut или Copy — и нужно это довести до сведения CHtmlView.


А>Определяем в CHtmlView такие фукции:


Skipped...

А>void CMyHtmlView::OnUpdateEditPaste(CCmdUI* pCmdUI)

А>{
А> UpdateCmdUIStatus(pCmdUI, QueryFormStatus(IDM_PASTE));
А>}
А>[/ccode]

Не все скопировал :

void CMyHtmlView::UpdateCmdUIStatus(CCmdUI* pCmdUI, long lStatus)
{
    if (    ((lStatus & OLECMDF_SUPPORTED) != OLECMDF_SUPPORTED)
        ||    ((lStatus & OLECMDF_ENABLED) != OLECMDF_ENABLED))
    {
        pCmdUI->Enable(FALSE);
        pCmdUI->SetCheck(FALSE);
        return;
    }
    
    pCmdUI->Enable((lStatus & OLECMDF_ENABLED) == OLECMDF_ENABLED);
    pCmdUI->SetCheck((lStatus & OLECMDF_LATCHED) == OLECMDF_LATCHED);
}

long CMyHtmlView::QueryFormStatus(long cmdID) const
{
    CComQIPtr<IHTMLDocument2> spDoc(GetHtmlDocument());

    if (spDoc)
    {
        CComQIPtr<IOleCommandTarget> spCmdTarg = spDoc;
        if (spCmdTarg)
        {
            OLECMD ocmd = {cmdID, 0};
            if (S_OK == spCmdTarg->QueryStatus(&CGID_MSHTML, 1, &ocmd, NULL))
                return ocmd.cmdf;
        }
    }
    // if an error occurred, returning 0 means the command is disabled
    return 0;
}


Еще раз Удачи!

Египко Николай,
www.nikeware.com
"Visual Comparer" — freeware file comparison utility with syntax highlight.
Re[2]: CHtmlView copy/paste
От: Fraggle  
Дата: 11.10.02 16:10
Оценка:
F>>Подскажите, плз, как для объекта CHtmlView вызвать обработчики работы с клипбордом?

F>>Т.е. есть объект, приходит событие — юзер нажал Cut или Copy — и нужно это довести до сведения CHtmlView.


А> ExecFormCommand(IDM_COPY, OLECMDEXECOPT_DODEFAULT);

А> ExecFormCommand(IDM_CUT, OLECMDEXECOPT_DODEFAULT);
А> ExecFormCommand(IDM_PASTE, OLECMDEXECOPT_DODEFAULT);

Хватило и половины дозы! Самое оно, спасибо!

Только вот ExecFormCommand я не нашел, даже в каталоге VC — пришлось использовать CHtmlView::ExecWB()
Re[3]: CHtmlView copy/paste
От: Nikeware http://www.nikeware.com
Дата: 11.10.02 18:59
Оценка: 3 (1)
Здравствуйте Fraggle, Вы писали:

F>>>Подскажите, плз, как для объекта CHtmlView вызвать обработчики работы с клипбордом?


F>>>Т.е. есть объект, приходит событие — юзер нажал Cut или Copy — и нужно это довести до сведения CHtmlView.


А>> ExecFormCommand(IDM_COPY, OLECMDEXECOPT_DODEFAULT);

А>> ExecFormCommand(IDM_CUT, OLECMDEXECOPT_DODEFAULT);
А>> ExecFormCommand(IDM_PASTE, OLECMDEXECOPT_DODEFAULT);

F>Хватило и половины дозы! Самое оно, спасибо!


F>Только вот ExecFormCommand я не нашел, даже в каталоге VC — пришлось использовать CHtmlView::ExecWB()

Вообще-то это мой собственный метод. Причем через мессагу выше.
Читайте плиз внимательно

"To merge or not to merge?"
www.visual-comparer.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.