MFC打印相关操作

Jun 07, 2016 pm 04:12 PM
mfc 인쇄 작동하다 지금 관련된 변화

虽说现在已经有越来越多的人转向用C#来做界面的开发,但是对于一个习惯了C这种半面向对象语言的人来说,MFC依然是难割舍的存在。最近在做些数据库相关的事,因为是数据库,自然离不开打印报表之类的东西,所以顺带的也去研究了下如何用MFC来进行打印相关的的

虽说现在已经有越来越多的人转向用C#来做界面的开发,但是对于一个习惯了C++这种半面向对象语言的人来说,MFC依然是难割舍的存在。最近在做些数据库相关的事,因为是数据库,自然离不开打印报表之类的东西,所以顺带的也去研究了下如何用MFC来进行打印相关的的操作。

本篇文章参考的比较多的是这篇文章和MSDN的示例代码,另外这篇文章也提供了很多有用的参考,如果想看原文的话可以去看看。

直接用微软提供的CPrintDialog类进行打印的相关操作是非常简单的,本人将代码封装成为两个函数,除了实际往一页纸上绘制东西的部分在第二个函数中进行定义外,其他与打印相关的操作都在第一个函数上实现了。具体如下:

打印相关操作主函数:

void CPrinttToPrinterDlg::OnBnClickedButtonPrint()
{
	CPrintDialog dlg(FALSE, PD_ALLPAGES, NULL);//打印对话框对象定义,参数一设置弹出对话框为打印对话框,参数二设置打印范围为全部页面,参数三可指定打印机,这里缺省即可

	/*打印对话框的初始值设置,在实际应用中可根据需要进行设置,如通过预先计算得到要打印的页面范围等*/
	dlg.m_pd.nMinPage = 1;//指定开始/结束页码编辑控件的页码范围的最小值,若nMinPage=nMaxPage,则“页码范围”单选钮和开始/结束页码编辑控件被灰化
	dlg.m_pd.nMaxPage = 2;//指定开始/结束页码编辑控件的页码范围的最大值
	dlg.m_pd.nCopies = 1;//指定拷贝份数编辑控件的初始值
	dlg.m_pd.nFromPage = 1;//指定开始页码编辑控件的初始值
	dlg.m_pd.nToPage = 2;//指定结束页码编辑控件的初始值

	if (dlg.DoModal() == IDOK)
	{
		HDC hdcPrinter = dlg.GetPrinterDC();
		if (hdcPrinter == NULL)//检取设备环境的句柄,检索不到则提醒并退出
		{
			MessageBox(_T("Buy a printer!"));
		}
		else
		{
			/*创建图形设备环境并与打印机设备关联,在上面绘图就相当于往打印机要打出的纸上绘图*/
			CDC dcPrinter;
			dcPrinter.Attach(hdcPrinter);

			/*
			 *在打印设置过程中有些东西我们希望用户来选,所以使用了对话框的形式,但是有些
			 *东西比如纸张大小和打印方向等我们希望它是固定的,不能让用户随意设置造成麻烦
			 *因此,我们利用已经得到的打印机图形设备环境,通过修改它来实现固定设置的功能
			 */
			LPDEVMODE pDevMode;
			pDevMode = (LPDEVMODE)GlobalLock(dlg.m_pd.hDevMode);
			pDevMode->dmOrientation = DMORIENT_LANDSCAPE;//设置打印方向为横向
			pDevMode->dmPaperSize = DMPAPER_A4;//设置纸张大小为A4
			dcPrinter.ResetDC(pDevMode);

			//通知打印机驱动程序接收打印文档并开始打印
			DOCINFO docinfo;
			memset(&docinfo, 0, sizeof(docinfo));
			docinfo.cbSize = sizeof(docinfo);
			docinfo.lpszDocName = _T("CDC::StartDoc() Code Fragment");

			//如果初始化失败则提醒并退出
			if (dcPrinter.StartDoc(&docinfo) < 0)
			{
				MessageBox(_T("Printer wouldn&#39;t initalize"));
			}
			else
			{
				/*打印的纸张大小我们是需要知道的,此外我们还需要设备像素点和实际长度单位的换算关系即DPI*/
				int xDPI = GetDeviceCaps(hdcPrinter, LOGPIXELSX);//返回X方向上每英寸的设备点数,即DPI
				float mmdpix = xDPI / 25.4;//每毫米所占的设备点数
				int yDPI = GetDeviceCaps(hdcPrinter, LOGPIXELSY);//返回Y方向上每英寸的设备点数,即DPI
				float mmdpiy = yDPI / 25.4;//每毫米所占的设备点数

				float printerscreenx, printerscreeny;//这里得到打印机屏幕的宽高,也就是纸张的大小,会比实际小约6mm
				printerscreenx = GetDeviceCaps(hdcPrinter, HORZSIZE);
				printerscreeny = GetDeviceCaps(hdcPrinter, VERTSIZE);

				/*因为要打印的页码范围和份数是用户选择的,所以在此对用户选择的项做处理*/
				int pagebegin, pageend;//打印范围
				if (dlg.PrintAll())//看用户是否选择了全部打印这一项,是的话则全部打印
				{
					pagebegin = dlg.m_pd.nMinPage;
					pageend = dlg.m_pd.nMaxPage;
				}
				else if (dlg.PrintRange())//用户选择了选定页码范围项
				{
					pagebegin = dlg.m_pd.nFromPage;
					pageend = dlg.m_pd.nToPage;
				}
				else//用户选择了选定范围打印,因为我们在这里没有提供选定范围的功能,所以用户一旦选择这里当成是操作错误处理即可
				{
					MessageBox(_T("Could not choise this one"));
					dcPrinter.AbortDoc();//错误退出区别于EndDoc
				}
				int  ncopy = dlg.m_pd.nCopies;//用户选择打印分数

				/*在这里进行打印工作*/
				while (ncopy--)//逐份打印
				{
					for (int page = pagebegin; page <= pageend; page++)//从选定范围开始打印
					{
						if (dcPrinter.StartPage() < 0)
						{
							MessageBox(_T("Could not start page"));
							dcPrinter.AbortDoc();//错误退出区别于EndDoc
						}
						else//如果进入这里则绘出要打印内容并结束掉一页的打印
						{
							doThePrint(dcPrinter, page, mmdpix, mmdpiy, printerscreenx, printerscreeny);
							dcPrinter.EndPage();
						}
					}
				}
			}
			dcPrinter.EndDoc();//打印完成退出
			dcPrinter.Detach();//释放DC
		}
	}
}
로그인 후 복사

