C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как установить Альбомную бумагу в Internet Explore, Как установить Альбомную бумагу в IE
** dvv
Отправлено: 18.07.2005, 17:11


Не зарегистрирован







Есть у меня приложение.
В приложении есть компонент CppWebBrowser.
Он же явлется встроенным Internet Explorer-ом.
Приложение создает HTML файл, который отображается в CppWebBrowser.
Затем пользователь рассматриваем этот файл и возможно захочет его напечатать.
В некоторых случаях этот файл нужно печатать на бумаге с книжной ориентацией, а в некоторых с альбомной ориентацией.
Печать производится командой CppWebBrowser->ExecWB((Shdocvw_tlb::OLECMDID)6, (Shdocvw_tlb::OLECMDEXECOPT)0, NULL, NULL);
Или из стандартного выпадающего меню (что в принципе одно и то же).
Как автоматически установить ориентацию бумаги?
GIZMO
Отправлено: 18.07.2005, 22:08


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (** dvv @ 18/07/2005, 17:11)
Есть у меня приложение.
В приложении есть компонент CppWebBrowser.
Он же явлется встроенным Internet Explorer-ом.
Приложение создает HTML файл, который отображается в CppWebBrowser.
Затем пользователь рассматриваем этот файл и возможно захочет его напечатать.
В некоторых случаях этот файл нужно печатать на бумаге с книжной ориентацией, а в некоторых с альбомной ориентацией.
Печать производится командой CppWebBrowser->ExecWB((Shdocvw_tlb::OLECMDID)6, (Shdocvw_tlb::OLECMDEXECOPT)0, NULL, NULL);
Или из стандартного выпадающего меню (что в принципе одно и то же).
Как автоматически установить ориентацию бумаги?

print template
dvv
Отправлено: 19.07.2005, 10:39


Дежурный стрелочник

Группа: Участник
Сообщений: 43



Нашел пример. Устанавливаются системные значения параметров принтера по умолчанию:
CODE

void __fastcall TForm1::SetPrinterPar(char *szPrinterName,TOrientation Orientation)
{
HANDLE hPrinter;
PRINTER_DEFAULTS pd;
DWORD dwNeeded;
PRINTER_INFO_2 *pPrtInfo2;
AnsiString asComent;

// Получаем структуру с установками принтера
ZeroMemory(&pd, sizeof(PRINTER_DEFAULTS));
pd.DesiredAccess=PRINTER_ALL_ACCESS;
OpenPrinter(szPrinterName,&hPrinter,&pd);
GetPrinter(hPrinter,2,NULL,0,&dwNeeded);
pPrtInfo2=(PRINTER_INFO_2*) malloc(dwNeeded);
GetPrinter(hPrinter,2,(LPBYTE)pPrtInfo2,dwNeeded,&dwNeeded);

// Устанавливаем ориентацию
pPrtInfo2->pDevMode->dmFields      |=DM_ORIENTATION;
if(Orientation==poPortrait)
pPrtInfo2->pDevMode->dmOrientation =DMORIENT_PORTRAIT;
else
pPrtInfo2->pDevMode->dmOrientation =DMORIENT_LANDSCAPE;
SetPrinter(hPrinter,2,(LPBYTE)pPrtInfo2,0))

// Закрываем и освобождаем
free(pPrtInfo2);
ClosePrinter(hPrinter);
}



Функция получает имя принтера и требуемую ориентацию.
Для проверки помещаю на форму компонент CppWebBrowser и две кнопки "Книжная" и "Альбомная". Так же потребуется какой либо простой HTML файл с именем testPtrint.html, лежащий в той же папке, что и приложение. В свойствах формы нужно объявить тип и функцию:
enum TOrientation {poPortrait,poLandscape};
void __fastcall SetPrinterPar(char *szPrinterName,TOrientation Orientation);

Тестирую с помощью кода:
CODE

//---------------------------------------------------------------------------
// Книжная
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SetPrinterPar(Printer()->Printers->Strings[Printer()->PrinterIndex].c_str(),poPortrait);
CppWebBrowser1->ExecWB((Shdocvw_tlb::OLECMDID)7, (Shdocvw_tlb::OLECMDEXECOPT)0, NULL , NULL);
}
//---------------------------------------------------------------------------
// Альбомная
void __fastcall TForm1::Button2Click(TObject *Sender)
{
SetPrinterPar(Printer()->Printers->Strings[Printer()->PrinterIndex].c_str(),poLandscape);
CppWebBrowser1->ExecWB((Shdocvw_tlb::OLECMDID)7, (Shdocvw_tlb::OLECMDEXECOPT)0, NULL , NULL);
}
//---------------------------------------------------------------------------
// При открытии формы
void __fastcall TForm1::FormShow(TObject *Sender)
{
wchar_t s[100];
StringToWideChar(ExtractFilePath(Application->ExeName)+"testPtrint.html",s,100);
CppWebBrowser1->Navigate(s,0,0,0,0);
}


Почему то отрабатывает только один раз. Повторно сменить ориентацию не получается до тех пор, пока не перезапустишь программу. Может кто подскажет почему?

Отредактировано dvv — 20/07/2005, 13:04
GIZMO
Отправлено: 19.07.2005, 12:23


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (dvv @ 19/07/2005, 10:39)
Почему то отрабатывает только один раз. Повторно сменить ориентацию не получается до тех пор, пока не перезапустишь программу. Может кто подскажет почему?

Странно почему вообще отрабатывает. WebBrowser Control — ActiveX и у него свои взгляды на принтер и его установки. И почему бы не вызвать окно PageSetup:
CODE

CppWebBrowser->ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);

ну если надо тонкую настройку, то еще раз говорю набери в MSDN — "print templates"
dvv
Отправлено: 19.07.2005, 13:53


Дежурный стрелочник

Группа: Участник
Сообщений: 43



Окно PageSetup это уже не автомантический режим, а ручной.

Вернуться в Вопросы программирования в C++Builder