<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答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
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

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

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

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

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

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

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

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

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

        void CPrinttToPrinterDlg::OnBnClickedButtonPrint()
        {
        	CPrintDialog dlg(FALSE, PD_ALLPAGES, NULL);//打印對話框?qū)ο蠖x,參數(shù)一設(shè)置彈出對話框?yàn)榇蛴υ捒?參數(shù)二設(shè)置打印范圍為全部頁面,參數(shù)三可指定打印機(jī),這里缺省即可
        
        	/*打印對話框的初始值設(shè)置,在實(shí)際應(yīng)用中可根據(jù)需要進(jìn)行設(shè)置,如通過預(yù)先計(jì)算得到要打印的頁面范圍等*/
        	dlg.m_pd.nMinPage = 1;//指定開始/結(jié)束頁碼編輯控件的頁碼范圍的最小值,若nMinPage=nMaxPage,則“頁碼范圍”單選鈕和開始/結(jié)束頁碼編輯控件被灰化
        	dlg.m_pd.nMaxPage = 2;//指定開始/結(jié)束頁碼編輯控件的頁碼范圍的最大值
        	dlg.m_pd.nCopies = 1;//指定拷貝份數(shù)編輯控件的初始值
        	dlg.m_pd.nFromPage = 1;//指定開始頁碼編輯控件的初始值
        	dlg.m_pd.nToPage = 2;//指定結(jié)束頁碼編輯控件的初始值
        
        	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è)置過程中有些東西我們希望用戶來選,所以使用了對話框的形式,但是有些
        	 *東西比如紙張大小和打印方向等我們希望它是固定的,不能讓用戶隨意設(shè)置造成麻煩
        	 *因此,我們利用已經(jīng)得到的打印機(jī)圖形設(shè)備環(huán)境,通過修改它來實(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ū)動程序接收打印文檔并開始打印
        	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í)際長度單位的換算關(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ī)屏幕的寬高,也就是紙張的大小,會比實(shí)際小約6mm
        	printerscreenx = GetDeviceCaps(hdcPrinter, HORZSIZE);
        	printerscreeny = GetDeviceCaps(hdcPrinter, VERTSIZE);
        
        	/*因?yàn)橐蛴〉捻摯a范圍和份數(shù)是用戶選擇的,所以在此對用戶選擇的項(xiàng)做處理*/
        	int pagebegin, pageend;//打印范圍
        	if (dlg.PrintAll())//看用戶是否選擇了全部打印這一項(xiàng),是的話則全部打印
        	{
        	pagebegin = dlg.m_pd.nMinPage;
        	pageend = dlg.m_pd.nMaxPage;
        	}
        	else if (dlg.PrintRange())//用戶選擇了選定頁碼范圍項(xiàng)
        	{
        	pagebegin = dlg.m_pd.nFromPage;
        	pageend = dlg.m_pd.nToPage;
        	}
        	else//用戶選擇了選定范圍打印,因?yàn)槲覀冊谶@里沒有提供選定范圍的功能,所以用戶一旦選擇這里當(dāng)成是操作錯誤處理即可
        	{
        	MessageBox(_T("Could not choise this one"));
        	dcPrinter.AbortDoc();//錯誤退出區(qū)別于EndDoc
        	}
        	int ncopy = dlg.m_pd.nCopies;//用戶選擇打印分?jǐn)?shù)
        
        	/*在這里進(jìn)行打印工作*/
        	while (ncopy--)//逐份打印
        	{
        	for (int page = pagebegin; page <= pageend; page++)//從選定范圍開始打印
        	{
        	if (dcPrinter.StartPage() < 0)
        	{
        	MessageBox(_T("Could not start page"));
        	dcPrinter.AbortDoc();//錯誤退出區(qū)別于EndDoc
        	}
        	else//如果進(jìn)入這里則繪出要打印內(nèi)容并結(jié)束掉一頁的打印
        	{
        	doThePrint(dcPrinter, page, mmdpix, mmdpiy, printerscreenx, printerscreeny);
        	dcPrinter.EndPage();
        	}
        	}
        	}
        	}
        	dcPrinter.EndDoc();//打印完成退出
        	dcPrinter.Detach();//釋放DC
        	}
        	}
        }
        實(shí)際往一頁紙上打印的內(nèi)容在此函數(shù)中進(jìn)行定義,下面函數(shù)內(nèi)容實(shí)現(xiàn)在打印的紙上繪制一個大小稍小于頁面的綠色矩形:
        void CPrinttToPrinterDlg::doThePrint(CDC &dc,int page, float mdpix, float mdpiy, float mpagex, float mpagey)//打印實(shí)際繪圖函數(shù),往參數(shù)一傳入的CDC上面繪圖
        {
        	CPen pen, *pOldPen;// 定義筆對象和指針 // 創(chuàng)建10單位寬的綠色實(shí)心筆 
        	pen.CreatePen(PS_SOLID, 100, RGB(0, 255, 0));
        	pOldPen = dc.SelectObject(&pen);// 選入綠色筆 
        	dc.Re【本文來自鴻網(wǎng)互聯(lián) (http://www.68idc.cn)】ctangle(0 * mdpix, 0 * mdpiy, mpagex*mdpix, mpagey*mdpiy);// 畫矩形 
        	dc.SelectObject(pOldPen);// 選出綠色筆 
        	pen.DeleteObject();// 刪除綠色筆
        }

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

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

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

        文檔

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

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 99久久99久久精品免费观看| 中出五十路免费视频| 2020久久精品国产免费| 亚洲精品高清国产麻豆专区| 午夜影院免费观看| 亚洲福利电影一区二区?| 无码国产精品一区二区免费| 2020年亚洲天天爽天天噜| 日韩一区二区a片免费观看| 亚洲中文字幕久久无码| 国产精品99久久免费| 成在线人直播免费视频| 国产亚洲精品自在久久| 精品免费视在线观看| 性色av极品无码专区亚洲 | 亚洲人成在线播放| 波多野结衣在线免费视频| 中文字幕在线观看亚洲日韩| 精品久久免费视频| 国产va免费观看| 日韩精品一区二区亚洲AV观看| 亚洲精品无码久久| 亚洲精品美女久久久久99小说| 毛片基地看看成人免费| 亚洲综合日韩中文字幕v在线| 无人影院手机版在线观看免费| 成人亚洲国产精品久久| 亚洲开心婷婷中文字幕| 免费观看AV片在线播放| 女bbbbxxxx另类亚洲| 国产亚洲综合色就色| 久久国内免费视频| 人妻免费久久久久久久了| 久久精品国产亚洲香蕉| 中文字幕看片在线a免费| 久久久亚洲裙底偷窥综合| 午夜男人一级毛片免费| 你懂的在线免费观看| 国产成+人+综合+亚洲专| 亚洲国产一成久久精品国产成人综合| 无码人妻精品中文字幕免费|