实际往一页纸上打印的内容在此函数中进行定义,下面函数内容实现在打印的纸上绘制一个大小稍小于页面的绿色矩形:
void CPrinttToPrinterDlg::doThePrint(CDC &dc,int page, float mdpix, float mdpiy, float mpagex, float mpagey)//打印实际绘图函数,往参数一传入的CDC上面绘图
{
	CPen pen, *pOldPen;// 定义笔对象和指针  // 创建10单位宽的绿色实心笔 
	pen.CreatePen(PS_SOLID, 100, RGB(0, 255, 0));
	pOldPen = dc.SelectObject(&pen);// 选入绿色笔  
	dc.Re【本文来自鸿网互联 (http://www.68idc.cn)】ctangle(0 * mdpix, 0 * mdpiy, mpagex*mdpix, mpagey*mdpiy);// 画矩形 
	dc.SelectObject(pOldPen);// 选出绿色笔  
	pen.DeleteObject();// 删除绿色笔
}
로그인 후 복사

到此文章就已经写得七七八八了,调用主函数就可以实现往打印机上打印动东西的功能。至于打印什么东西,如何去打,就是GDI绘图的事了。另外由于我们还没有实现打印预览的功能,所以可以用虚拟打印机来看效果,当然如果有钱,也可以直接用真的打印机来看啦哈哈,本人用的是finepring,简而言之就两个字形容,神器!

打印预览还有如何去打印数据表格这些功能本人后面如果研究实现了的话也会贴上来,或者发个链接上来,这篇文章就先到这里吧。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

엑셀 인쇄 시 테두리 선이 사라지면 어떻게 해야 하나요? 엑셀 인쇄 시 테두리 선이 사라지면 어떻게 해야 하나요? Mar 21, 2024 am 09:50 AM

인쇄해야 하는 파일을 열 때 인쇄 미리보기에서 어떤 이유로 인해 테이블 ​​프레임 선이 사라진 것을 발견할 수 있습니다. 이러한 상황이 발생하면 인쇄에도 나타나는 경우 제때에 처리해야 합니다. file 이런 질문이 있으시면 에디터에 가입하여 다음 강좌를 배워보세요. Excel에서 표를 인쇄할 때 테두리 선이 사라지면 어떻게 해야 하나요? 1. 아래 그림과 같이 인쇄할 파일을 엽니다. 2. 아래 그림과 같이 필요한 콘텐츠 영역을 모두 선택합니다. 3. 아래 그림과 같이 마우스 오른쪽 버튼을 클릭하고 "셀 서식" 옵션을 선택합니다. 4. 아래 그림과 같이 창 상단의 "테두리" 옵션을 클릭하세요. 5. 아래 그림과 같이 왼쪽 선 스타일에서 가는 실선 패턴을 선택합니다. 6. '외부 테두리'를 선택하세요.

이 문서의 페이지를 다시 매거나 인쇄하려면 메모리나 디스크 공간이 부족합니다. Word 오류 이 문서의 페이지를 다시 매거나 인쇄하려면 메모리나 디스크 공간이 부족합니다. Word 오류 Feb 19, 2024 pm 07:15 PM

이 기사에서는 Microsoft Word에서 문서를 다시 페이지하거나 인쇄하기 위한 메모리나 디스크 공간 부족 문제를 해결하는 방법을 소개합니다. 이 오류는 일반적으로 사용자가 Word 문서를 인쇄하려고 할 때 발생합니다. 비슷한 오류가 발생하는 경우 이 문서에 제공된 제안 사항을 참조하여 문제를 해결하세요. 이 문서를 다시 페이지하거나 인쇄할 메모리나 디스크 공간이 부족합니다. Word 오류 "문서를 다시 페이지하거나 인쇄할 메모리나 디스크 공간이 부족합니다."라는 Microsoft Word 인쇄 오류를 해결하는 방법입니다. Microsoft Office 업데이트 메모리를 많이 차지하는 응용 프로그램 닫기 기본 프린터 변경 안전 모드에서 Word 시작 NorMal.dotm 파일 이름 바꾸기 Word 파일을 다른 이름으로 저장

iPhone에서 인쇄하는 4가지 방법 iPhone에서 인쇄하는 4가지 방법 Feb 02, 2024 pm 04:10 PM

이 디지털 세상에서 인쇄된 페이지의 필요성은 사라지지 않았습니다. 콘텐츠를 컴퓨터에 저장하고 프린터로 직접 보내는 것이 더 편리하다고 생각할 수도 있지만 iPhone에서도 동일한 작업을 수행할 수 있습니다. iPhone의 카메라를 사용하면 사진이나 문서를 찍을 수 있고, 언제든지 인쇄하기 위해 파일을 직접 저장할 수도 있습니다. 이렇게 하면 필요한 정보를 빠르고 쉽게 구체화하여 종이 문서에 저장할 수 있습니다. 직장에서든 일상생활에서든 iPhone은 휴대용 인쇄 솔루션을 제공합니다. 다음 게시물은 iPhone을 사용하여 프린터에서 페이지를 인쇄하려는 경우 알아야 할 모든 것을 이해하는 데 도움이 될 것입니다. iPhone에서 인쇄: Apple에 문의

Windows 11/10의 캡처 도구에서 인쇄할 수 없습니다 Windows 11/10의 캡처 도구에서 인쇄할 수 없습니다 Feb 19, 2024 am 11:39 AM

Windows 11/10에서 캡처 도구를 사용하여 인쇄할 수 없는 경우 손상된 시스템 파일이나 드라이버 문제가 원인일 수 있습니다. 이 기사에서는 이 문제에 대한 해결책을 제공할 것입니다. Windows 11/10의 캡처 도구에서 인쇄할 수 없음 Windows 11/10의 캡처 도구에서 인쇄할 수 없는 경우 다음 해결 방법을 사용하십시오. PC 프린터 다시 시작 인쇄 대기열 지우기 프린터 및 그래픽 드라이버 업데이트 캡처 도구 수정 또는 재설정 SFC를 실행하고 DISM 스캔은 PowerShell 명령을 사용하여 캡처 도구를 제거하고 다시 설치합니다. 시작하자. 1] PC와 프린터 다시 시작 PC와 프린터를 다시 시작하면 일시적인 결함을 제거하는 데 도움이 됩니다.

