C++Builder

Вопросы программирования => Windows API => Тема начата: AndrewSem от 30 января 2012, 20:31:18



Название: 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);
Всем спасибо, тему можно закрывать.