怎样在程序中将打印机纸张的缺省设置由纵向改为横向。

fanfan 2000-06-14 11:00:00
想把打印设置中的纸张方向缺省值设为横向。
应该怎么做?
是不是在OnPreparePrinting()中设置pInfo值。该怎么设?
能不能详细介绍一下。
...全文
406 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
redoak2000 2000-06-19
  • 打赏
  • 举报
回复
使用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;
}
vcmfc 2000-06-17
  • 打赏
  • 举报
回复
使用win api:OpenPrint()后使用SetPrint(),msdn有api的说明.,其中有一个结构DEVMODE中可初始打印方向.

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