Windows 11에서 인쇄를 일시 중지하는 방법 Windows 11에서 인쇄를 일시 중지하는 방법 Feb 19, 2024 am 11:50 AM

실수로 대용량 파일을 인쇄하셨나요? 잉크와 종이를 절약하기 위해 인쇄를 중지하거나 일시 중지해야 합니까? Windows 11 장치에서 진행 중인 인쇄 작업을 일시 중지해야 하는 상황이 많이 있습니다. Windows 11에서 인쇄를 일시 중지하는 방법은 무엇입니까? Windows 11에서 인쇄를 일시 중지하면 인쇄 작업이 일시 중지되지만 인쇄 작업이 취소되지는 않습니다. 이는 사용자에게 보다 유연한 제어를 제공합니다. 이를 수행하는 방법에는 세 가지가 있습니다. 작업 표시줄을 사용하여 인쇄 일시 중지 Windows 설정을 사용하여 인쇄 일시 중지 제어판을 사용하여 인쇄 이제 이에 대해 자세히 살펴보겠습니다. 1] 작업 표시줄을 사용하여 인쇄 작업 표시줄의 인쇄 대기열 알림을 마우스 오른쪽 버튼으로 클릭합니다. 모든 활성 프린터 옵션을 열려면 클릭하세요. 여기에서 인쇄 작업을 마우스 오른쪽 버튼으로 클릭하고 모두 일시 중지를 선택합니다.

