国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

MFC打印相關(guān)操作

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 14:08:48
文檔

MFC打印相關(guān)操作

MFC打印相關(guān)操作:雖說(shuō)現(xiàn)在已經(jīng)有越來(lái)越多的人轉(zhuǎn)向用C#來(lái)做界面的開(kāi)發(fā),但是對(duì)于一個(gè)習(xí)慣了C這種半面向?qū)ο笳Z(yǔ)言的人來(lái)說(shuō),MFC依然是難割舍的存在。最近在做些數(shù)據(jù)庫(kù)相關(guān)的事,因?yàn)槭菙?shù)據(jù)庫(kù),自然離不開(kāi)打印報(bào)表之類的東西,所以順帶的也去研究了下如何用MFC來(lái)進(jìn)行打印相關(guān)的的
推薦度:
導(dǎo)讀MFC打印相關(guān)操作:雖說(shuō)現(xiàn)在已經(jīng)有越來(lái)越多的人轉(zhuǎn)向用C#來(lái)做界面的開(kāi)發(fā),但是對(duì)于一個(gè)習(xí)慣了C這種半面向?qū)ο笳Z(yǔ)言的人來(lái)說(shuō),MFC依然是難割舍的存在。最近在做些數(shù)據(jù)庫(kù)相關(guān)的事,因?yàn)槭菙?shù)據(jù)庫(kù),自然離不開(kāi)打印報(bào)表之類的東西,所以順帶的也去研究了下如何用MFC來(lái)進(jìn)行打印相關(guān)的的

雖說(shuō)現(xiàn)在已經(jīng)有越來(lái)越多的人轉(zhuǎn)向用C#來(lái)做界面的開(kāi)發(fā),但是對(duì)于一個(gè)習(xí)慣了C這種半面向?qū)ο笳Z(yǔ)言的人來(lái)說(shuō),MFC依然是難割舍的存在。最近在做些數(shù)據(jù)庫(kù)相關(guān)的事,因?yàn)槭菙?shù)據(jù)庫(kù),自然離不開(kāi)打印報(bào)表之類的東西,所以順帶的也去研究了下如何用MFC來(lái)進(jìn)行打印相關(guān)的的

雖說(shuō)現(xiàn)在已經(jīng)有越來(lái)越多的人轉(zhuǎn)向用C#來(lái)做界面的開(kāi)發(fā),但是對(duì)于一個(gè)習(xí)慣了C++這種半面向?qū)ο笳Z(yǔ)言的人來(lái)說(shuō),MFC依然是難割舍的存在。最近在做些數(shù)據(jù)庫(kù)相關(guān)的事,因?yàn)槭菙?shù)據(jù)庫(kù),自然離不開(kāi)打印報(bào)表之類的東西,所以順帶的也去研究了下如何用MFC來(lái)進(jìn)行打印相關(guān)的的操作。

本篇文章參考的比較多的是這篇文章和MSDN的示例代碼,另外這篇文章也提供了很多有用的參考,如果想看原文的話可以去看看。

直接用微軟提供的CPrintDialog類進(jìn)行打印的相關(guān)操作是非常簡(jiǎn)單的,本人將代碼封裝成為兩個(gè)函數(shù),除了實(shí)際往一頁(yè)紙上繪制東西的部分在第二個(gè)函數(shù)中進(jìn)行定義外,其他與打印相關(guān)的操作都在第一個(gè)函數(shù)上實(shí)現(xiàn)了。具體如下:

打印相關(guān)操作主函數(shù):

void CPrinttToPrinterDlg::OnBnClickedButtonPrint()
{
	CPrintDialog dlg(FALSE, PD_ALLPAGES, NULL);//打印對(duì)話框?qū)ο蠖x,參數(shù)一設(shè)置彈出對(duì)話框?yàn)榇蛴?duì)話框,參數(shù)二設(shè)置打印范圍為全部頁(yè)面,參數(shù)三可指定打印機(jī),這里缺省即可

	/*打印對(duì)話框的初始值設(shè)置,在實(shí)際應(yīng)用中可根據(jù)需要進(jìn)行設(shè)置,如通過(guò)預(yù)先計(jì)算得到要打印的頁(yè)面范圍等*/
	dlg.m_pd.nMinPage = 1;//指定開(kāi)始/結(jié)束頁(yè)碼編輯控件的頁(yè)碼范圍的最小值,若nMinPage=nMaxPage,則“頁(yè)碼范圍”單選鈕和開(kāi)始/結(jié)束頁(yè)碼編輯控件被灰化
	dlg.m_pd.nMaxPage = 2;//指定開(kāi)始/結(jié)束頁(yè)碼編輯控件的頁(yè)碼范圍的最大值
	dlg.m_pd.nCopies = 1;//指定拷貝份數(shù)編輯控件的初始值
	dlg.m_pd.nFromPage = 1;//指定開(kāi)始頁(yè)碼編輯控件的初始值
	dlg.m_pd.nToPage = 2;//指定結(jié)束頁(yè)碼編輯控件的初始值

	if (dlg.DoModal() == IDOK)
	{
	HDC hdcPrinter = dlg.GetPrinterDC();
	if (hdcPrinter == NULL)//檢取設(shè)備環(huán)境的句柄,檢索不到則提醒并退出
	{
	MessageBox(_T("Buy a printer!"));
	}
	else
	{
	/*創(chuàng)建圖形設(shè)備環(huán)境并與打印機(jī)設(shè)備關(guān)聯(lián),在上面繪圖就相當(dāng)于往打印機(jī)要打出的紙上繪圖*/
	CDC dcPrinter;
	dcPrinter.Attach(hdcPrinter);

	/*
	 *在打印設(shè)置過(guò)程中有些東西我們希望用戶來(lái)選,所以使用了對(duì)話框的形式,但是有些
	 *東西比如紙張大小和打印方向等我們希望它是固定的,不能讓用戶隨意設(shè)置造成麻煩
	 *因此,我們利用已經(jīng)得到的打印機(jī)圖形設(shè)備環(huán)境,通過(guò)修改它來(lái)實(shí)現(xiàn)固定設(shè)置的功能
	 */
	LPDEVMODE pDevMode;
	pDevMode = (LPDEVMODE)GlobalLock(dlg.m_pd.hDevMode);
	pDevMode->dmOrientation = DMORIENT_LANDSCAPE;//設(shè)置打印方向?yàn)闄M向
	pDevMode->dmPaperSize = DMPAPER_A4;//設(shè)置紙張大小為A4
	dcPrinter.ResetDC(pDevMode);

	//通知打印機(jī)驅(qū)動(dòng)程序接收打印文檔并開(kāi)始打印
	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't initalize"));
	}
	else
	{
	/*打印的紙張大小我們是需要知道的,此外我們還需要設(shè)備像素點(diǎn)和實(shí)際長(zhǎng)度單位的換算關(guān)系即DPI*/
	int xDPI = GetDeviceCaps(hdcPrinter, LOGPIXELSX);//返回X方向上每英寸的設(shè)備點(diǎn)數(shù),即DPI
	float mmdpix = xDPI / 25.4;//每毫米所占的設(shè)備點(diǎn)數(shù)
	int yDPI = GetDeviceCaps(hdcPrinter, LOGPIXELSY);//返回Y方向上每英寸的設(shè)備點(diǎn)數(shù),即DPI
	float mmdpiy = yDPI / 25.4;//每毫米所占的設(shè)備點(diǎn)數(shù)

	float printerscreenx, printerscreeny;//這里得到打印機(jī)屏幕的寬高,也就是紙張的大小,會(huì)比實(shí)際小約6mm
	printerscreenx = GetDeviceCaps(hdcPrinter, HORZSIZE);
	printerscreeny = GetDeviceCaps(hdcPrinter, VERTSIZE);

	/*因?yàn)橐蛴〉捻?yè)碼范圍和份數(shù)是用戶選擇的,所以在此對(duì)用戶選擇的項(xiàng)做處理*/
	int pagebegin, pageend;//打印范圍
	if (dlg.PrintAll())//看用戶是否選擇了全部打印這一項(xiàng),是的話則全部打印
	{
	pagebegin = dlg.m_pd.nMinPage;
	pageend = dlg.m_pd.nMaxPage;
	}
	else if (dlg.PrintRange())//用戶選擇了選定頁(yè)碼范圍項(xiàng)
	{
	pagebegin = dlg.m_pd.nFromPage;
	pageend = dlg.m_pd.nToPage;
	}
	else//用戶選擇了選定范圍打印,因?yàn)槲覀冊(cè)谶@里沒(méi)有提供選定范圍的功能,所以用戶一旦選擇這里當(dāng)成是操作錯(cuò)誤處理即可
	{
	MessageBox(_T("Could not choise this one"));
	dcPrinter.AbortDoc();//錯(cuò)誤退出區(qū)別于EndDoc
	}
	int ncopy = dlg.m_pd.nCopies;//用戶選擇打印分?jǐn)?shù)

	/*在這里進(jìn)行打印工作*/
	while (ncopy--)//逐份打印
	{
	for (int page = pagebegin; page <= pageend; page++)//從選定范圍開(kāi)始打印
	{
	if (dcPrinter.StartPage() < 0)
	{
	MessageBox(_T("Could not start page"));
	dcPrinter.AbortDoc();//錯(cuò)誤退出區(qū)別于EndDoc
	}
	else//如果進(jìn)入這里則繪出要打印內(nèi)容并結(jié)束掉一頁(yè)的打印
	{
	doThePrint(dcPrinter, page, mmdpix, mmdpiy, printerscreenx, printerscreeny);
	dcPrinter.EndPage();
	}
	}
	}
	}
	dcPrinter.EndDoc();//打印完成退出
	dcPrinter.Detach();//釋放DC
	}
	}
}
實(shí)際往一頁(yè)紙上打印的內(nèi)容在此函數(shù)中進(jìn)行定義,下面函數(shù)內(nèi)容實(shí)現(xiàn)在打印的紙上繪制一個(gè)大小稍小于頁(yè)面的綠色矩形:
void CPrinttToPrinterDlg::doThePrint(CDC &dc,int page, float mdpix, float mdpiy, float mpagex, float mpagey)//打印實(shí)際繪圖函數(shù),往參數(shù)一傳入的CDC上面繪圖
{
	CPen pen, *pOldPen;// 定義筆對(duì)象和指針 // 創(chuàng)建10單位寬的綠色實(shí)心筆 
	pen.CreatePen(PS_SOLID, 100, RGB(0, 255, 0));
	pOldPen = dc.SelectObject(&pen);// 選入綠色筆 
	dc.Re【本文來(lái)自鴻網(wǎng)互聯(lián) (http://www.68idc.cn)】ctangle(0 * mdpix, 0 * mdpiy, mpagex*mdpix, mpagey*mdpiy);// 畫(huà)矩形 
	dc.SelectObject(pOldPen);// 選出綠色筆 
	pen.DeleteObject();// 刪除綠色筆
}

到此文章就已經(jīng)寫(xiě)得七七八八了,調(diào)用主函數(shù)就可以實(shí)現(xiàn)往打印機(jī)上打印動(dòng)?xùn)|西的功能。至于打印什么東西,如何去打,就是GDI繪圖的事了。另外由于我們還沒(méi)有實(shí)現(xiàn)打印預(yù)覽的功能,所以可以用虛擬打印機(jī)來(lái)看效果,當(dāng)然如果有錢(qián),也可以直接用真的打印機(jī)來(lái)看啦哈哈,本人用的是finepring,簡(jiǎn)而言之就兩個(gè)字形容,神器!

