使用win api:OpenPrint()后使用SetPrint(),msdn有api的说明.,其中有一个结构DEVMODE中可初始打印方向.

解决方案 »

  1.   

    使用API可能有好几种方法都可以实现,我没有仔细研究别的方法。这儿有我的一段源代码可直接使用。
    //Set the orient of the printer
    //sPrnName is the name of the printer
    BOOL SetPrinterOrient(CString sPrnName,BOOL bPortrait)
    {
    if(sPrnName.IsEmpty())
    return FALSE;
    HANDLE hPrinter=NULL;
    BOOL bFlag;
    DWORD dwNeeded=0;
    PRINTER_INFO_2* pPI2=NULL;
    HANDLE h;
    PRINTER_DEFAULTS* ppd=new PRINTER_DEFAULTS; ZeroMemory(ppd,sizeof(PRINTER_DEFAULTS));//zero the memory
    ppd->DesiredAccess=PRINTER_ALL_ACCESS;//set access priority
    bFlag=OpenPrinter( sPrnName.GetBuffer(sPrnName.GetLength()),&hPrinter,ppd);//open the printer
    sPrnName.ReleaseBuffer();
    if(bFlag && hPrinter && ppd)
    {
    GetPrinter(hPrinter,2,0,0,&dwNeeded);
    if(dwNeeded)
    {
    h=GetProcessHeap();
    if(h)
    {
    pPI2=(PRINTER_INFO_2*)HeapAlloc(h,HEAP_ZERO_MEMORY,dwNeeded);
    if(pPI2)
    {
    bFlag=GetPrinter(hPrinter,2,(LPBYTE)pPI2,dwNeeded,&dwNeeded);
    if(bFlag)
    {
    if( (pPI2->pDevMode!=NULL) && (pPI2->pDevMode->dmFields& DM_ORIENTATION ))
    {
    pPI2->pDevMode->dmOrientation= (bPortrait ? DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE);
    bFlag=SetPrinter(hPrinter,2,(LPBYTE)pPI2,0);
    }
    }
    HeapFree(h,HEAP_NO_SERIALIZE,pPI2);
    }
    }
    }
    }
    if( hPrinter)
    ClosePrinter(hPrinter);
    if(ppd)
    delete ppd;
    return bFlag;
    }打印机的名字sPrnName我是这样得到的。如成功Func返回TRUE,str中返回的其名字,如失败则Func返回FALSE
    BOOL InitPrinter(CString &str)//
    {
    DWORD            dwNeeded, dwReturned ;
    str.Empty();
    PRINTER_INFO_4 * pinfo4 ;
    PRINTER_INFO_5 * pinfo5 ; 
    HANDLE h=GetProcessHeap();
    if(!h)
    return FALSE;
    if (GetVersion () & 0x80000000)         // Windows 98
    {
    EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 5, NULL,
    0, &dwNeeded, &dwReturned) ;
    if(dwNeeded==0)
    return FALSE;
    pinfo5 = (PRINTER_INFO_5*)HeapAlloc(h,HEAP_ZERO_MEMORY,dwNeeded);
    if(pinfo5)
    {
    pinfo5->pPrinterName=NULL;
    if(EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 5, (PBYTE) pinfo5,
    dwNeeded, &dwNeeded, &dwReturned) )
    if(pinfo5->pPrinterName)
    str=pinfo5->pPrinterName;
    HeapFree(h,HEAP_NO_SERIALIZE,pinfo5);
    }
    }
    else                                    // Windows NT
    {
    EnumPrinters (PRINTER_ENUM_DEFAULT, NULL, 4, NULL,
    0, &dwNeeded, &dwReturned) ;
    if(dwNeeded==0)
    return FALSE;
    pinfo4 = (PRINTER_INFO_4*)HeapAlloc(h,HEAP_ZERO_MEMORY,dwNeeded);
    if(pinfo4)
    {
    if(EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4,
    dwNeeded, &dwNeeded, &dwReturned) )
    pinfo4->pPrinterName=NULL;
    if(pinfo4->pPrinterName)
    str=CString(pinfo4->pPrinterName);
    HeapFree(h,HEAP_NO_SERIALIZE,pinfo4);
    }
    }
    return TRUE;
    }