Outlook에서 모든 첨부 파일을 인쇄하는 방법 Outlook에서 모든 첨부 파일을 인쇄하는 방법 Feb 20, 2024 am 10:30 AM

Outlook은 가장 기능이 풍부한 이메일 클라이언트 중 하나이며 전문적인 커뮤니케이션에 없어서는 안될 도구가 되었습니다. 문제 중 하나는 Outlook에서 모든 첨부 파일을 동시에 인쇄하는 것입니다. 일반적으로 인쇄하기 전에 첨부 파일을 하나씩 다운로드해야 하지만 모든 것을 한 번에 인쇄하려는 경우 대부분의 사람들이 직면하는 문제입니다. Outlook에서 모든 첨부 파일을 인쇄하는 방법 대부분의 정보는 Outlook 응용 프로그램에서 온라인으로 유지되지만 백업을 위해 정보를 인쇄해야 하는 경우가 있습니다. 계약서, 정부 양식, 숙제 등 법적 요구 사항을 충족하려면 문서에 직접 서명해야 합니다. Outlook의 모든 첨부 파일을 하나씩 인쇄하는 대신 한 번의 클릭으로 인쇄할 수 있는 여러 가지 방법이 있습니다. 각각을 자세히 살펴보겠습니다. 아웃루

PyCharm 사용 튜토리얼: 작업 실행에 대해 자세히 안내합니다. PyCharm 사용 튜토리얼: 작업 실행에 대해 자세히 안내합니다. Feb 26, 2024 pm 05:51 PM

PyCharm은 매우 인기 있는 Python 통합 개발 환경(IDE)으로 Python 개발을 더욱 효율적이고 편리하게 만들어주는 다양한 기능과 도구를 제공합니다. 이 기사에서는 PyCharm의 기본 작동 방법을 소개하고 독자가 도구 작동을 빠르게 시작하고 능숙하게 사용할 수 있도록 구체적인 코드 예제를 제공합니다. 1. PyCharm 다운로드 및 설치 먼저 PyCharm 공식 웹사이트(https://www.jetbrains.com/pyc)로 이동해야 합니다.

Word 편지 병합으로 빈 페이지가 인쇄됩니다. Word 편지 병합으로 빈 페이지가 인쇄됩니다. Feb 19, 2024 pm 04:51 PM

Word를 사용하여 편지 병합 문서를 인쇄할 때 빈 페이지가 나타나는 경우 이 문서가 도움이 될 것입니다. 메일 병합은 개인화된 문서를 쉽게 작성하여 여러 수신자에게 보낼 수 있는 편리한 기능입니다. Microsoft Word에서 메일 병합 기능은 사용자가 각 수신자에 대해 동일한 콘텐츠를 수동으로 복사하는 데 소요되는 시간을 절약해 주기 때문에 높은 평가를 받고 있습니다. 편지 병합 문서를 인쇄하려면 우편물 탭으로 이동하세요. 그러나 일부 Word 사용자는 메일 병합 문서를 인쇄하려고 할 때 프린터에서 빈 페이지가 인쇄되거나 전혀 인쇄되지 않는다고 보고했습니다. 이는 잘못된 형식이나 프린터 설정 때문일 수 있습니다. 문서 및 프린터 설정을 확인하고 인쇄하기 전에 문서를 미리 확인하여 내용이 올바른지 확인하세요. 만약에

See all articles