Re[2]: ActiveX'у не доходят WM_COPY (ctrl+c) от контейнера
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 16.07.08 14:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Проблема все еще жутко актуальна....

А>Подскажите плиз в каком направлении копать.

У меня была похожая проблема, возможно это сможет натолкнуть вас на какие-то идеи ...

Таск был таков: надо было напедалить Simple ActiveX WYSIWYG HtmlEditControl, делал я его на базе стандартного активикс-элемента виндового эксплорера (IWebBrowser2), документ которого (MSHTML::IHTMLDocument2) переводился в режим редактирования. Никаких акселераторов я не использовал, в смысле собственных, просто IWebBrowser2 поддерживает такие клавиатурные сокращения, как Ctrl+B чтобы назначить выделенному тексту Bold стиль, Ctrl+I чтобы назначить выделенному тексту Italic стиль, и так далее ... Так вот, чтобы дать шанс эксплорерскому контролу обрабатывать клавиатурные события и тем самым реагировать на собственные клавиатурные сокращения, необходимо отправлять окну эксплорера ATL сообщение WM_FORWARDMSG. Например класс WebBrowserControl субклассит окно эксплорерского контрола, тогда делается так:


class WebBrowserControl
    : public CWindowImpl<WebBrowserControl, CAxWindow>
    , public CMessageFilter
{
    DECLARE_WND_CLASS(_T("WebBrowserControl"))

    BOOL PreTranslateMessage(MSG* pMsg)
    {
        if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
            (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
            return FALSE;

        // give HTML page a chance to translate this message
        return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
    }

    // .... много всяких членов ....

private:
    IDispatchPtr              dispatchPtr_;
    MSHTML::IHTMLDocument2Ptr htmlDoc2Ptr_;
    IOleCommandTargetPtr      oleCommandTargetPtr_;
    IWebBrowser2Ptr           webBrowserPtr_;
};


Класс CHtmlEditControl — есть тот самый ActiveX, который я педалил. Он, если хочет обрабатывать клавиатурные сокращения, а также давать возможность дочернему эксплореру их обрабатывать, должен тоже предоставить подобный интерфейс:


// CHtmlEditControl
class ATL_NO_VTABLE CHtmlEditControl
    : /* бла бла бла ... всякое активиксовое наследование */
    , public CComCompositeControl<CHtmlEditControl>
    , /* бла бла бла ... всякое активиксовое наследование */
{
    // .... много всяких членов ....

    BEGIN_MSG_MAP(CHtmlEditControl)
        // .... всякие обработчики ....
        MESSAGE_HANDLER ( WM_FORWARDMSG, OnForwardMessage )
        // .... всякие обработчики ....
    END_MSG_MAP()

    // .... много всяких членов ....

    LRESULT OnForwardMessage (
        UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
    {
        MSG* pMsg = reinterpret_cast<MSG*>(lParam);
        
        if ( webBrowserControl_.PreTranslateMessage(pMsg) )
            return TRUE;

        return CComCompositeControl<CHtmlEditControl>::IsDialogMessage(pMsg);
    }

    // .... много всяких членов ....

private:
    WebBrowserControl   webBrowserControl_;
}


Теперь, ежели вставить полученный ActiveX HtmlEditControl в вижуалстудийный ActiveX test container, то ни хрена не работает Однако, если впихнуть его на хтмл страницу и отдать Интернет Эксплореру, или если поместить его в Outlook, то всё работает прекрасно. Собственно при написании приложения, использующего полученный ActiveX контрол, нужно придерживаться этой модели и посылать FORWARDMSG окну контрола во время фильтрации сообщений диалога, вот и всё.
Надеюсь, это поможет, или хотя бы навеет, какие-то мысли по поводу ...

Можно так же посетить следующие страницы: Keyboard events handling in AXControl или Hosting ActiveX Controls.
Если данный механизм не поможет, можно попытаться сделать, наподобие: Tabs and Accelerators in ATL Modeless Dialogs.

С уважением, Rakafon.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.