2013-10-29 23 views
8

So come stampare un'immagine utilizzando PrintDocument. Tuttavia, voglio stampare la mia immagine utilizzando la funzione di stampa di Windows predefinita. Come quando fai clic con il tasto destro su un'immagine e fai clic su stampa, viene visualizzata la finestra di dialogo che ti consente di impostare le dimensioni, scegliere la stampante, ecc. Qualcuno sa come ottenere ciò in C#? Devo usare WINAPI?Stampa immagine utilizzando la finestra di dialogo di stampa di immagini di windows

Acclamazioni

Edit:

Sto parlando di questa finestra di dialogo di stampa.

enter image description here

risposta

5

È possibile avviare quel dialogo con la classe Process.

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

Questo funziona benissimo per i documenti, ma non è l'ideale per le immagini. Vedi post modificato per lo screenshot di ciò di cui sto parlando. Preferibilmente mi piacerebbe usarlo con un oggetto Immagine piuttosto che dover scrivere l'immagine su disco e quindi chiamare la stampa. – SnakeByte

+0

@SnakeByte - Ho aggiornato per abbinare la domanda aggiornata. –

+0

Bello. Scriverò l'immagine solo su% temp%, quindi la cancellerò dopo. Bella soluzione, grazie e buona giornata. – SnakeByte

0

L'approccio semplice con il lancio di un nuovo processo utilizzando verbo "stampa" non funziona su Windows XP a tutti (si apre Visualizzatore immagini e fax invece della procedura guidata di stampa). Inoltre, non funziona come previsto su Windows 10 (al primo avvio viene aperto il selettore di app predefinito per le immagini, quindi viene aperto il visualizzatore di foto predefinito).

L'approccio corretto sarebbe utilizzare CLSID_PrintPhotosDropTarget oggetto COM. Il mio codice è in C++ (e ATL) ma spero che tu possa tradurlo in C#. I jast pass i nomi dei file, ma AFAIK è possibile passare direttamente le immagini direttamente senza scriverle su disco implementando l'interfaccia IDataObject.

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; 
} 
Problemi correlati