2013-10-29 20 views
8

Ich weiß, wie man ein Bild mit PrintDocument druckt. Allerdings möchte ich mein Bild mit der Standard-Windows-Druckfunktion drucken. Wenn Sie zum Beispiel mit der rechten Maustaste auf ein Bild klicken und auf "Drucken" klicken, wird der Dialog angezeigt, in dem Sie die Größe festlegen und den Drucker usw. auswählen können. Weiß jemand, wie dies in C# erreicht wird? Muss ich WINAPI verwenden?Bild mit Windows drucken Bild drucken Dialog

Prost

Edit:

ich diesen Druck-Dialog im Gespräch.

enter image description here

Antwort

5

Sie können diesen Dialog mit der Process-Klasse starten.

private void button1_Click(object sender, EventArgs e) 
    { 
     string fileName = @"C:\Development\myImage.tif";//pass in or whatever you need 
     var p = new Process(); 
     p.StartInfo.FileName = fileName; 
     p.StartInfo.Verb = "Print"; 
     p.Start(); 
    } 
+0

Das funktioniert gut für Dokumente, aber nicht so ideal für Bilder. Sehen Sie den bearbeiteten Post für den Screenshot von dem, worüber ich spreche. Vorzugsweise möchte ich es mit einem Image-Objekt verwenden, anstatt das Image auf die Festplatte schreiben zu müssen und dann den Ausdruck aufzurufen. – SnakeByte

+0

@SnakeByte - Ich habe aktualisiert, um der aktualisierten Frage zu entsprechen. –

+0

Schön. Ich werde das Bild einfach in% temp% schreiben und danach löschen. Schöne Lösung, vielen Dank und einen schönen Tag. – SnakeByte

0

Der einfache Ansatz mit einem neuen Prozess wird mit Start arbeiten Verb „Druck“ gar nicht auf Windows XP (es öffnet sich der Windows Bild- und Faxanzeige anstelle des Druck-Assistent). Es funktioniert auch nicht wie beabsichtigt unter Windows 10 (beim ersten Start wird die Standard-App-Auswahl für Bilder geöffnet, dann wird der Standard-Foto-Viewer geöffnet).

Der korrekte Ansatz wäre CLSID_PrintPhotosDropTarget COM-Objekt. Mein Code ist in C++ (und ATL), aber ich hoffe, Sie könnten es in C# übersetzen. Ich jast Dateinamen weitergeben, aber AFAIK können Sie Bild direkt übergeben, ohne es auf Festplatte zu schreiben, die IDataObject Schnittstelle implementiert.

bool DisplaySystemPrintDialogForImage(const std::vector<CString>& files, HWND hwnd) { 
    static const CLSID CLSID_PrintPhotosDropTarget ={ 0x60fd46de, 0xf830, 0x4894, { 0xa6, 0x28, 0x6f, 0xa8, 0x1b, 0xc0, 0x19, 0x0d } }; 

    CComPtr<IShellFolder> desktop; // namespace root for parsing the path 
    HRESULT hr = SHGetDesktopFolder(&desktop); 
    if (!SUCCEEDED(hr)) { 
     return false; 
    } 

    CComPtr<IShellItem> psi; 
    CComPtr<IDataObject> pDataObject; 

    std::vector<LPITEMIDLIST> list; 

    for (const auto& fileName : files) { 
     PIDLIST_RELATIVE newPIdL; 
     hr = desktop->ParseDisplayName(hwnd, nullptr, const_cast<LPWSTR>(static_cast<LPCTSTR>(fileName)), nullptr, &newPIdL, nullptr); 
     if (SUCCEEDED(hr)) { 
      list.push_back(newPIdL); 
     } 
    } 

    if (!list.empty()) { 
     hr = desktop->GetUIObjectOf(hwnd, list.size(), const_cast<LPCITEMIDLIST*>(&list[0]), IID_IDataObject, 0, reinterpret_cast<void**>(&pDataObject)); 
     if (SUCCEEDED(hr)) { 
      // Create the Photo Printing Wizard drop target. 
      CComPtr<IDropTarget> spDropTarget; 

      hr = CoCreateInstance(CLSID_PrintPhotosDropTarget, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spDropTarget)); 
      if (SUCCEEDED(hr)) { 
       // Drop the data object onto the drop target. 
       POINTL pt = { 0 }; 
       DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY; 

       spDropTarget->DragEnter(pDataObject, MK_LBUTTON, pt, &dwEffect); 

       spDropTarget->Drop(pDataObject, MK_LBUTTON, pt, &dwEffect); 
       return true; 
      } 
     } 
    } 
    return false; 
}