Подскажите, плз, как для объекта CHtmlView вызвать обработчики работы с клипбордом?
Т.е. есть объект, приходит событие — юзер нажал Cut или Copy — и нужно это довести до сведения CHtmlView.
Здравствуйте 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.
Здравствуйте Аноним, Вы писали:
А>Здравствуйте 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.
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()
Здравствуйте 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()

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