掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CPrintDialogの設定の保存・復元 (ID:72914)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
色んなとこからソース切り貼り+整形+ビルド通してない+実行していない、なコードなので参考程度に。 # 力技になっちゃった気もする…もっと簡単な方法があるかも知れない extern myCWinApp theApp; bool save(PRINTDLG &pd) { if (pd.hDevMode == NULL) { return false; } LPDEVMODE p = LPDEVMODE(::GlobalLock(pd.hDevMode)); // 今のプリンタ名記憶 theApp.WriteProfileString(_T("printer"), _T("name"), LPCTSTR(p->dmDeviceName)); // 例えば用紙サイズ記憶 theApp.WriteProfileInt(_T("printer"), _T("papersize"), p->dmPaperSize); // 例えば給紙方法記憶 theApp.WriteProfileInt(_T("printer"), _T("defaultsource"), p->dmDefaultSource); // 例えば用紙向き記憶 theApp.WriteProfileInt(_T("printer"), _T("orientation"), p->dmOrientation); ::GlobalUnlock(pd.hDevMode); return true; } bool load(PRINTDLG &pd) { bool result = false; HANDLE printer; if (::OpenPrinter(theApp.GetProfileString(_T("printer"), _T("name")), &printer, NULL)) { DWORD length; ::GetPrinter(printer, 2, NULL, 0, &length); std::vector<BYTE> buffer(length); if (::GetPrinter(printer, 2, &buffer[0], length, &length)) { LPPRINTER_INFO_2 info = LPPRINTER_INFO_2(&buffer[0]); // DEVNAMES 作る HGLOBAL devnames; { const int driverLen = _tcslen(info->pDriverName) + 1; const int printerLen = _tcslen(info->pPrinterName) + 1; const int portLen = _tcslen(info->pPortName) + 1; devnames = ::GlobalAlloc(GHND, sizeof(DEVNAMES) + sizeof(TCHAR) * (driverLen + printerLen + portLen)); LPDEVNAMES p = LPDEVNAMES(::GlobalLock(devnames)); p->wDriverOffset = sizeof(DEVNAMES) / sizeof(TCHAR); p->wDeviceOffset = p->wDriverOffset + driverLen; p->wOutputOffset = p->wDeviceOffset + printerLen; p->wDefault = 0; _tcscpy(LPTSTR(p) + p->wDriverOffset, info->pDriverName); _tcscpy(LPTSTR(p) + p->wDeviceOffset, info->pPrinterName); _tcscpy(LPTSTR(p) + p->wOutputOffset, info->pPortName); ::GlobalUnlock(devnames); } // DEVMODE 作る HGLOBAL devmode; { devmode = ::GlobalAlloc(GHND, info->pDevMode->dmSize + info->pDevMode->dmDriverExtra); LPDEVMODE p = LPDEVMODE(::GlobalLock(devmode)); memcpy(p, info->pDevMode, info->pDevMode->dmSize + info->pDevMode->dmDriverExtra); // 例えば用紙サイズ復元 p->dmPaperSize = theApp.GetProfileInt(_T("printer"), _T("papersize"), p->dmPaperSize); // 例えば給紙方法復元 p->dmDefaultSource = theApp.GetProfileInt(_T("printer"), _T("defaultsource"), p->dmDefaultSource); // 例えば用紙向き復元 p->dmOrientation = theApp.GetProfileInt(_T("printer"), _T("orientation"), p->dmOrientation); ::GlobalUnlock(devmode); } ::GlobalFree(pd.hDevMode); ::GlobalFree(pd.hDevNames); pd.hDevMode = devmode; pd.hDevNames = devnames; result = true; } ::ClosePrinter(printer); } return result; } xxxx { CPrintDialog dlg(TRUE); load(dlg.m_pd); dlg.DoModal(); save(dlg.m_pd); }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.