locked
Versuch, ein Drop-Ziel zu widerrufen, das nicht registriert wurde. (MFC) RRS feed

  • Frage

  • Hallo Experten,

    ich baue eine MFC Applikation, die eine Playlist aus HTML Dokumenten und Bildern in einem CWebBrowser2 Control abspielt. Dabei sollen die Bilder so gezoomt werden, dass sie vollstaendig sichtbar sind. Hierzu fange ich die DocumentComplete Nachricht und versuche dann den Befehl OLECMDID_OPTICAL_ZOOM abzusetzen. Aber schon der Test, ob der Befehl ueberhaupt verfuegbar ist, liefert die o.g. Fehlermeldung. Nachdem ich nun tagelang die Foren der Welt befragt und immer nur die Antwort "Das Dokument ist wahrscheinlich noch nicht fertig geladen" gefunden habe, mache ich jetzt selber mal einen Thread auf. Hier die besagte Funktion:

     

    void OnDocumentComplete(LPDISPATCH lpDisp, VARIANT FAR* URL)
    {
        IUnknown*  pUnknown;
        LPDISPATCH lpWBDisp;
        HRESULT    hResult;

        pUnknown = m_wndBrowser->GetControlUnknown();
        ASSERT(pUnknown);

        hResult = pUnknown->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
        if (SUCCEEDED(hResult) && lpDisp == lpWBDisp )
        {
            // Top-level Window Objekt, -> Dokument ist fertig
            // Bilder zoomen

            CImage imgObj;
            hResult = imgObj.Load(URL);
            if (SUCCEEDED(hResult))
            {
                // Dokument ist ein Image

                COleVariant noArg, lZoomFactor;
                CRect rectBrowser;
                long lObjHeight, lObjWidth;
                float hfactor = 0.;
                float wfactor = 0.;
               
                lObjHeight = imgObj.GetHeight();
                lObjWidth = imgObj.GetWidth();
                m_wndBrowser->GetWindowRect(rectBrowser);

                if (lObjHeight > rectBrowser.Height() || lObjWidth > rectBrowser.Width())
                {
                    // nur was machen, wenn das Bild zu gross ist
                   
                    if (lObjHeight != 0 && lObjWidth != 0)
                    {
                        hfactor = (float)rectBrowser.Height() / (float)lObjHeight * 100.;
                        wfactor = (float)rectBrowser.Width() / (float)lObjWidth * 100.;
                        LPDISPATCH dpDocument = m_wndBrowser->get_Document();
                        if (dpDocument)
                        {
                            LPOLECOMMANDTARGET pCmdTarg = NULL;
                            dpDocument->QueryInterface(IID_IOleCommandTarget, (void**)&pCmdTarg);
                            if(pCmdTarg)
                            {
                                OLECMD rgCmd[1] = {{OLECMDID_OPTICAL_ZOOM, 0}};
                                // Ist der Befehl verfügbar?
                                hResult = pCmdTarg->QueryStatus(NULL, 1, rgCmd, NULL);
                                if (SUCCEEDED(hResult) && OLECMDF_ENABLED == rgCmd[0].cmdf)
                                {
                                    V_VT(&lZoomFactor) = VT_I4;
                                    V_I4(&lZoomFactor) = max((long)hfactor, (long)wfactor);

                                    pCmdTarg->Exec(NULL,
                                        OLECMDID_OPTICAL_ZOOM,
                                        OLECMDEXECOPT_DONTPROMPTUSER,
                                        &lZoomFactor,
                                        NULL);
                                }
                                pCmdTarg->Release();
                            }
                        }
                    }
                }
            }
            lpWBDisp->Release();
        }
    }

     

    Fuer Hilfen und Tipps, die ich noch nirgends gefunden habe, waere ich euch sehr dankbar.

     

    Entwicklungsumgebung:

    XP Pro SP3, IE 6 SP3, VS 2008

    Testumgebung:

    s.o und zusätzlich Win7 HE, IE 8

    Mittwoch, 4. August 2010 08:31

Antworten

  • frag mal besser im MSDN Forum, da wirst du von MFC/C++ Experten wie Martin Richter eine bessere Antwort erhalten.

    Meime Idee ist die UAC als Grund. Denn damit hat der IE nur niedrige Zugriffsrechte und Drag & Drop von normalen oder Programmen mit Adminrechte dahin geht dann nicht.


    "A programmer is just a tool which converts caffeine into code" CLIP- Stellvertreter http://www.winvistaside.de/
    Mittwoch, 4. August 2010 13:52

Alle Antworten

  • frag mal besser im MSDN Forum, da wirst du von MFC/C++ Experten wie Martin Richter eine bessere Antwort erhalten.

    Meime Idee ist die UAC als Grund. Denn damit hat der IE nur niedrige Zugriffsrechte und Drag & Drop von normalen oder Programmen mit Adminrechte dahin geht dann nicht.


    "A programmer is just a tool which converts caffeine into code" CLIP- Stellvertreter http://www.winvistaside.de/
    Mittwoch, 4. August 2010 13:52
  • Hallo Andre,

    danke, ich hab das Problem dort nochmal gepostet.

    Donnerstag, 5. August 2010 09:06