Название: TPrinter() как установить размер бумаги (стандартный) Отправлено: AndrewSem от 30 января 2012, 20:31:18 Привет еще раз. К сожалению с пользовательским форматом бумаги мне не смогли помочь. Тогда может кто знает как установить какой-нибудь другой стандартный размер (А4, А5, А6 ...) без изменения системных настроек, без пользовательских диалогов? В каких то старых книжках прочитал, что нужно использовать структуру PDEVMODE. На форумах нашел похожий код на Delphi. Правда там не размеры меняют, а число копий…Мой код никаких ошибок не выдает, но и размер бумаги не устанавливает почему-то. Может кто знает в чем дело или как решить мою задачу?
PS Я где-то встречал информацию, что настройки принтера можно получить через PrinterDialog, PrinterSetupDialog, причем не вызывая самого диалога. Но не встречал примера. Это возможно? Код: Printer()->PrinterIndex = 2; ShowMessage("Область печати (до изменений): " + IntToStr(Printer()->PageWidth) + "x" + IntToStr(Printer()->PageHeight)); UnicodeString DeviceName, DriveName, PortName; //Фиктивная переменная THandle hPrnDevMode; //Фиктивная переменная PDEVMODE pDevMode; //Указатель на структуру DeviceMode Printer()->GetPrinter(DeviceName.c_str(), DriveName.c_str(), PortName.c_str(), hPrnDevMode); if (hPrnDevMode == 0) { ShowMessage("Не получилось настроить параметры печати!"); return; } //Получаем указатель на структуру DEVMODE pDevMode = (PDEVMODE) GlobalLock((HANDLE)hPrnDevMode); if (pDevMode == NULL) { ShowMessage("Не получилось настроить параметры печати!"); return; } //Настраиваем параметры печати pDevMode->dmFields |= DM_PAPERSIZE; pDevMode->dmPaperSize = DMPAPER_A6; //Освобождаем структуру DEVMODE GlobalUnlock((HANDLE)hPrnDevMode); //Размеры НЕ ИЗМЕНИЛИСЬ, почему? ShowMessage("Область печати (после изменений): " + IntToStr(Printer()->PageWidth) + "x" + IntToStr(Printer()->PageHeight)); Printer()->BeginDoc(); … Printer()->EndDoc(); Название: Re: TPrinter() как установить размер бумаги (стандартный) Отправлено: xelablin от 02 февраля 2012, 14:34:08 Цитировать //Размеры НЕ ИЗМЕНИЛИСЬ, почему? Изменились, но не там где нужно.Далее следует обновить структуру в самом Printer() Код: HANDLE HMem; char device[MAX_PATH], driver[MAX_PATH], port[MAX_PATH]; // use the TPrinter object to invoke the changes Printer()->PrinterIndex = Printer()->PrinterIndex; Printer()->GetPrinter(device, driver, port, (int)HMem); Printer()->SetPrinter(device, driver, port, (int)hPrnDevMode); GlobalFree(HMem); Вязто от сюда: http://bcbjournal.org/bcbcaq/?loc=system&caq=4 (http://bcbjournal.org/bcbcaq/?loc=system&caq=4) Название: Re: TPrinter() как установить размер бумаги (стандартный) Отправлено: xelablin от 02 февраля 2012, 15:14:55 Цитировать PS Я где-то встречал информацию, что настройки принтера можно получить через PrinterDialog, PrinterSetupDialog, причем не вызывая самого диалога. Но не встречал примера. Это возможно? Можно использовать любой диалог с параметром PSD_RETURNDEFAULT, тогда сам диалог не показывается, а возвращаются настройки по умолчанию.Код: HGLOBAL hDevMode = NULL; DEVMODE * pDevMode = NULL; PAGESETUPDLG psd; Printer()->PrinterIndex = Printer()->PrinterIndex; ShowMessage("Область печати (до изменений): " + IntToStr(Printer()->PageWidth) + "x" + IntToStr(Printer()->PageHeight)); ZeroMemory(&psd, sizeof(PAGESETUPDLG)); // initialize the PAGESETUPDLG structure psd.lStructSize = sizeof(PAGESETUPDLG); psd.hwndOwner = Handle; psd.hDevMode = NULL; psd.Flags = PSD_RETURNDEFAULT; // display the dialog box if (PageSetupDlg(&psd)) { HANDLE HMem; char device[MAX_PATH], driver[MAX_PATH], port[MAX_PATH]; Printer()->GetPrinter(device, driver, port, (int)HMem); pDevMode = (DEVMODE *) GlobalLock(psd.hDevMode); // lock the memory and return a pointer to it if ( pDevMode ) { pDevMode->dmSize = sizeof(DEVMODE); // set the size of the DEVMODE structure pDevMode->dmFields = DM_PAPERSIZE; // tell Windows that I will be setting the dmPaperSize field pDevMode->dmPaperSize = DMPAPER_A5; } GlobalUnlock(psd.hDevMode); // unlock the memory for other functions to use this Printer()->SetPrinter(device, driver, port, (int)psd.hDevMode); ShowMessage("Область печати (после изменений): " + IntToStr(Printer()->PageWidth) + "x" + IntToStr(Printer()->PageHeight)); //GlobalFree(HMem); //на этом месте возникает исключение, не совсем понятно почему GlobalFree(psd.hDevNames); GlobalFree(psd.hDevMode); } Название: Re: TPrinter() как установить размер бумаги (стандартный) Отправлено: AndrewSem от 02 февраля 2012, 20:27:17 В книгах написано, что должно работать без SetPrinter(). За информацию по диалогу спасибо, буду знать на будущее. Вопрос решил через создание контекста устройства.
Код: HDC HPrinterDC = CreateDC(Driver, Device, NULL, pdm); Всем спасибо, тему можно закрывать. |