我知道如何使用PrintDocument打印圖像。但是,我想使用默認的Windows打印功能打印我的圖像。就像當你右鍵單擊一個圖像並點擊打印,出現的對話框允許你設置大小選擇打印機等。有誰知道如何在C#中實現這一點?我必須使用WINAPI嗎?使用Windows打印圖像打印圖像對話框
乾杯
編輯:
我談論這個打印對話框。
我知道如何使用PrintDocument打印圖像。但是,我想使用默認的Windows打印功能打印我的圖像。就像當你右鍵單擊一個圖像並點擊打印,出現的對話框允許你設置大小選擇打印機等。有誰知道如何在C#中實現這一點?我必須使用WINAPI嗎?使用Windows打印圖像打印圖像對話框
乾杯
編輯:
我談論這個打印對話框。
可以啓動與工藝類對話框。
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();
}
使用動詞「打印」推出一個新的工藝簡單的方法是不工作在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;
}
這對文檔很有用,但對圖像不太理想。看到我正在談論的屏幕截圖的編輯後。最好我想將它與Image對象一起使用,而不必將圖像寫入磁盤,然後調用打印。 – SnakeByte
@SnakeByte - 我更新以匹配更新後的問題。 –
美麗。我只會將圖像寫入%temp%,然後將其刪除。很好的解決方案,謝謝,祝你有美好的一天。 – SnakeByte