es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo desactivar la opción de imprimir a archivo al imprimir en C++

Estoy utilizando la biblioteca PRINTDLG para una aplicación de Windows antigua, que debe imprimir algunos archivos. Lo he configurado de tal manera que tome la impresora predeterminada e imprima el documento sin mostrar ningún cuadro de diálogo. Pero el problema es cuando no hay impresora y la impresora predeterminada está configurada para guardar en archivo, muestra una ventana emergente para guardar el archivo y la aplicación se minimiza, lo cual no debería ocurrir. Por lo tanto, quiero desactivar la funcionalidad de impresión en archivo. Intenté establecer la bandera para desactivar la impresión en archivo, pero no está funcionando… ¿Alguien sabe la solución o una forma de desactivar la ventana emergente del sistema?
Aquí tienes el código de ejemplo:

PRINTDLG pd;

memset(&pd, 0, sizeof(pd));

pd.lStructSize = sizeof(pd);
// Desactivar la bandera de impresión en archivo
pd.Flags = PD_RETURNDEFAULT | PD_RETURNIC | PD_DISABLEPRINTTOFILE;
if (!PrintDlg(&pd))
{
    MessageBox(NULL, _T("No se encontró impresora"), _T("¡Error de impresora!"), MB_OK);
}
else
{


    DOCINFO di;
    memset(&di, 0, sizeof(di));
    di.cbSize = sizeof(di);
    StartDoc(pd.hDC, &di);
    StartPage(pd.hDC);


    // Código de dibujo comienza
    //    
    RECT rc;
    rc.top = 100;
    rc.left = 100;
    rc.bottom = 300;
    rc.right = 300;

    HBRUSH greenBrush = CreateSolidBrush(RGB(0, 255, 0));
    FillRect(pd.hDC, &rc, greenBrush);
    DeleteObject(greenBrush);
    //
    // Código de dibujo termina

    EndPage(pd.hDC);
    EndDoc(pd.hDC);
    DeleteObject(pd.hDC);
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para desactivar la ventana emergente del sistema que aparece cuando no hay una impresora y se establece una impresora predeterminada para guardar en archivo, puedes utilizar la estructura PRINTDLG para configurar la bandera PD_DISABLEPRINTTOFILE, que desactiva la opción “Imprimir en archivo” en el cuadro de diálogo de impresión. Sin embargo, según el código proporcionado, parece que este enfoque no está funcionando.

    Una posible solución es verificar si hay una impresora disponible antes de llamar a la función PrintDlg, y si no la hay, mostrar un mensaje de error al usuario. Para verificar la presencia de una impresora, puedes utilizar el API PrintersFolder, específicamente la función EnumPrinters. Aquí hay un ejemplo de código que demuestra este enfoque:

    “`c++
    PRINTDLG pd;
    memset(&pd, 0, sizeof(pd));
    pd.lStructSize = sizeof(pd);
    pd.Flags = PD_RETURNDEFAULT | PD_RETURNIC | PD_DISABLEPRINTTOFILE;

    // Verificar si hay una impresora disponible
    DWORD numPrinters = 0;
    if (!EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &numPrinters, NULL))
    {
    MessageBox(NULL, _T(“Error al enumerar las impresoras”), _T(“¡Error de impresora!”), MB_OK);
    }
    else if (numPrinters == 0)
    {
    MessageBox(NULL, _T(“No se encontró ninguna impresora”), _T(“¡Error de impresora!”), MB_OK);
    }
    else if (!PrintDlg(&pd))
    {
    MessageBox(NULL, _T(“Error al abrir el cuadro de diálogo de impresión”), _T(“¡Error de impresora!”), MB_OK);
    }
    else
    {
    // imprimir documento
    }
    “`

    Ten en cuenta que la función EnumPrinters se llama con PRINTER_ENUM_LOCAL para recuperar solo impresoras locales, y con un nivel de 2 para recuperar información detallada sobre cada impresora. El parámetro numPrinters se utiliza para determinar si hay al menos una impresora disponible.

    Si no hay ninguna impresora disponible, se muestra un cuadro de mensaje para informar al usuario. Si hay una impresora disponible, se llama a la función PrintDlg con la estructura pd como entrada.

    Utilizando este enfoque, el cuadro de diálogo de impresión solo se muestra si hay una impresora disponible y la opción “Imprimir en archivo” está desactivada. Esto debería evitar que aparezca la ventana emergente del sistema cuando no hay una impresora y la impresora predeterminada está configurada para guardar en archivo.

Comments are closed.