热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在打印时,如何通过编程决定是横向打印还是纵向打印?

在打印时,如何通过编程决定是横向打印还是纵向打印?我不想通过打印对话框来选择,我看了CPrintDialog类的成员,没有查到相关的函数。如何解决这个问题,谢谢!
在打印时,如何通过编程决定是横向打印还是纵向打印?
我不想通过打印对话框来选择,我看了CPrintDialog类的成员,没有查到相关的函数。
如何解决这个问题,
谢谢!

6 个解决方案

#1


up

#2


up

#3


可以使用DocumentProperties函数
long lRet = 0;
lRet = DocumentProperties(NULL, hPrinter, printer, NULL, NULL, 0);

pDevMode = (PDEVMODE) new BYTE[lRet];
lRet = ::DocumentProperties(NULL, hPrinter ,printer, 
pDevMode, pDevMode, DM_OUT_BUFFER );

//设置打印属性 横向或纵向 (DMORIENT_PORTRAIT) 
pDevMode->dmOrientation = DMORIENT_LANDSCAPE ;

lRet = ::DocumentProperties(NULL, hPrinter, printer, 
pDevMode,pDevMode, DM_IN_BUFFER|DM_OUT_BUFFER );
//构造打印dc
HDC hdcPrinter = ::CreateDC("WINSPOOL", printer ,NULL, pDevMode);
...
然后使用hdcPrinter进行打印

#4


我跟踪CWinApp::OnFilePrintSetup();
结果如下
void CTempApp::OnFilePrintSetup() 
{
// TODO: Add your command handler code here
//CWinApp::OnFilePrintSetup();
CPrintDialog pd(TRUE);
pd.m_pd.hDevMode = m_hDevMode;
if(pd.DoModal()==IDOK)
m_hDevMode=pd.m_pd.hDevMode;
}
这里m_hDevMode是CWinApp类的protected成员
HGLOBAL m_hDevMode;             // printer Dev Mode
用来控制横向和纵向预览打印的,
但是不知道怎么用代码付值哦
帮你顶一下吧

#5


up

#6


这个问题已解决:
DEVMODE这个结构中的一个成员dmOrientation决定是横向打印(DMORIENT_LANDSCAPE)还是纵向打印(DMORIENT_PORTRAIT)。
具体代码实现如下:
void CAnalyzeDlg::Print(HDC hMemDC, LPRECT lpRect)
{
HDC hPrintDC;
DOCINFO docInfo;

CPrintDialog printDlg(FALSE);
if(printDlg.DoModal()!=IDOK) return;

hPrintDC=printDlg.GetPrinterDC();

LPDEVMODE lpDevMode=(LPDEVMODE)GlobalLock(printDlg.m_pd.hDevMode); 
if(lpDevMode){ 
lpDevMode->dmPaperSize=DMPAPER_A4; //将打印纸设置为A4 
// lpDevMode->dmOrientation=DMORIENT_LANDSCAPE; //将打印机设置为横向打印。 
lpDevMode->dmPrintQuality=DMRES_MEDIUM; //打印分辨率为600dpi 
ResetDC(hPrintDC,lpDevMode);
}else{
DeleteDC(hPrintDC);
return;
}
memset(&docInfo,0,sizeof(docInfo));
docInfo.cbSize=sizeof(DOCINFO);
docInfo.lpszDocName="统计报表窗口打印";
if(StartDoc(hPrintDC,&docInfo)<=0){
DeleteDC(hPrintDC);
return;
}
StartPage(hPrintDC);

SetMapMode(hPrintDC,MM_LOMETRIC); //logic unit:0.1mm
int x,y,w,h;
if(lpDevMode->dmOrientation==DMORIENT_LANDSCAPE){//横向打印
w=2670;
h=1850; // 267mm×185mm
x=(lpDevMode->dmPaperLength-w)/2;
y=(lpDevMode->dmPaperWidth-h)/2-50;
}else if(lpDevMode->dmOrientation==DMORIENT_PORTRAIT){//纵向打印
w=1850;
h=1335; // 185mm×133.5mm
x=(lpDevMode->dmPaperWidth-w)/2;
y=(lpDevMode->dmPaperLength-2*h)/2-50;
}
::StretchBlt(hPrintDC,x,-y,w,-h,// Destination
 hMemDC,0,0,lpRect->right-lpRect->left,lpRect->bottom-lpRect->top, //Source
 SRCCOPY);

GlobalUnlock(printDlg.m_pd.hDevMode); 
EndPage(hPrintDC);
EndDoc(hPrintDC);
DeleteDC(hPrintDC);
}

推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
水_-晶_522
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有