Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменить ориентацию бумаги при печати  (Прочитано 11802 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Smoke89
Гость
« : 26-10-2009 14:54 » 

Необходимо изменить ориентацию бумаги при печати. т.е. без помощи диалога. Делаю вот так:

DEVMODE *dm = (DEVMODE *) LocalLock(dlg.m_pd.hDevMode);

        dm->dmFields = DM_ORIENTATION | DM_PAPERSIZE;
        dm->dmOrientation = DMORIENT_LANDSCAPE;
        dm->dmPaperSize = DMPAPER_LETTER;

        pInfo->m_pPD->m_pd.hDevMode=dlg.m_pd.hDevMode;

Впрочем, таких примеров много видел, когда искал, но он не работает, так как структура pInfo->m_pPD->m_pd.hDevMode не меняется!
Собственно, подскажите или же как ее изменить, или же другие способы. Я рылся целый день, никак не мог ничего поделать с этим.
Спасибо!
« Последнее редактирование: 28-10-2009 17:15 от Sel » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 26-10-2009 15:17 » 

Хм, обычно всё меняется и работает. Показывай больше, что ДО что ПОСЛЕ.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Smoke89
Гость
« Ответ #2 : 26-10-2009 15:37 » 

Хорошо. Возможно я не там это делаю...
Вот , перегружаю функцию

Код:
BOOL CWebPrintView::DoPreparePrinting(CPrintInfo *pInfo)
{
ASSERT(pInfo != NULL);
ASSERT(pInfo->m_pPD != NULL);

if (pInfo->m_pPD->m_pd.nMinPage > pInfo->m_pPD->m_pd.nMaxPage)
pInfo->m_pPD->m_pd.nMaxPage = pInfo->m_pPD->m_pd.nMinPage;

// don't prompt the user if we're doing print preview, printing directly,
// or printing via IPrint and have been instructed not to ask

CWinApp* pApp = AfxGetApp();

if (pInfo->m_bPreview || pInfo->m_bDirect ||
(pInfo->m_bDocObject && !(pInfo->m_dwFlags & PRINTFLAG_PROMPTUSER)))
{
if (pInfo->m_pPD->m_pd.hDC == NULL)
{
// if no printer set then, get default printer DC and create DC without calling
//   print dialog.
if (!pApp->GetPrinterDeviceDefaults(&pInfo->m_pPD->m_pd))
{
// bring up dialog to alert the user they need to install a printer.
if (!pInfo->m_bDocObject || (pInfo->m_dwFlags & PRINTFLAG_MAYBOTHERUSER))
if (pApp->DoPrintDialog(pInfo->m_pPD) != IDOK)
return FALSE;
}

if (pInfo->m_pPD->m_pd.hDC == NULL)
{
// call CreatePrinterDC if DC was not created by above
if (pInfo->m_pPD->CreatePrinterDC() == NULL)
return FALSE;
}
}

// set up From and To page range from Min and Max
pInfo->m_pPD->m_pd.nFromPage = (WORD)pInfo->GetMinPage();
pInfo->m_pPD->m_pd.nToPage = (WORD)pInfo->GetMaxPage();
}
else
{
// otherwise, bring up the print dialog and allow user to change things
// preset From-To range same as Min-Max range
pInfo->m_pPD->m_pd.nFromPage = (WORD)pInfo->GetMinPage();
pInfo->m_pPD->m_pd.nToPage = (WORD)pInfo->GetMaxPage();

// if (theApp.DoPrintDialog(pInfo->m_pPD) != IDOK)
// return FALSE;       // do not print

CPrintDialog dlg(TRUE);


DEVMODE* dm1=(DEVMODE*) GlobalLock(pInfo->m_pPD->m_pd.hDevMode);
DEVMODE* dm=(DEVMODE*) GlobalLock(dlg.m_pd.hDevMode);
dm->dmFields =DM_ORIENTATION | DM_PAPERSIZE;
dm->dmOrientation=DMORIENT_LANDSCAPE ;
dm->dmPaperSize = DMPAPER_A4;


pInfo->m_pPD->attam_pd.hDevMode=dlg.m_pd.hDevMode;

GlobalUnlock(dlg.m_pd.hDevMode);
GlobalUnlock(pInfo->m_pPD->m_pd.hDevMode);
//pInfo->m_pPD->m_pd.hDC=PrintDC;
//pApp->DoPrintDialog(pInfo->m_pPD);
//pApp->DoPrintDialog(&dlg);



}

ASSERT(pInfo->m_pPD != NULL);
ASSERT(pInfo->m_pPD->m_pd.hDC != NULL);
if (pInfo->m_pPD->m_pd.hDC == NULL)
return FALSE;

pInfo->m_nNumPreviewPages = pApp->m_nNumPreviewPages;
VERIFY(pInfo->m_strPageDesc.LoadString(AFX_IDS_PREVIEWPAGEDESC));
return TRUE;
}
« Последнее редактирование: 26-10-2009 15:39 от Вад » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 27-10-2009 07:57 » 

Да... кода многовато будет.

Короче вот так всё меняется (твой код между прочим Ага )

Код:
void CTestPrnView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// Standard-CEditView Druckbeginn
DEVMODE* dm1=(DEVMODE*) GlobalLock(pInfo->m_pPD->m_pd.hDevMode);
dm1->dmFields =DM_ORIENTATION | DM_PAPERSIZE;
dm1->dmOrientation=DMORIENT_LANDSCAPE; // или DMORIENT_PORTRAIT
dm1->dmPaperSize = DMPAPER_A4;
GlobalUnlock(pInfo->m_pPD->m_pd.hDevMode);

CEditView::OnBeginPrinting(pDC, pInfo);
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Smoke89
Гость
« Ответ #4 : 27-10-2009 09:39 » 

Хм... у меня и этот не меняет, хотя переменным присваиваются значения , но выводит как обычно(
Создал новый проект , сделал как ты написал, не работатет!Я вообще не пойму, как так! Буду разбираться. Если не тяжело, кинь полностью свой проект мне на мыло m_alexandrs@mail.ru. или сюда выложи.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 27-10-2009 10:38 » 

Ща прицеплю свой проект.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 27-10-2009 11:10 » 

Для проверки работоспособности поставил жёстко DMORIENT_PORTRAIT, потому что у моего принтера стоит DMORIENT_LANDSCAPE, тогда открыв диалог настроек принтера при печати  и подтвердив его с ОК, получаем LANDSCAPE, а если его не вызывать, то портрет. Наоборот работает точно также.

* Testprn.zip (70.32 Кб - загружено 783 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Smoke89
Гость
« Ответ #7 : 27-10-2009 11:12 » new

в общем решил проблему. Сделал m_bDirect =TRUE; И изменил немного OnBeginPrinting:
Код:
ASSERT(pInfo != NULL);
ASSERT(pInfo->m_pPD != NULL);


if (pInfo->m_pPD->m_pd.nMinPage > pInfo->m_pPD->m_pd.nMaxPage)
pInfo->m_pPD->m_pd.nMaxPage = pInfo->m_pPD->m_pd.nMinPage;

// don't prompt the user if we're doing print preview, printing directly,
// or printing via IPrint and have been instructed not to ask

CWinApp* pApp = AfxGetApp();

if (pInfo->m_bPreview || pInfo->m_bDirect ||
(pInfo->m_bDocObject && !(pInfo->m_dwFlags & PRINTFLAG_PROMPTUSER)))
{


if (pInfo->m_pPD->m_pd.hDC == NULL)
{
// if no printer set then, get default printer DC and create DC without calling
//   print dialog.

if (!pApp->GetPrinterDeviceDefaults(&pInfo->m_pPD->m_pd))
{

// bring up dialog to alert the user they need to install a printer.
if (!pInfo->m_bDocObject || (pInfo->m_dwFlags & PRINTFLAG_MAYBOTHERUSER))
if (pApp->DoPrintDialog(pInfo->m_pPD) != IDOK)
return FALSE;
}

if (pInfo->m_pPD->m_pd.hDC == NULL)
{
DEVMODE* dm1=(DEVMODE*) GlobalLock(pInfo->m_pPD->m_pd.hDevMode);

dm1->dmFields =DM_ORIENTATION | DM_PAPERSIZE;
dm1->dmOrientation=DMORIENT_LANDSCAPE; // или DMORIENT_PORTRAIT
dm1->dmPaperSize = DMPAPER_A4;
GlobalUnlock(pInfo->m_pPD->m_pd.hDevMode);

// call CreatePrinterDC if DC was not created by above
if (pInfo->m_pPD->CreatePrinterDC() == NULL)
return FALSE;
}
}

       

// set up From and To page range from Min and Max
pInfo->m_pPD->m_pd.nFromPage = (WORD)pInfo->GetMinPage();
pInfo->m_pPD->m_pd.nToPage = (WORD)pInfo->GetMaxPage();
}
else
                      //дальше нечего не менял...да и впрочем оно не надо
{

Кстати, Джон, твой код все таки работает , т.е. создал проект , вставил, но только со второго раза работает как нужно, по этому переместил все как описал выше. Спасибо за помощь, жду твой проект , просмотрю его, может что то найду еще.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 27-10-2009 11:18 » 

Да в принципе там ничего нового нет. Всё один в один.

Что значит со второго раза работает?

зы На будущее. Ты привёл, можно сказать, "рабочий" код - не который работает, а который из рабочего (или тестового) проекта - с кучей доп. функционала. Например, у тебя там отлавливались некоторые условия, которые непосредственно к "вращению" отношения не имеют.
Старайся выделить проблематичную часть в небольшие ф-ции. В первую очередь самому будет легче разбираться.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Smoke89
Гость
« Ответ #9 : 27-10-2009 11:24 » 

Да, хорошо ,я запомню на будущее, надо было снести часть кода которая не нужна, просто не подумал.

Со второго, это значит, беру запускаю твой проект , нажимаю "принт", выскакивает диалог печатает Portait, потом нажимаю опять печать уже печатает landscape.

Т.е. возможно ты меня изначально не правильно понял, хотя написал вроди бы доступно))
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 27-10-2009 13:25 » 

Да, именно поэтому. А то так бывало глянешь, вроде бы и помочь можно, да времени нет в простынях разбираться. Тогда уж лучше небольшой тестовый проектик.

Если честно, то я в своём проекте делаю совсем иначе, всё ручками, тк графика у меня базируется на gdi+ да и в DevMode приходится часто ручками лазить и настройки выставлять в индивидуальной области буквально побитно. Те мне просто нужно DC созданое на базе подготовленой DevMode. Они у меня даже хранятся в проге для кучи принтеров в map на всё время сессии, ну типа как в ворде. Вот "облегчённая" версия:

Код:
HDC CPrinterHelper::CreatePrinterDC(CString stPrinterName)
{
HDC hdcPrnOut = NULL;
HGLOBAL hDevMode = NULL;
HGLOBAL hDevNames = NULL;

if(GetPrinterDevice((LPTSTR)stPrinterName.GetBuffer(stPrinterName.GetLength()), &hDevNames, &hDevMode))
{
CString stPrinterDriverModelName = GetPrinterDriverName(stPrinterName);
LPDEVMODE pDevMode = (LPDEVMODE)::GlobalLock(hDevMode);
LPDEVMODE  pdmApp = theApp.GetPrinterDevMode(stPrinterName);
if(pdmApp)
{
memcpy(pDevMode, pdmApp, sizeof(DEVMODE));
}

// Get orientation from regestry
short nOrientation = theApp.GetPrinterOrientation(stPrinterName);
if(nOrientation!=0)
{
pDevMode->dmOrientation = nOrientation;// DMORIENT_PORTRAIT=1; DMORIENT_LANDSCAPE=2;
}

::GlobalUnlock(hDevMode);
hdcPrnOut = AfxCreateDC(hDevNames, hDevMode);
::GlobalFree(hDevMode);
::GlobalFree(hDevNames);
}

return hdcPrnOut;
}
« Последнее редактирование: 27-10-2009 13:27 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Smoke89
Гость
« Ответ #11 : 27-10-2009 14:41 » 

Спасибо учту на будущее)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines