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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Excelで印刷時に枠線が消えてしまった場合はどうすればよいですか? Excelで印刷時に枠線が消えてしまった場合はどうすればよいですか? 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 で Snipping Tool を使用して印刷できない場合は、システム ファイルの破損またはドライバーの問題が原因である可能性があります。この記事では、この問題の解決策を紹介します。 Windows 11/10 で Snipping Tool から印刷できない Windows 11/10 で Snipping Tool から印刷できない場合は、次の修正を使用します。 PC プリンタを再起動する 印刷キューをクリアする プリンタとグラフィックス ドライバを更新する Snipping Tool を修正またはリセットする SFC を実行し、 DISM スキャンは PowerShell コマンドを使用して Snipping Tool をアンインストールおよび再インストールします。始めましょう。 1] PC とプリンターを再起動します。 PC とプリンターを再起動すると、一時的な不具合を解消できます。

Windows 11で印刷を一時停止する方法 Windows 11で印刷を一時停止する方法 Feb 19, 2024 am 11:50 AM

間違って大きなファイルを印刷してしまったのでしょうか?インクと用紙を節約するために印刷を停止または一時停止する必要がありますか? Windows 11 デバイスで進行中の印刷ジョブを一時停止する必要がある状況は数多くあります。 Windows 11 で印刷を一時停止するにはどうすればよいですか? Windows 11 では、印刷を一時停止すると印刷ジョブは一時停止されますが、印刷タスクはキャンセルされません。これにより、ユーザーはより柔軟な制御が可能になります。これを行うには、次の 3 つの方法があります。 タスクバーを使用して印刷を一時停止する Windows の設定を使用して印刷を一時停止する コントロール パネルを使用して印刷する それでは、これらを詳しく見てみましょう。 1] タスクバーを使用して印刷する タスクバーの印刷キュー通知を右クリックします。クリックすると、アクティブなプリンター オプションがすべて開きます。ここで、印刷ジョブを右クリックし、「すべて一時停止」を選択します。

Outlook ですべての添付ファイルを印刷する方法 Outlook ですべての添付ファイルを印刷する方法 Feb 20, 2024 am 10:30 AM

Outlook は最も機能が豊富な電子メール クライアントの 1 つであり、プロフェッショナルなコミュニケーションに不可欠なツールとなっています。課題の 1 つは、Outlook ですべての添付ファイルを同時に印刷することです。通常、印刷する前に添付ファイルを 1 つずつダウンロードする必要がありますが、すべてを一度に印刷したい場合、これはほとんどの人が遭遇する問題です。 Outlook ですべての添付ファイルを印刷する方法 ほとんどの情報は Outlook アプリケーションでオンラインで保持されますが、バックアップのために情報を印刷する必要がある場合があります。契約書、政府の書類、宿題などの法的要件を満たすために、文書に直接署名する必要があります。 Outlook の添付ファイルを 1 つずつ印刷するのではなく、ワンクリックですべての添付ファイルを印刷できる方法がいくつかあります。それぞれを詳しく見てみましょう。アウトルー

PyCharm の使用法チュートリアル: 操作の実行方法を詳しく説明します PyCharm の使用法チュートリアル: 操作の実行方法を詳しく説明します Feb 26, 2024 pm 05:51 PM

PyCharm は非常に人気のある Python 統合開発環境 (IDE) であり、Python 開発をより効率的かつ便利にするための豊富な機能とツールを提供します。この記事では、PyCharm の基本的な操作方法を紹介し、読者がすぐに使い始めてツールの操作に習熟できるように、具体的なコード例を示します。 1. PyCharm をダウンロードしてインストールします。 まず、PyCharm 公式 Web サイト (https://www.jetbrains.com/pyc) にアクセスする必要があります。

Word の差し込み印刷で空白ページが印刷される Word の差し込み印刷で空白ページが印刷される Feb 19, 2024 pm 04:51 PM

Word を使用して差し込み印刷文書を印刷するときに空白のページが表示される場合は、この記事が役に立ちます。差し込み印刷は、個人用の文書を簡単に作成し、複数の受信者に送信できる便利な機能です。 Microsoft Word の差し込み印刷機能は、ユーザーが受信者ごとに同じコンテンツを手動でコピーする時間を節約できるため、高く評価されています。差し込み文書を印刷するには、[差し込み文書] タブに移動します。しかし、一部の Word ユーザーは、差し込み文書を印刷しようとすると、プリンターで空白のページが印刷されたり、まったく印刷されなかったりすると報告しています。これは、間違ったフォーマットまたはプリンター設定が原因である可能性があります。文書とプリンターの設定を確認し、印刷前に必ず文書をプレビューして内容が正しいことを確認してください。もし

See all articles