打印預(yù)覽還有如何去打印數(shù)據(jù)表格這些功能本人后面如果研究實(shí)現(xiàn)了的話也會(huì)貼上來(lái),或者發(fā)個(gè)鏈接上來(lái),這篇文章就先到這里吧。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

MFC打印相關(guān)操作

MFC打印相關(guān)操作:雖說(shuō)現(xiàn)在已經(jīng)有越來(lái)越多的人轉(zhuǎn)向用C#來(lái)做界面的開(kāi)發(fā),但是對(duì)于一個(gè)習(xí)慣了C這種半面向?qū)ο笳Z(yǔ)言的人來(lái)說(shuō),MFC依然是難割舍的存在。最近在做些數(shù)據(jù)庫(kù)相關(guān)的事,因?yàn)槭菙?shù)據(jù)庫(kù),自然離不開(kāi)打印報(bào)表之類的東西,所以順帶的也去研究了下如何用MFC來(lái)進(jìn)行打印相關(guān)的的
推薦度:
標(biāo)簽: 操作 打印機(jī) 打印
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專題
Top
主站蜘蛛池模板: 久久久久久久久久久9精品视频 | 在线免费观看国产 | 久久精品无遮挡一级毛片 | 综合欧美亚洲 | 国产精品视频大全 | 天天操天天曰 | 亚洲欧美日韩在线2020 | 国产一区二区三区欧美 | 国产精品一区二区久久不卡 | 成人国产精品久久久免费 | 亚洲日韩在线观看 | 欧美日韩精品一区二区 | 亚洲专区欧美 | 国产日韩一区二区三区在线播放 | 国产亚洲精品一品区99热 | 国产精品久久二区三区色裕 | 久久久久久久国产精品 | 中文字幕亚洲综合 | 精品欧美一区二区在线观看欧美熟 | 国产3区 | 视频在线观看国产 | 欧区一欧区二欧区三免费 | 国产精品资源网站在线观看 | 国产 欧美 在线 | 国产一区二区久久久 | 国产区第一页 | 99在线视频观看 | 亚洲欧美日韩中文字幕在线不卡 | 亚洲国产婷婷综合在线精品 | 免费看真人a一级毛片 | 久久久久成人精品一区二区 | 亚洲欧美综合图片 | 久久久这里有精品999 | 亚洲欧美综合视频 | 精品国产91乱码一区二区三区 | 亚洲精品综合久久中文字幕 | 亚洲精品二三区伊人久久 | 午夜精品一区二区三区在线视 | 国产高清一区二区 | 综合精品欧美日韩国产在线 | 国产精品一区在线播放 |