请问哪个API函数可修改打印属性,使其横向打印。
谢谢!

解决方案 »

  1.   

    LPTSTR pPrinterName(pName);
      short dmOrientation(ori);   HANDLE hPrinter = NULL;
    DWORD dwNeeded = 0;
    PRINTER_INFO_2 *pi2 = NULL;
    DEVMODE *pDevMode = NULL;
    PRINTER_DEFAULTS pd;
    BOOL bFlag;
    LONG lFlag; // Open printer handle (on Windows NT, you need full-access because you
    // will eventually use SetPrinter)...
    ZeroMemory(&pd, sizeof(pd));
    pd.DesiredAccess = PRINTER_ALL_ACCESS;
    bFlag = OpenPrinter(pPrinterName, &hPrinter, &pd);
    if (!bFlag || (hPrinter == NULL))
    return 0; // The first GetPrinter tells you how big the buffer should be in 
    // order to hold all of PRINTER_INFO_2. Note that this should fail with 
    // ERROR_INSUFFICIENT_BUFFER.  If GetPrinter fails for any other reason 
    // or dwNeeded isn't set for some reason, then there is a problem...
    SetLastError(0);
    bFlag = GetPrinter(hPrinter, 2, 0, 0, &dwNeeded);
             if ((!bFlag) && (GetLastError() != ERROR_INSUFFICIENT_BUFFER) || 
             (dwNeeded == 0))
    {
    ClosePrinter(hPrinter);
    return 0;
    } // Allocate enough space for PRINTER_INFO_2...
    pi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);
    if (pi2 == NULL)
    {
    ClosePrinter(hPrinter);
    return 0;
    } // The second GetPrinter fills in all the current settings, so all you
    // need to do is modify what you're interested in...
    bFlag = GetPrinter(hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded);
    if (!bFlag)
    {
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    return 0;
    } // If GetPrinter didn't fill in the DEVMODE, try to get it by calling
    // DocumentProperties...
    if (pi2->pDevMode == NULL)
    {
    dwNeeded = DocumentProperties(NULL, hPrinter,
    pPrinterName,
    NULL, NULL, 0);
    if (dwNeeded <= 0)
    {
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    return 0;
    } pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
    if (pDevMode == NULL)
    {
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    return 0;
    } lFlag = DocumentProperties(NULL, hPrinter,
    pPrinterName,
    pDevMode, NULL,
    DM_OUT_BUFFER);
    if (lFlag != IDOK || pDevMode == NULL)
    {
    GlobalFree(pDevMode);
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    return 0;
    } pi2->pDevMode = pDevMode;
    } // Driver is reporting that it doesn't support this change...
    if (!(pi2->pDevMode->dmFields & DM_ORIENTATION))
    {
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    if (pDevMode)
    GlobalFree(pDevMode);
    return 0;
    } // Specify exactly what we are attempting to change...
    pi2->pDevMode->dmFields = DM_ORIENTATION;
    pi2->pDevMode->dmOrientation = dmOrientation; // Do not attempt to set security descriptor...
    pi2->pSecurityDescriptor = NULL; // Make sure the driver-dependent part of devmode is updated...
    lFlag = DocumentProperties(NULL, hPrinter,
      pPrinterName,
      pi2->pDevMode, pi2->pDevMode,
      DM_IN_BUFFER | DM_OUT_BUFFER);
    if (lFlag != IDOK)
    {
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    if (pDevMode)
    GlobalFree(pDevMode);
    return 0;
    } // Update printer information...
    bFlag = SetPrinter(hPrinter, 2, (LPBYTE)pi2, 0);
    if (!bFlag)
    // The driver doesn't support, or it is unable to make the change...
    {
    GlobalFree(pi2);
    ClosePrinter(hPrinter);
    if (pDevMode)
    GlobalFree(pDevMode);
    return 0;
    } // Tell other apps that there was a change...
    SendMessageTimeout(HWND_BROADCAST, WM_DEVMODECHANGE, 0L,
      (LPARAM)(LPCSTR)pPrinterName,
      SMTO_NORMAL, 1000, NULL); // Clean up...
    if (pi2)
    GlobalFree(pi2);
    if (hPrinter)
    ClosePrinter(hPrinter);
    if (pDevMode)
    GlobalFree(pDevMode);