2013-10-29 195 views
8

我知道如何使用PrintDocument打印圖像。但是,我想使用默認的Windows打印功能打印我的圖像。就像當你右鍵單擊一個圖像並點擊打印,出現的對話框允許你設置大小選擇打印機等。有誰知道如何在C#中實現這一點?我必須使用WINAPI嗎?使用Windows打印圖像打印圖像對話框

乾杯

編輯:

我談論這個打印對話框。

enter image description here

回答

5

可以啓動與工藝類對話框。

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

這對文檔很有用,但對圖像不太理想。看到我正在談論的屏幕截圖的編輯後。最好我想將它與Image對象一起使用,而不必將圖像寫入磁盤,然後調用打印。 – SnakeByte

+0

@SnakeByte - 我更新以匹配更新後的問題。 –

+0

美麗。我只會將圖像寫入%temp%,然後將其刪除。很好的解決方案,謝謝,祝你有美好的一天。 – SnakeByte

0

使用動詞「打印」推出一個新的工藝簡單的方法是不工作在Windows XP在所有(它打開Windows圖片和傳真查看器,而不是打印嚮導)。此外,它在Windows 10上無法正常工作(首先運行圖像默認應用選擇器打開,然後打開默認照片查看器)。

正確的做法是使用CLSID_PrintPhotosDropTarget COM對象。我的代碼是C++(和ATL),但我希望你可以在C#中翻譯它。 我jast pass文件的名字,但AFAIK你可以直接傳遞圖片本身,而不用寫在磁盤上實現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; 
}