Управление количеством копий при печати
От: DBnew Россия  
Дата: 11.03.04 11:37
Оценка:
CPrintDialog dlg(FALSE,PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION);
if (dlg.GetDefaults()) {
ASSERT(dlg.m_pd.hDC != NULL);
// Вот здесь устанавливаю 2-е копии
dlg.m_pd.nCopies = 2;

DEVMODE* pDevMode = reinterpret_cast<DEVMODE*>(::GlobalLock(dlg.m_pd.hDevMode));
if(port)
pDevMode->dmOrientation = DMORIENT_PORTRAIT,pDevMode->dmOrientation = DMORIENT_PORTRAIT;
else
pDevMode->dmOrientation = DMORIENT_LANDSCAPE,pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
VERIFY(::ResetDC(dlg.m_pd.hDC, pDevMode));
::GlobalUnlock(dlg.m_pd.hDevMode);
}
а печатся только 1 (одна). Может кто знает, что я не так делаю?
С Уважением
Дмитрий UIN 2399015
Re: Управление количеством копий при печати
От: Patalog Россия  
Дата: 12.03.04 10:36
Оценка:
Здравствуйте, DBnew, Вы писали:

DB>    CPrintDialog dlg(FALSE,PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION);
DB>    if (dlg.GetDefaults()) {
DB>        ASSERT(dlg.m_pd.hDC != NULL);
DB>        // Вот здесь устанавливаю 2-е копии
DB>        dlg.m_pd.nCopies = 2;

То что ты здесь устанавливаешь имеет смысл только лишь до вызова DoModal или GetDefaults, т.е собственно до вызова PrintDlg, ибо CPrintDialog по сути лишь обертка над этой апишной ф-ей. В данном случае у тебя получается примерно следующее —
PRINGDLG pd;
pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
PrintDlg(&pd);
pd.nCopies = 2; //не имеет смысда ибо в этой точке DEVMODE уже сформирован

А вот далее, для установки ориентации, ты все делаешь правильно (почти, ибо я не увидел у тебя установку поля dmFields которое указывает системе какое поле структуры DEVMODE имеет смысл, а какое нет), только нужно пойти чуть дальше, и этим же способом установить кол-во копий уже в DEVMODE:
pDevMode->dmFields |= DM_COPIES;
pDevMode->dmCopies = 2;
Почетный кавалер ордена Совка.
Re[2]: Управление количеством копий при печати
От: DBnew Россия  
Дата: 12.03.04 12:49
Оценка:
Здравствуйте, Patalog,

Точно!!! Как это я сам не додумался

Написал теперь так:
    CPrintDialog dlg(FALSE,PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION | PD_RETURNDC | PD_RETURNDEFAULT);
    if (dlg.GetDefaults()) {
        ASSERT(dlg.m_pd.hDC != NULL);
        DEVMODE* pDevMode = reinterpret_cast<DEVMODE*>(::GlobalLock(dlg.m_pd.hDevMode));
        if(port) 
            pDevMode->dmOrientation = DMORIENT_PORTRAIT,pDevMode->dmOrientation = DMORIENT_PORTRAIT;
        else
            pDevMode->dmOrientation = DMORIENT_LANDSCAPE,pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
        pDevMode->dmFields |= DM_COPIES;
        pDevMode->dmCopies = countPage;
        VERIFY(::ResetDC(dlg.m_pd.hDC, pDevMode));
        ::GlobalUnlock(dlg.m_pd.hDevMode);
    }


только всеравно не работае
С Уважением
Дмитрий UIN 2399015
Re[3]: Управление количеством копий при печати
От: Patalog Россия  
Дата: 12.03.04 14:36
Оценка:
Здравствуйте, DBnew, Вы писали:

Весьма странно, должно...
А если попробовать
DB>Написал теперь так:
DB>
DB>    CPrintDialog dlg(FALSE, 
                        PD_ALLPAGES /*| PD_COLLATE*/ | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE | PD_NOSELECTION | PD_RETURNDC /*| PD_RETURNDEFAULT*/);
DB>    if (dlg.DoModal()/*GetDefaults()*/) {
DB>        ASSERT(dlg.m_pd.hDC != NULL);
DB>        DEVMODE* pDevMode = reinterpret_cast<DEVMODE*>(::GlobalLock(dlg.m_pd.hDevMode));
DB>        /*if(port) 
DB>            pDevMode->dmOrientation = DMORIENT_PORTRAIT,pDevMode->dmOrientation = DMORIENT_PORTRAIT;
DB>        else
DB>            pDevMode->dmOrientation = DMORIENT_LANDSCAPE,pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
DB>        pDevMode->dmFields |= DM_COPIES;
DB>        pDevMode->dmCopies = countPage;
DB>        VERIFY(::ResetDC(dlg.m_pd.hDC, pDevMode));
DB>        ::GlobalUnlock(dlg.m_pd.hDevMode);*/
DB>    }
DB>

и выставить руками нужное число копий то работает?
(не возбраняется посмотреть в отладчике pDevMode на предмет поставленных ф-ей полей)
+ поэкспериментируй с DEVMODE::dmCollate
Почетный кавалер ордена Совка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.