Programmieren mit C++

Allgemeines

Internationalisierung von Anwendungen

Links vom Microsoft Internet Explorer übernehmen

Kann man Internet-Links vom Internet Explorer per Drag&Drop in eigene Controls übernehmen?

Frage

Grundsätzlich ist es problemlos möglich, auch Internet-Links per OLE Drag&Drop vom Internet Explorer (IE) zu übernehmen. Das nachfolgende Beispiel zeigt, wie ein Link vom IE in eine List Control übernommen wird. Man kann dabei auch das Symbol der IE-Adressleiste ziehen, so dass die URL der aktuellen Web-Seite in die List Control übernommen wird.

Für diese Lösung ist zunächst in der Hauptanwendung die folgende Initialisierung der OLE-Schnittstelle einzufügen:

BOOL CGetIELinkApp::InitInstance()
{
CoInitialize(NULL);
  if (!AfxOleInit())
  {
    AfxMessageBox("Ole Initialisierung fehlgeschlagen!");
    return FALSE;
  }
  ... // bisheriger Code von InitInstance()
}

Korrespondierend dazu muss die OLE-Schnittstelle beim Beenden der Anwendung wieder geschlossen werden.

int CGetIELinkApp::ExitInstance() 
{
  CoUninitialize();
 
  return CWinApp::ExitInstance();
}

In der Headerdatei des Dialogs, der die List Control zur Aufnahme der Links enthält, ist zunächst die ID der List Control zu definieren.

Lösung

#include "GetList.h"   #define IDC_GET_LIST  4321 // List Control ID

In der Klasse des Dialogs ist eine Variable vom Typ CGetList zu definieren, die das Handling des Drag&Drop der Links übernimmt.

ID Definition

class CGetIELinkDlg : public CResizingDialog{
  ...// Attribute
 protected:
    CGetList m_ctrGetList;

 ...}

In der Implementationsdatei des Dialogs ist die Methode OnCreate() zu erweitern, um die GetList Control zu erzeugen. Dieser Code wird hinter dem bereits eventuell vorhandenen Code der Methode angefügt.

int CGetIELinkDlg::OnCreate(
   LPCREATESTRUCT lpCreateStruct) {
  ... // bereits vorhandener Code

Der Aufruf zum Erzeugen der GetList Control lautet:

m_ctrGetList.Create(LVS_REPORT | WS_VISIBLE | WS_CHILD,
                      CRect( 10, 10 , 460, 200), 
                      this, IDC_GET_LIST);

Die Farben der GetList Control werden wie folgt eingestellt:

  m_ctrGetList.SetTextColor  (RGB(255,255,255));
  m_ctrGetList.SetTextBkColor(RGB(69,  83,103));
  m_ctrGetList.SetBkColor    (RGB(69,  83,103));

Als Nächstes ist der Header der List Control zu initialisieren.

  LV_COLUMN Lvc;
 
  Lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  Lvc.fmt  = LVCFMT_LEFT; 

Die erste Spalte erhält die Bezeichnung:

 Lvc.pszText  = (LPTSTR)(LPCSTR)"Internet Link";
 Lvc.cx       = 440; 
 Lvc.iSubItem = 0;
 m_ctrGetList.InsertColumn(0, &Lvc);

Der erweiterte Control Stil wird wie folgt festgelegt:

  m_ctrGetList.SetExtendedStyle(LVS_EX_ONECLICKACTIVATE |
                                LVS_EX_FULLROWSELECT    | 
                                LVS_EX_UNDERLINEHOT     | 
                                LVS_EX_INFOTIP          |
                                LVS_EX_FLATSB           |
                                LVS_EX_GRIDLINES        |
                                LVS_EX_CHECKBOXES );
 ... // weitere Initialisierungen
}

Wird nun ein Link auf die List Control des Dialogs gezogen, zeigt das GetList Object automatisch den vollen qualifizierten Pfad der URL an, die anschließend verwendet werden kann, um Verbindungen zum Internet aufzunehmen.

Intern setzt die Klasse CGetList eine Instanz der Klasse COleListDropTarget ein, die sämtliche Arbeiten des OLE Drag&Drop Interfaces erledigt, die notwendig sind, um das gezogene Objekt zu übernehmen. Das Interface der Klasse lautet:

class COleListDropTarget : public COleDropTarget  {
public:
  void SetParent(CWnd* pParent);
  COleListDropTarget(CWnd* pParent = NULL);
  virtual ~COleListDropTarget();
 
  DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject,
                         DWORD dwKeyState, CPoint point );
  DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, 
                        DWORD dwKeyState, CPoint point );
  void OnDragLeave(CWnd* pWnd);
   
  BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT 
              dropEffect, CPoint point );
 
// Attributes
protected:
 CWnd* m_pParent;
};

Zu den Arbeitsschritten, die die Klasse COleListDropTarget zu leisten hat, kann bei Bedarf der Beitrag 5/2.6.3.14 konsultiert werden, in dem die analogen Schritte für einen Button erläutert wurden.

Dialogklasse





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:31:32 von textarchiv.alojado.de