GetImage-Beispiel: Veranschaulicht Windows Image Acquisition-API
Das GetImage-Beispiel demonstriert die Windows-Bilderfassung (WIA)-Anwendungsprogrammierschnittstellen (APIs).
Der WIA-API-Satz enthält einfache APIs für Dateiübertragungen, besteht keine einfacher API-Aufruf für im Speicher Übertragungen jedoch. GetImage implementiert eine Wrapperfunktion mit dem Namen WiaGetImage, die kombiniert die Funktionalität von SelectDeviceDlg, DeviceDlg und IdtGetBandedData APIs vollständig Bilderfassung in einem einzigen Funktionsaufruf zu kapseln.
Das Hauptfeature des Beispiels ist der Code selbst. Die Dateien WiaWrap, EventCallback, DataCallback, BitmapUtil und ProgressDlg zeigen die richtige Methode zum Implementieren in Speicherabbild überträgt. "Hinweis auf die Programmierung mit der WIA-API-weiter unten in dieser abstrakt markiert häufige Probleme beim Schreiben einer WIA-Anwendung und das Beispiel zeigt, wie diese behandeln. Sie können in diesem Beispiel als Referenz lesen oder verwenden Sie Beispielcode direkt als eine Bibliothek. Verwendung von jeder Funktion ist in den Header-Datei-Kommentaren ausführlich beschrieben.
Sicherheitshinweis |
---|
Dieser Beispielcode soll ein Konzept veranschaulichen, und es wird nur den Code, der für dieses Konzept relevant sind. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "Wie besehen"keine Garantien. |
So erhalten Sie Beispiele und Anweisungen für deren Installation:
Um Beispiele von Visual Studio zuzugreifen
im Menü Hilfe Menü klicken Beispiele.
Standardmäßig sind die Beispiele in installiert. Laufwerk: \Programme\Microsoft visual Studio 10.0\Samples\.
- Die neueste Version dieses Beispiels und eine Liste der anderen Beispiele finden Sie unter Visual Studio Samples auf der MSDN-Website.
Anforderungen
In diesem Beispiel kann nur unter Windows XP und höher ausgeführt werden.
Microsoft Windows SDK muss installiert sein.
Erstellen und Ausführen des Beispiels
So erstellen und in diesem Beispiel führen
Laden Sie in Visual Studio die Projektmappe GetImage.sln.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie auf Eigenschaften. Legen Sie die folgenden Eigenschaften:
C++ folder, General property page: Ändern Sie die -Eigenschaft Zusätzliche Includeverzeichnisse zum Hinzufügen des Verzeichnisses, das die Windows SDK -Headerdateien (beispielsweise c:\Microsoft Windows SDK \include) enthält.
Linker Ordner Allgemein Eigenschaftenseite: Ändern Sie die -Eigenschaft zusätzliche Bibliotheksverzeichnisse zum Hinzufügen des Verzeichnisses Windows SDK Bibliothek Dateien (beispielsweise c:\Microsoft Windows SDK \lib) enthält.
erstellen Sie Menü, klicken Sie auf erstellen.
Debuggen Sie von Menü, klicken Sie auf Starten ohne Debuggen.
Die Beispielanwendung besitzt einen einzelnen Befehl seine Menü Datei mit dem Namen von Scanner oder Kamera. Wenn ein WIA-Gerät (oder ein Geräteemulator) angeschlossen ist, wird das Menüelement aktiviert. Wenn der Benutzer den Menübefehl auswählt, wird im Beispiel die im Dialogfeld WIA-Geräteauswahl, Bildauswahl Dialogfeld und Bildübertragung Dialogfeld sequenziell angezeigt. Die Dialogfeldern Gerät und Bild-Auswahl sind den Standarddialogfeldern, die vom System bereitgestellten und in diesem Beispiel wird das Dialogfeld Übertragung implementiert. Schließlich wird im Beispiel die übertragenen Bilder in untergeordneten Fenster angezeigt.
Dateien im Beispiel
Datei |
Beschreibung |
---|---|
WiaWrap.cpp |
Enthält Wrapperfunktionen für einfachere WIA-Operationen |
WiaWrap.h |
Headerdatei für WiaWrap.cpp |
EventCallback.cpp |
Implementiert die Rückruffunktion für WIA-Geräteereignisse |
EventCallback.h |
Headerdatei für EventCallback.cpp |
DataCallback.cpp |
Implementiert die Rückruffunktion für Datenübertragungen |
DataCallback.h |
Headerdatei für DataCallback.cpp |
BitmapUtil.cpp |
Enthält Funktionen, Gerät independent Bitmap (DIB) |
BitmapUtil.h |
Headerdatei für BitmapUtil.cpp |
ProgressDlg.cpp |
Implementiert ein einfaches Fortschrittsdialogfeld |
ProgressDlg.h |
Headerdatei für ProgressDlg.cpp |
GetImage.cpp |
Implementiert den Haupteinstiegspunkt für die Anwendung |
GetImage.rc |
Enthält die Projektressourcen |
Resource.h |
Headerdatei für die Ressourcenbezeichner |
MainWnd.cpp |
Implementiert das Hauptrahmenfenster |
MainWnd.h |
Headerdatei für MainWnd.cpp |
BitmapWnd.cpp |
Implementiert ein Bild anzeigen-Fenster |
BitmapWnd.h |
Headerdatei für BitmapWnd.cpp |
StdAfx.cpp |
Vorkompilierte Header-Datei |
StdAfx.h |
Enthält häufig verwendete standard-Systemdateien |
Hinweise zum Programmieren mit WIA-API
Es wird empfohlen, dass Anwendungen stellen Gerät- und Image Auswahl über ein Menüelement namens "Von Scanner oder Kamera..."-im Menü "Datei". Dieses Element konnte abgeblendet werden, wenn keine WIA-Geräte auf dem System vorhanden sind.
Es wird empfohlen, dass Entwickler ihre Anwendungen mit seriellen USB-Kameras und Flachbett, Bildlauf eingezogen und ADF-Scannern testen. Nur-Software-Geräteemulatoren auf dem Windows DDK verfügbaren können auch zum Testen verwendet werden.
Bildlauf eingezogen Scanner im Allgemeinen wissen nicht die Bildhöhe beim Starten der Datenübertragung so, dass Sie 0 für die Bildgröße und die Bildhöhe im Bitmap-Header zurückgegeben werden. In diesem Fall sollte die Rückruffunktion möglicherweise um den Puffer zu erweitern, wenn neue Daten ankommen und explizit die Höhe berechnet, sollte Wenn die Übertragung abgeschlossen ist.
Wenn Sie das DeviceDlg-API auf einen automatischen Papiereinzug (ADF) verwenden, wird die API die ANWENDUNGSDEFINITIONSDATEI zum Scannen einer Seite festgelegt. Wenn mehrere Seiten gewünscht werden, sollte die Anwendung festgelegt explizit WIA_DPS_PAGES um die Anzahl der Seiten, die es anfordert oder den Wert ALL_PAGES .
Die SelectDeviceDlgDeviceDlg, idtGetDataund idtGetBandedData APIs return S_FALSE Wenn der Benutzer, abbricht daher ist es nicht ausreichend, um den Rückgabewert mit dem Makro " SUCCEEDED überprüfen. Der Programmierer muss explizit S_FALSE überprüfen. Auf ähnliche Weise zurück die ReadMultiple und WriteMultiple APIs S_FALSE , wenn die Funktionsargumente richtig sind, aber die Funktion kann die angeforderte Operation nicht ausführen, und daher der Programmierer explizit den Rückgabewert mit S_FALSE überprüfen muss.
Wenn möchte, dass die Anwendung ein Fortschrittsdialogfeld anzeigen, die abgebrochen werden kann, sollte das Dialogfeld in einem separaten Thread angezeigt werden. Der Thread Daten übertragen werden blockiert, bis die Übertragung abgeschlossen ist,, ist sodass es nicht die Fenstermeldungen verarbeiten, sobald diese eintreffen. Wenn das Fortschrittsdialogfeld im selben Thread erstellt wird, werden das Dialogfeld (und die Schaltfläche "Abbrechen") sehr träge auf Benutzereingaben sein.
Die Datenübertragung kann abgebrochen werden, nur dann, wenn BandedDataCallback zurückgibt. Da BandedDataCallback alle paar Sekunden aufgerufen werden kann, sollte die Anwendung dem Benutzer angeben, dass der Abbruchvorgang ausgeführt wird. Es kann z. B. die Abbrechen-Schaltfläche deaktivieren oder Anzeigen einer Meldung warten.
Schlüsselwörter
Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:
IWiaDevMgr, IWiaDevMgr::SelectDeviceDlg, IWiaEventCallback, IWiaEventCallback::ImageEventCallback, IWiaItem, IWiaItem::DeviceDlg, IWiaPropertyStorage, IWiaPropertyStorage::ReadMultiple, IWiaPropertyStorage::WriteMultiple, IWiaDataTransfer, IWiaDataTransfer::idtGetBandedData, IWiaDataCallback, IWiaDataCallback::BandedDataCallback