В программе реализована печать на принтер с использованием CPrintDialog.
Т.е. условно гововоря, при нажатии на кнопку появляется окно печати, там выбирается принтер если нужно, количество копий и вперёд. Однако в связи с изменением политики партии и задания на разработку теперь нужно печатать напрямую на текущий принтер без лишних вопросов и промежуточных окон. Т.е. нажали кнопку — получили листик.
Можно ли как то реализовать печать, без отказа от CPrintDialog, но и без его показа на экран? Т.е. я сам выставляю нужные параметры для печати (кол-во копий и необходимый принтер) и вперёд..
Поколупался в MSDN-е, ничего такого пока не нашёл..
Может у кого какие идеи или советы по этому поводу будут?
Здравствуйте, Tuzik[KARAVAN], Вы писали:
TK>Можно ли как то реализовать печать, без отказа от CPrintDialog, но и без его показа на экран? Т.е. я сам выставляю нужные параметры для печати (кол-во копий и необходимый принтер) и вперёд..
Написать своего наследника CPrintDialog, который деактивирует все контролы кроме Cancel и OK. И самостоятельно нажимает на кнопку OK по таймауту. Использовать наследника можно так:
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
delete pInfo->m_pPD;
pInfo->m_pPD = new CMyPrintDlg(FALSE, FALSE);
ASSERT(pInfo->m_pPD);
pInfo->m_pPD->m_pd.nMinPage = 1;
pInfo->m_pPD->m_pd.nMaxPage = GetDocument()->GetPageCount();
pInfo->m_pPD->m_pd.hInstance = AfxGetInstanceHandle();
pInfo->m_pPD->m_pd.lpPrintTemplateName = MAKEINTRESOURCE(IDD_PRINT_DEFAULT);
// IDD_PRINT_DEFAULT - Это копия ресурса диалога печати из
// <Visual Studio 6.0>\VC98\Include\PRNSETUP.DLG
pInfo->m_pPD->m_pd.Flags |= PD_ENABLEPRINTTEMPLATE;
return DoPreparePrinting(pInfo);
}
kolam
Здравствуйте, kolam, Вы писали:
K>Написать своего наследника CPrintDialog, который деактивирует все контролы кроме Cancel и OK. И самостоятельно нажимает на кнопку OK по таймауту. Использовать наследника можно так:
K>K>BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
K>{
K> delete pInfo->m_pPD;
K> pInfo->m_pPD = new CMyPrintDlg(FALSE, FALSE);
K> ASSERT(pInfo->m_pPD);
K> pInfo->m_pPD->m_pd.nMinPage = 1;
K> pInfo->m_pPD->m_pd.nMaxPage = GetDocument()->GetPageCount();
K> pInfo->m_pPD->m_pd.hInstance = AfxGetInstanceHandle();
K> pInfo->m_pPD->m_pd.lpPrintTemplateName = MAKEINTRESOURCE(IDD_PRINT_DEFAULT);
K> // IDD_PRINT_DEFAULT - Это копия ресурса диалога печати из
K> // <Visual Studio 6.0>\VC98\Include\PRNSETUP.DLG
K> pInfo->m_pPD->m_pd.Flags |= PD_ENABLEPRINTTEMPLATE;
K> return DoPreparePrinting(pInfo);
K>}
K>
Пасиб за ответ. Однаок я уже нашёл способ проще.
TCHAR PrtName[64];
GetDefaultPrinter(PrtName,64);
HDC hDC=CreateDC(NULL,PrtName,NULL,NULL);
......
печать
.......
DeleteDC(hDC);
Здравствуйте, Tuzik[KARAVAN], Вы писали:
TK>Пасиб за ответ. Однаок я уже нашёл способ проще.
Угу, так проще. Но я-то думал, что нужно по-любому
без отказа от диалога печати.
kolam
Здравствуйте, kolam, Вы писали:
K>Угу, так проще. Но я-то думал, что нужно по-любому без отказа от диалога печати.
Ну так оно и задумывалось.. а получилось как всегда..
Здравствуйте, Tuzik[KARAVAN], Вы писали:
TK>Здравствуйте, kolam, Вы писали:
K>>Угу, так проще. Но я-то думал, что нужно по-любому без отказа от диалога печати.
TK>Ну так оно и задумывалось.. а получилось как всегда..
В MFC можно послать сообщение твоему View
pView->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT);
Или почитать вот это в MSDN
CPrintInfo::m_bDirect
Remarks
The framework sets this member to TRUE if the Print dialog box will be bypassed for direct printing; FALSE otherwise. The Print dialog is normally bypassed when you print from the shell or when printing is done using the command ID ID_FILE_PRINT_DIRECT.
You normally don’t change this member, but if you do change it, change it before you call CView::DoPreparePrinting in your override of CView::OnPreparePrinting.