Как совместить использование Printer() (VCL) и WIN API
От: Vokidup  
Дата: 14.01.05 07:18
Оценка:
Проблема в следующем:

Под билдером я использую объект Printer() класса TPrinter для распечатки изображения.
До этого момента я использовал возможности этого класса чтобы не лезть в WIN API и не вносить сложности.
Однако TPrinter не позволяет осуществлять такие настройки как выбор размера бумаги, а также
получение списка всех форматов бумаги, допустимых для принтера. Это как раз то, что мне и нужно.

Например, чтобы изменить ориентацию бумаги на WIN API я сделал так:

    HANDLE HPrinter;
    if (OpenPrinter(Device.c_str(), &HPrinter, NULL))
    {
        // вызываем DocumentProerties() с нулевым параметром fMode
        // чтобы получить количество необходимых байт
        long int num_bytes;
        num_bytes = DocumentProperties(NULL, HPrinter, Device.c_str(),
                                       NULL, NULL, 0);

        // выделяем память
        unsigned char *buffer = new unsigned char[num_bytes];

        // опять вызываем DocumentProperties(), на сей раз, чтобы получить информацию об устройстве
        DocumentProperties(NULL, HPrinter, Device.c_str(),
                           (PDEVMODE)buffer, NULL, DM_OUT_BUFFER);

        PDEVMODE pdm = (PDEVMODE)buffer;

        pdm->dmOrientation = DMORIENT_LANDSCAPE;
        pdm->dmFields = pdm->dmFields | DM_ORIENTATION;

        // ещё раз вызываем DocumentProperties(), чтобы получить окончательный
        // DEVMODE который будет передан в функцию CreateDC()
        DocumentProperties(NULL, HPrinter, Device.c_str(),
                           pdm, pdm, DM_OUT_BUFFER | DM_IN_BUFFER);

        delete [] buffer;
        ClosePrinter(HPrinter);
    }


но связать эти изменения с объектом Printer() не получилось. Я так понимаю, что для этого надо использовать свойство Printer()->Handle, но у меня не получилось.
Подскажите плиз.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.