** 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 это уже не автомантический режим, а ручной. |
|
|