vc打印机相关设置和pos打印机
我是用的MFC打印機(jī)制做的 然后重載了onprint函數(shù) 因?yàn)槲沂腔趯?duì)話框的程序 然后在view類里面重載OnPrint()函數(shù) 并且把在這個(gè)里面把
如下:
void CPrintView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CFont *pOldFont;
CFont DataFont;
DataFont.CreatePointFont(120,"宋體",pDC);
pOldFont=pDC->SelectObject(&DataFont);
pDC->Rectangle(......);
return TRUE;
這個(gè)我就是畫(huà)了個(gè)巨型 Rectangle里面那些參數(shù)是我前面設(shè)置的 反正就是用pDC->Rectangle()畫(huà)了個(gè)矩形;
問(wèn)題是 我在打印預(yù)覽的時(shí)候 看到我這個(gè)巨型占整個(gè)預(yù)覽的很上面 下面茫茫多都是空白??
也就是說(shuō)預(yù)覽的時(shí)候 就是預(yù)覽成一張紙上面畫(huà)了個(gè)矩形,這個(gè)矩形在整個(gè)這張上面的最上面 占整個(gè)紙的很少一部分 然后我在整個(gè)過(guò)程當(dāng)中“沒(méi)有”設(shè)置紙張的大小(關(guān)鍵是我不曉得怎么設(shè)置) 以達(dá)到我有好多信息就打好多出來(lái),因?yàn)楫吘故莗os打印機(jī) 寬度是恒定的 但是長(zhǎng)嘛就應(yīng)該是有好多行信息就打好長(zhǎng)的紙出來(lái)吧,不像一般的打印機(jī) 反正A4紙是固定的??
問(wèn)題是 我沒(méi)有任何設(shè)置 這個(gè)打印機(jī)怎么知道我這個(gè)矩形畫(huà)完了 然后下面的空白部分它就不打印了 然后停住了 雖然這個(gè)正和我意 但是我翻遍了MFC的書(shū)都沒(méi)有看到這個(gè)是怎么回事~~~
問(wèn)題2:反過(guò)來(lái)我畫(huà)一個(gè)很長(zhǎng)很長(zhǎng)的矩形 執(zhí)行打印預(yù)覽的時(shí)候 預(yù)覽框上的一張紙都裝不完 打印出來(lái)也和預(yù)覽框上面的一樣裝不完 但是它怎么就不繼續(xù)打印那裝不下的一部分了呢?就是剩余沒(méi)打完的矩形啊?
我繼續(xù)重載了
void CPrintView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)??
{
? pInfo->SetMaxPage (4);
}
設(shè) 置為4頁(yè) 這樣一來(lái)通過(guò)MFC的打印原理 會(huì)執(zhí)行4次OnPrint()函數(shù),然后在OnPrint()里面畫(huà)一個(gè)短一點(diǎn)的矩形,也就是在打印預(yù)覽里面一張紙能裝下的那種 然后確實(shí)能打出4個(gè)矩形來(lái) 而且通過(guò)打印時(shí)候那個(gè)WINDOWS自帶的對(duì)話框來(lái)看確實(shí)是打了一個(gè)再打第二個(gè) ??
問(wèn) 題3:按照打印預(yù)覽里面看的 一個(gè)矩形打完后 那張紙還剩下面茫茫多的空白 然后再是第二張紙上面又是一個(gè)矩形 以此類推 按照我的理解應(yīng)該是把那第一張紙下面的空白走完了再繼續(xù)打第二張紙上面的矩形 但是事實(shí)是第一個(gè)矩形打完了 然后空點(diǎn)點(diǎn)空白馬上就打第二個(gè)矩形了 然后直到把所有的矩形全部打完~~~ 這樣貌似還給我節(jié)約了 本來(lái)我的要求也就是這樣的 但是為什么??它怎么不把紙走完了再打第二個(gè)矩形???
問(wèn) 題4:我想問(wèn)題的關(guān)鍵是出在“打印預(yù)覽”上面 書(shū)上說(shuō) 打印預(yù)覽是很完善的 都不需要我們?nèi)ブ剌d什么函數(shù)了 我也就沒(méi)重載什么東西 但是我想知道 它是怎么來(lái)設(shè)置那張紙的?它怎么通過(guò)打印機(jī)來(lái)設(shè)置預(yù)覽上面那張紙的寬度 高度? 是通過(guò)CDC::GetDeviceCaps()么?在我的程序里面從來(lái)沒(méi)有設(shè)置過(guò)紙的高度寬度什么的.....
下面是我自己的看法 麻煩各位看看小弟我是否正確
最后我覺(jué)得 這個(gè)POS58打印機(jī) 是不是本身在硬件上就設(shè)定為沒(méi)有要打印的東西的時(shí)候 它就自動(dòng)停下來(lái)了 ??
我 感覺(jué)這個(gè)打印機(jī)也是要分頁(yè)的 雖然這個(gè)紙裝在里面有30米左右長(zhǎng)度 但是從打印預(yù)覽看出他還是要分頁(yè)的 雖然寬度是固定 但是這一頁(yè)很長(zhǎng)~~通過(guò)前面的經(jīng)驗(yàn)算下來(lái) 可能有半米左右吧 如果信息多了的話 半米都裝不完的話 那么在OnPrient()里面還是要設(shè)置 第一頁(yè)打什么 第二頁(yè)打什么 至于有多少頁(yè) 那么事先就要設(shè)個(gè)變量算好 int nPage; 然后在OnBeginPrinting()里面設(shè)置好最大頁(yè)碼數(shù) 并且在OnPrint() 里面做相應(yīng)更改
void CPrintView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
pInfo->SetMaxPage (nPage);
}
void CPrintView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
int nPageNumber = pInfo->m_nCurPage;
if(nPageNumber==1)
{
//第一頁(yè)打印的類容
}
if(nPageNumber==2)
{
//第二頁(yè)打印的類容
}
.........
}
這樣來(lái)實(shí)現(xiàn) 不過(guò)在OnPrint() 里面只能靠if來(lái)判斷該打印些什么 不能動(dòng)態(tài)的弄~~~ 我曾今看過(guò)超市的員工就用這種打印機(jī)打報(bào)表 那個(gè)紙要多長(zhǎng)有多長(zhǎng) 不知道那個(gè)軟件是怎么完成的 而且如果按照我們這種看法分頁(yè)的話 那個(gè)頁(yè)與頁(yè)的銜接真的是天衣無(wú)縫的 不知道是怎么弄的
對(duì)于上面最后的東西 我覺(jué)得 如果我能夠在VC里面 在程序開(kāi)始時(shí)添加自定義紙張并設(shè)為默認(rèn)紙張,程序結(jié)束前刪除該自定義紙張并恢復(fù)原來(lái)的默認(rèn)紙張類型。 那么我只要定義一個(gè)寬跟這個(gè)一樣寬 長(zhǎng)有很長(zhǎng)很長(zhǎng)的紙張 那么 所有問(wèn)題不就解決了么?
以上都是自己的看法 麻煩各位給個(gè)意見(jiàn)~~~~
一般打印驅(qū)動(dòng)都會(huì)針對(duì)常用的DC操作做優(yōu)化的,所以在pDC指向一個(gè)打印機(jī)DC的時(shí)候,打印機(jī)執(zhí)行的打印指令是Rectangle而不是畫(huà)圖
————————————————————————————————————————————————————
????
樓主發(fā)表于:2009-10-26 15:52:42
在做一個(gè)地圖打印的程序,我想在View里畫(huà)的地圖邊框大小和打印機(jī)紙張大小成比例
首先,我在OnDraw里面獲取了打印機(jī)紙張的型號(hào)
? AfxGetApp()->GetPrinterDeviceDefaults(&pd)
? lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);??
用lpDevMode->dmPaperSize即可得到打印機(jī)紙張的型號(hào)了,默認(rèn)為9(即A4)
然后我想用lpDevMode->dmPaperWidth和lpDevMode->dmPaperLength得到紙張的長(zhǎng)寬,發(fā)現(xiàn)全部為0
請(qǐng)問(wèn),如何由紙張型號(hào)來(lái)得到它的長(zhǎng)寬呢?假設(shè)紙張的型號(hào)為A4,那么怎么才能知道它的寬為210MM,高為297MM?
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
回復(fù)次數(shù):25
??? * feilinhe用戶頭像
??? * feilinhe
??? * (C/C++)
??? *
??? * 等 級(jí):
??? *
????
#1樓 得分:5回復(fù)于:2009-10-26 16:29:51
看看這個(gè)
http://gudianjun.spaces.live.com/Blog/cns!1F03C60E71DEB43D!234.entry
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
精華推薦:多線程同步的兩個(gè)問(wèn)題,可能需要高手,請(qǐng)關(guān)注!
??? * scgjc用戶頭像
??? * scgjc
??? * (丑小鴨)
??? *
??? * 等 級(jí):
??? *
????
#2樓 得分:5回復(fù)于:2009-10-26 16:30:24
我想應(yīng)該是打印機(jī)DC映射模式設(shè)置為MM_LOMETRIC或MM_HIMETRIC的前提下,調(diào)用GetDeviceCaps獲取范圍來(lái)得到。
如:
? m_prnDC.SetMapMode(MM_LOMETRIC);
? m_iPrnX = m_prnDC.GetDeviceCaps(HORZRES);
m_iPrnY = m_prnDC.GetDeviceCaps(VERTRES);
m_iPrnX為寬,m_iPrnY為高。
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
精華推薦:關(guān)于wince系統(tǒng)的內(nèi)存碎片,收集貼
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#3樓 得分:0回復(fù)于:2009-10-26 16:32:13
引用 1 樓 feilinhe 的回復(fù):
看看這個(gè)
http://gudianjun.spaces.live.com/Blog/cns!1F03C60E71DEB43D!234.entry
我也想過(guò)用GetDeviceCaps,可是GetDeviceCaps需要打印DC
在OnDraw里面沒(méi)有打印DC,總不能再新建一個(gè)吧
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
精華推薦:算法與追MM,太強(qiáng),不要錯(cuò)過(guò)~
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#4樓 得分:0回復(fù)于:2009-10-26 16:34:03
其實(shí)得到紙張型號(hào)時(shí),如型號(hào)是A4,它的大小就一定了,210*297
我是問(wèn)用什么樣的方法通過(guò)A4來(lái)得到它的長(zhǎng)寬?
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
精華推薦:超級(jí)瑪麗制作揭秘文檔發(fā)布,散分100
??? * scgjc用戶頭像
??? * scgjc
??? * (丑小鴨)
??? *
??? * 等 級(jí):
??? *
????
#5樓 得分:5回復(fù)于:2009-10-26 16:41:25
打印DC和屏幕DC一樣的,只是一個(gè)打印在紙上,一個(gè)畫(huà)在屏幕上。MFC有固定的模式,可以用屏幕DC來(lái)打印,也可以創(chuàng)建和屏幕DC相同的一個(gè)打印DC來(lái)專門(mén)負(fù)責(zé)打印
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
精華推薦:《我的團(tuán)長(zhǎng)我的團(tuán)》相關(guān)內(nèi)容
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#6樓 得分:0回復(fù)于:2009-10-26 16:51:28
引用 5 樓 scgjc 的回復(fù):
打印DC和屏幕DC一樣的,只是一個(gè)打印在紙上,一個(gè)畫(huà)在屏幕上。MFC有固定的模式,可以用屏幕DC來(lái)打印,也可以創(chuàng)建和屏幕DC相同的一個(gè)打印DC來(lái)專門(mén)負(fù)責(zé)打印
//獲取打印機(jī)設(shè)備的橫方向和縱方向的分辨率
//即每英寸像素點(diǎn)數(shù)
int xPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
如果pDC是打印機(jī)DC,那么xPixPerInch =yPixPerInch =600
如果pDC是屏幕DC,那么xPixPerInch =yPixPerInch =96
所以,這兩個(gè)DC是不同的
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * jeff_5388用戶頭像
??? * jeff_5388
??? * (披星戴月)
??? *
??? * 等 級(jí):
??? *
????
#7樓 得分:5回復(fù)于:2009-10-26 17:08:46
引用 3 樓 liumenghappy 的回復(fù):
引用 1 樓 feilinhe 的回復(fù):
看看這個(gè)
http://gudianjun.spaces.live.com/Blog/cns!1F03C60E71DEB43D!234.entry
我也想過(guò)用GetDeviceCaps,可是GetDeviceCaps需要打印DC
在OnDraw里面沒(méi)有打印DC,總不能再新建一個(gè)吧
打印時(shí)參數(shù)pDC就指向打印機(jī)的DC了, 而不是屏幕的DC>
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * twins222用戶頭像
??? * twins222
??? * (twins222)
??? *
??? * 等 級(jí):
??? *
????
#8樓 得分:5回復(fù)于:2009-10-26 17:14:43
引用 6 樓 liumenghappy 的回復(fù):
引用 5 樓 scgjc 的回復(fù):
打印DC和屏幕DC一樣的,只是一個(gè)打印在紙上,一個(gè)畫(huà)在屏幕上。MFC有固定的模式,可以用屏幕DC來(lái)打印,也可以創(chuàng)建和屏幕DC相同的一個(gè)打印DC來(lái)專門(mén)負(fù)責(zé)打印
//獲取打印機(jī)設(shè)備的橫方向和縱方向的分辨率
//即每英寸像素點(diǎn)數(shù)
int xPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
如果pDC是打印機(jī)DC,那么xPixPerInch =yPixPerInch =600
如果pDC是屏幕DC,那么xPixPerInch =yPixPerInch =96
所以,這兩個(gè)DC是不同的
這個(gè)是正確的,就使用GetDeviceCaps函數(shù),然后讓pDC是打印機(jī)DC 就行了
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * Jcily用戶頭像
??? * Jcily
??? * (Jcily)
??? *
??? * 等 級(jí):
??? *
????
#9樓 得分:5回復(fù)于:2009-10-26 17:25:02
打印時(shí)一樣最終是調(diào)用OnDraw()做輸出。
pDC->IsPrinting()可以判斷當(dāng)前是否是打印DC
可以像如下代碼
C/C++ code
??? if(pDC->IsPrinting()) { // 得到物理寬高(毫米單位) int nWidthMM = pDC->GetDeviceCaps(HORZSIZE); int nHeightMM = pDC->GetDeviceCaps(VERTSIZE); }
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#10樓 得分:0回復(fù)于:2009-10-26 17:57:54
引用 9 樓 jcily 的回復(fù):
打印時(shí)一樣最終是調(diào)用OnDraw()做輸出。
pDC->IsPrinting()可以判斷當(dāng)前是否是打印DC
可以像如下代碼
C/C++ codeif(pDC->IsPrinting())
{// 得到物理寬高(毫米單位)int nWidthMM= pDC->GetDeviceCaps(HORZSIZE);int nHeightMM= pDC->GetDeviceCaps(VERTSIZE);
}
這個(gè)我也知道,可是OnDraw里面的DC不是打印DC,后面的兩個(gè)函數(shù)不會(huì)被調(diào)用
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#11樓 得分:0回復(fù)于:2009-10-27 08:31:59
不會(huì)沒(méi)有人知道吧
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#12樓 得分:0回復(fù)于:2009-10-27 09:37:16
自己頂!
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * lmxphappy用戶頭像
??? * lmxphappy
??? * (lmxphappy)
??? *
??? * 等 級(jí):
??? *
????
#13樓 得分:5回復(fù)于:2009-10-27 14:34:47
幫你頂起!
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#14樓 得分:0回復(fù)于:2009-10-27 15:40:54
真沒(méi)人會(huì)啊
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#15樓 得分:0回復(fù)于:2009-10-28 08:45:42
在線等高手
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * bobob用戶頭像
??? * bobob
??? * (靜思)
??? *
??? * 等 級(jí):
??? *
????
#16樓 得分:0回復(fù)于:2009-10-28 09:16:39
獲取紙張大小要么根據(jù)紙張類型自己計(jì)算,要么用GetDeviceCaps,方法上面都說(shuō)了,無(wú)非就是調(diào)用時(shí)機(jī)的問(wèn)題。你總不會(huì)永遠(yuǎn)不創(chuàng)建打印機(jī)DC吧?你創(chuàng)建打印dc的時(shí)候獲取這些參數(shù),保存,下次用的時(shí)候再拿不就行了嗎?這么簡(jiǎn)單的問(wèn)題不要在線等高手,真的沒(méi)人會(huì)啊什么的,明眼人一看都知道這個(gè)問(wèn)題的答案已經(jīng)很清楚了,不屑再費(fèi)口舌而已
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * jennyvenus用戶頭像
??? * jennyvenus
??? * (智能卡 Snooper)
??? *
??? * 等 級(jí):
??? *
????? 3
????? 5
????? 更多勛章
????
#17樓 得分:60回復(fù)于:2009-10-28 09:28:09
C/C++ code
??? 聲明并設(shè)置好一個(gè)PAGESETUPDLG結(jié)構(gòu) PAGESETUPDLG m_psd; PRINTDLG pd; memset(&pd, 0, sizeof(pd)); GetApp()->GetPrinterDeviceDefaults(&pd); m_pi = GetAppSettings()->PrintingGetInfo(); m_pOwner = pOwner; m_bPageSetup = (pOwner == NULL); m_psd.rtMargin = m_pi.m_rectMargin; m_psd.hDevMode = pd.hDevMode; m_psd.hDevNames = pd.hDevNames; m_psd.Flags &= ~(PSD_SHOWHELP | PSD_INTHOUSANDTHSOFINCHES); m_psd.Flags |= PSD_ENABLEPAGESETUPTEMPLATE | PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS | PSD_DEFAULTMINMARGINS; m_psd.hInstance = AfxGetResourceHandle(); m_psd.lpPageSetupTemplateName = MAKEINTRESOURCE(IDD_PRINT_INITIAL); 然后顯示打印設(shè)置對(duì)話框 CPageSetupDialog::OnOK(); // 復(fù)制頁(yè)邊距和紙張尺寸。 m_pi.m_sizePaper.cx = m_psd.ptPaperSize.x; m_pi.m_sizePaper.cy = m_psd.ptPaperSize.y; A4紙得到的是21000與29700
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#18樓 得分:0回復(fù)于:2009-10-28 12:13:52
好,我試試,謝謝你
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#19樓 得分:0回復(fù)于:2009-10-28 12:41:39
引用 16 樓 bobob 的回復(fù):
獲取紙張大小要么根據(jù)紙張類型自己計(jì)算,要么用GetDeviceCaps,方法上面都說(shuō)了,無(wú)非就是調(diào)用時(shí)機(jī)的問(wèn)題。你總不會(huì)永遠(yuǎn)不創(chuàng)建打印機(jī)DC吧?你創(chuàng)建打印dc的時(shí)候獲取這些參數(shù),保存,下次用的時(shí)候再拿不就行了嗎?這么簡(jiǎn)單的問(wèn)題不要在線等高手,真的沒(méi)人會(huì)啊什么的,明眼人一看都知道這個(gè)問(wèn)題的答案已經(jīng)很清楚了,不屑再費(fèi)口舌而已
我現(xiàn)在是要按紙張的比例畫(huà)地圖邊框,還沒(méi)到打印那一步,怎么可能有打印DC呢?難道不用打印DC就不能得到紙張大小嗎?我覺(jué)得真正的高手肯定知道的
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * jyh_baoding用戶頭像
??? * jyh_baoding
??? *
??? *
??? * 等 級(jí):
??? *
????
#20樓 得分:5回復(fù)于:2009-10-28 12:51:56
幫頂
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#21樓 得分:0回復(fù)于:2009-10-28 14:31:37
引用 17 樓 jennyvenus 的回復(fù):
C/C++ code聲明并設(shè)置好一個(gè)PAGESETUPDLG結(jié)構(gòu)
PAGESETUPDLG m_psd;
PRINTDLG pd;
memset(&pd,0,sizeof(pd));
GetApp()->GetPrinterDeviceDefaults(&pd);
m_pi= GetAppSettings()->PrintingGetInfo();
m_pOwner= pOwner;
m_bPageSetup= (pOwner== NULL);
m_psd.rtMargin= m_pi.m_rectMargin;
m_psd.hDevMode= pd.hDevMode;
m_psd.hDevNames= pd.hDevNames;
m_psd.Flags&=~(PSD_SHOWHELP| PSD_INTHOUSANDTHSOFINCHES);
m_psd.Flags|= PSD_ENABLEPAGESETUPTEMPLATE| PSD_INHUNDREDTHSOFMILLIMETERS|
PSD_MARGINS| PSD_DEFAULTMINMARGINS;
m_psd.hInstance= AfxGetResourceHandle();
m_psd.lpPageSetupTemplateName= MAKEINTRESOURCE(IDD_PRINT_INITIAL);
然后顯示打印設(shè)置對(duì)話框
CPageSetupDialog::OnOK();// 復(fù)制頁(yè)邊距和紙張尺寸。 m_pi.m_sizePaper.cx= m_psd.ptPaperSize.x;
m_pi.m_sizePaper.cy= m_psd.ptPaperSize.y;
A4紙得到的是21000與29700
請(qǐng)問(wèn)m_pi是什么數(shù)據(jù)類型?
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * jennyvenus用戶頭像
??? * jennyvenus
??? * (智能卡 Snooper)
??? *
??? * 等 級(jí):
??? *
????? 3
????? 5
????? 更多勛章
????
#22樓 得分:0回復(fù)于:2009-10-28 17:57:34
C/C++ code
??? #pragma once #include "MyEditMisc.h" / // CDlgPrint class CDlgPrint : public CPageSetupDialog { DECLARE_DYNAMIC(CDlgPrint) public: CDlgPrint(CMyEditView* pOwner); virtual ~CDlgPrint(); // 對(duì)話框數(shù)據(jù) enum { IDD = IDD_PRINT_INITIAL }; public: CMyEditPrintInfo m_pi; CMyEditView* m_pOwner; BOOL m_bPageSetup; protected: void UpdateDataSet(); BOOL UpdateDataGet(); protected: virtual BOOL OnInitDialog(); virtual void OnOK(); virtual void OnCancel(); protected: afx_msg void OnSetHeaderFooterText(); DECLARE_MESSAGE_MAP() };
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * jennyvenus用戶頭像
??? * jennyvenus
??? * (智能卡 Snooper)
??? *
??? * 等 級(jí):
??? *
????? 3
????? 5
????? 更多勛章
????
#23樓 得分:0回復(fù)于:2009-10-28 17:58:29
C/C++ code
??? // DlgPrint.cpp : 實(shí)現(xiàn)文件 // #include "stdafx.h" #include <winspool.h> #include <dlgs.h> #include "App.h" #include "AppGlobals.h" #include "AppSettings.h" #include "AppFrame.h" #include "DlgBase.h" #include "DlgPrint.h" / // 本來(lái)在RC資源文件中的打印對(duì)話框使用了<dlgs.h>中定義的控件標(biāo)識(shí),但VC的資源編 // 輯器把這些控件標(biāo)識(shí)換成了常數(shù)。 #define IDC_PRINT_BTN_SET_PRINTER psh3 #define NUM_PRINTING_MIN_PRINT_PAGES_RANGE 1 #define NUM_PRINTING_MAX_PRINT_PAGES_RANGE USHRT_MAX / // CDlgPrint IMPLEMENT_DYNAMIC(CDlgPrint, CPageSetupDialog) BEGIN_MESSAGE_MAP(CDlgPrint, CPageSetupDialog) ON_BN_CLICKED(IDC_PRINT_BTN_SET_HEADER_TEXT, OnSetHeaderFooterText) ON_BN_CLICKED(IDC_PRINT_BTN_SET_FOOTER_TEXT, OnSetHeaderFooterText) END_MESSAGE_MAP() CDlgPrint::CDlgPrint(CMyEditView* pOwner) : CPageSetupDialog(0, pOwner) { PRINTDLG pd; memset(&pd, 0, sizeof(pd)); GetApp()->GetPrinterDeviceDefaults(&pd); m_pi = GetAppSettings()->PrintingGetInfo(); m_pOwner = pOwner; m_bPageSetup = (pOwner == NULL); m_psd.rtMargin = m_pi.m_rectMargin; m_psd.hDevMode = pd.hDevMode; m_psd.hDevNames = pd.hDevNames; m_psd.Flags &= ~(PSD_SHOWHELP | PSD_INTHOUSANDTHSOFINCHES); m_psd.Flags |= PSD_ENABLEPAGESETUPTEMPLATE | PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS | PSD_DEFAULTMINMARGINS; m_psd.hInstance = AfxGetResourceHandle(); m_psd.lpPageSetupTemplateName = MAKEINTRESOURCE(IDD_PRINT_INITIAL); } CDlgPrint::~CDlgPrint() { } / // CDlgPrint 消息處理程序 BOOL CDlgPrint::OnInitDialog() { CPageSetupDialog::OnInitDialog(); // TODO: 在此添加額外的初始化 CDlgBase::DlgEnableItem(this, IDC_PRINT_EDT_SCALE, false); CDlgBase::DlgEnableItem(this, IDC_PRINT_SPN_SCALE, false); UpdateDataSet(); return true; // return true unless you set the focus to a control // 異常: OCX 屬性頁(yè)應(yīng)返回 false } void CDlgPrint::OnOK() { // TODO: 在此添加專用代碼和/或調(diào)用基類 if (!UpdateDataGet()) { return; } CPageSetupDialog::OnOK(); // 復(fù)制頁(yè)邊距和紙張尺寸。 m_pi.m_sizePaper.cx = m_psd.ptPaperSize.x; m_pi.m_sizePaper.cy = m_psd.ptPaperSize.y; m_pi.m_rectMargin.CopyRect(&m_psd.rtMargin); // 計(jì)算最小的頁(yè)邊距。 CDC dcPrint; if (dcPrint.Attach(CreatePrinterDC())) { CSize sizeLUsPI; // Logic Unit Per Inch sizeLUsPI.cx = dcPrint.GetDeviceCaps(LOGPIXELSX); sizeLUsPI.cy = dcPrint.GetDeviceCaps(LOGPIXELSY); CSize sizePaper; // 紙張尺寸。 sizePaper.cx = dcPrint.GetDeviceCaps(PHYSICALWIDTH); sizePaper.cy = dcPrint.GetDeviceCaps(PHYSICALHEIGHT); dcPrint.DPtoLP(&sizePaper); CSize sizePrint; // 可打印范圍。 sizePrint.cx = dcPrint.GetDeviceCaps(HORZRES); sizePrint.cy = dcPrint.GetDeviceCaps(VERTRES); dcPrint.DPtoLP(&sizePrint); CSize sizeOfsLT; // 左邊和上邊,邏輯單位。 sizeOfsLT.cx = dcPrint.GetDeviceCaps(PHYSICALOFFSETX); sizeOfsLT.cy = dcPrint.GetDeviceCaps(PHYSICALOFFSETY); dcPrint.DPtoLP(&sizeOfsLT); CSize sizeOfsRB; // 右邊和下邊,邏輯單位。 sizeOfsRB.cx = sizePaper.cx - sizeOfsLT.cx - sizePrint.cx; sizeOfsRB.cy = sizePaper.cy - sizeOfsLT.cy - sizePrint.cy; CSize sizeLT_MM; // 轉(zhuǎn)換成1/100MM單位。 sizeLT_MM.cx = (LONG)((FLOAT)sizeOfsLT.cx * 2540 / sizeLUsPI.cx); sizeLT_MM.cy = (LONG)((FLOAT)sizeOfsLT.cy * 2540 / sizeLUsPI.cy); CSize sizeRB_MM; // 轉(zhuǎn)換成1/100MM單位。 sizeRB_MM.cx = (LONG)((FLOAT)sizeOfsRB.cx * 2540 / sizeLUsPI.cx); sizeRB_MM.cy = (LONG)((FLOAT)sizeOfsRB.cy * 2540 / sizeLUsPI.cy); CRect& rect = m_pi.m_rectMargin; rect.left = max(sizeLT_MM.cx, rect.left); rect.top = max(sizeLT_MM.cy, rect.top); rect.right = max(sizeRB_MM.cx, rect.right); rect.bottom = max(sizeRB_MM.cy, rect.bottom); dcPrint.DeleteDC(); } // 保存打印設(shè)置。 GetAppSettings()->PrintingSetInfo(m_pi); // 如果要求啟動(dòng)打印,現(xiàn)在就執(zhí)行。 if ((m_pOwner != NULL) && (::IsWindow(m_pOwner->GetSafeHwnd()))) { m_pOwner->SendMessage(WM_COMMAND, MAKEWPARAM(ID_FILE_PRINT, 0), 0); } }
都是網(wǎng)上的代碼,多搜搜就搞定了。
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * jennyvenus用戶頭像
??? * jennyvenus
??? * (智能卡 Snooper)
??? *
??? * 等 級(jí):
??? *
????? 3
????? 5
????? 更多勛章
????
#24樓 得分:0回復(fù)于:2009-10-28 17:58:46
C/C++ code
??? void CDlgPrint::OnCancel() { // TODO: 在此添加專用代碼和/或調(diào)用基類 CPageSetupDialog::OnCancel(); } / void CDlgPrint::OnSetHeaderFooterText() { // TODO: 在此添加控件通知處理程序代碼 struct CMacroMap { UINT nID; LPCTSTR pszMacro; }; static const CMacroMap l_macro_map[] = { {ID_PRINT_MACRO_DATE, PFX_EC_PRINT_MACRO_DATE}, {ID_PRINT_MACRO_TIME, PFX_EC_PRINT_MACRO_TIME}, {ID_PRINT_MACRO_CURRENT_PAGE, PFX_EC_PRINT_MACRO_CURRENT_PAGE}, {ID_PRINT_MACRO_TOTAL_PAGES, PFX_EC_PRINT_MACRO_TOTAL_PAGES}, {ID_PRINT_MACRO_FILE_NAME, PFX_EC_PRINT_MACRO_FILE_NAME}, {ID_PRINT_MACRO_PATH_NAME, PFX_EC_PRINT_MACRO_PATH_NAME}, {ID_PRINT_MACRO_TAB, PFX_EC_PRINT_MACRO_TAB}, {ID_PRINT_MACRO_CRLF, PFX_EC_PRINT_MACRO_CRLF}, {ID_PRINT_MACRO_ALIGN_LEFT, PFX_EC_PRINT_MACRO_ALIGN_LEFT}, {ID_PRINT_MACRO_ALIGN_CENTER, PFX_EC_PRINT_MACRO_ALIGN_CENTER}, {ID_PRINT_MACRO_ALIGN_RIGHT, PFX_EC_PRINT_MACRO_ALIGN_RIGHT}, }; int nIDEdt; int nIDBtn; switch (GetAppFrame()->GetCurrentCommand()) { default: return; case IDC_PRINT_BTN_SET_HEADER_TEXT: nIDBtn = IDC_PRINT_BTN_SET_HEADER_TEXT; nIDEdt = IDC_PRINT_EDT_HEADER; break; case IDC_PRINT_BTN_SET_FOOTER_TEXT: nIDBtn = IDC_PRINT_BTN_SET_FOOTER_TEXT; nIDEdt = IDC_PRINT_EDT_FOOTER; break; } // 獲取菜單的坐標(biāo)。 CRect rect; GetDlgItem(nIDBtn)->GetWindowRect(&rect); CMenu Menu; VERIFY(Menu.LoadMenu(IDR_POPUP_PRINT_MACRO)); CPoint point(rect.left, rect.bottom); UINT nIDCmd = GetAppFrame()->CreateShortcutMenu(this, Menu.GetSubMenu(0), point); if (nIDCmd != 0) // nIDCmd等于零表示菜單被取消。 { LPCTSTR pszMacro = NULL; for (int i = 0; i < SIZEOF(l_macro_map); i++) { if (nIDCmd == l_macro_map[i].nID) { pszMacro = l_macro_map[i].pszMacro; break; } } if (pszMacro != NULL) { CWnd* pWndEdt = GetDlgItem(nIDEdt); ASSERT(pWndEdt != NULL); CEdit Edit; Edit.Attach(pWndEdt->GetSafeHwnd()); // 插入打印參數(shù)。 Edit.ReplaceSel(pszMacro, true); // 設(shè)置輸入焦點(diǎn)。 Edit.SetFocus(); Edit.Detach(); } } } / void CDlgPrint::UpdateDataSet() { // 標(biāo)題腳注。 SetDlgItemText(IDC_PRINT_EDT_HEADER, m_pi.m_strHeader); SetDlgItemText(IDC_PRINT_EDT_FOOTER, m_pi.m_strFooter); // 頁(yè)碼范圍,開(kāi)始頁(yè)等于零,結(jié)束頁(yè)留空表示全部打印。 if (!m_bPageSetup) { SetDlgItemInt(IDC_PRINT_EDT_PAGE_FROM, 1, false); SetDlgItemText(IDC_PRINT_EDT_PAGE_TO, _T("")); } else { CDlgBase::DlgEnableItem(this, IDC_PRINT_EDT_PAGE_FROM, false); CDlgBase::DlgEnableItem(this, IDC_PRINT_EDT_PAGE_TO, false); } } BOOL CDlgPrint::UpdateDataGet() { CMyEditPrintInfo pi; // 頁(yè)碼范圍(從第幾頁(yè)到第幾頁(yè))。 pi.m_nPageFrom = NUM_PRINTING_MIN_PRINT_PAGES_RANGE; pi.m_nPageTo = NUM_PRINTING_MAX_PRINT_PAGES_RANGE; if (!m_bPageSetup) // 頁(yè)面設(shè)置不需要獲取打印范圍。 { if (!CDlgBase::DlgGetItemUINT(this, IDC_PRINT_EDT_PAGE_FROM, IDS_E_PRINT_INVALID_PAGES_RANGE, pi.m_nPageFrom, NUM_PRINTING_MIN_PRINT_PAGES_RANGE, NUM_PRINTING_MAX_PRINT_PAGES_RANGE)) { return false; } // 如果打印結(jié)束頁(yè)的輸入框留空或輸入了空白字符,就表明用戶想 // 從打印開(kāi)始頁(yè)打印到文檔的最后一頁(yè)。 CString strToPageText; GetDlgItemText(IDC_PRINT_EDT_PAGE_TO, strToPageText); strToPageText.TrimLeft(); strToPageText.TrimRight(); if (!strToPageText.IsEmpty() && !CDlgBase::DlgGetItemUINT(this, IDC_PRINT_EDT_PAGE_TO, IDS_E_PRINT_INVALID_PAGES_RANGE, pi.m_nPageTo, NUM_PRINTING_MIN_PRINT_PAGES_RANGE, NUM_PRINTING_MAX_PRINT_PAGES_RANGE)) { return false; } if (pi.m_nPageFrom > pi.m_nPageTo) { appAlert2(IDS_E_PRINT_INVALID_PAGES_SEQUENCE_NUMBER, MB_OK | MB_ICONEXCLAMATION, pi.m_nPageFrom, pi.m_nPageTo); return false; } } // 標(biāo)題和腳注。 GetDlgItemText(IDC_PRINT_EDT_HEADER, pi.m_strHeader); GetDlgItemText(IDC_PRINT_EDT_FOOTER, pi.m_strFooter); m_pi = pi; // 復(fù)制所有正確的數(shù)據(jù)。 return true; }
??? * 對(duì)我有用[0]
??? * 丟個(gè)板磚[0]
??? * 引用
??? * 舉報(bào)
??? * 管理
??? * TOP
??? * liumenghappy用戶頭像
??? * liumenghappy
??? * (小胖)
??? *
??? * 等 級(jí):
??? *
????
#25樓 得分:0回復(fù)于:2009-10-29 10:30:00
引用 23 樓 jennyvenus 的回復(fù):
C/C++ code// DlgPrint.cpp : 實(shí)現(xiàn)文件//
#include"stdafx.h"
#include<winspool.h>
#include<dlgs.h>
#include"App.h"
#include"AppGlobals.h"
#include"AppSettings.h"
#include"AppFrame.h"
#include"DlgBase.h"
#include"DlgPrint.h"/// 本來(lái)在RC資源文件中的打印對(duì)話框使用了<dlgs.h>中定義的控件標(biāo)識(shí),但VC的資源編// 輯器把這些控件標(biāo)識(shí)換成了常數(shù)。#define IDC_PRINT_BTN_SET_PRINTER psh3#define NUM_PRINTING_MIN_PRINT_PAGES_RANGE 1#define NUM_PRINTING_MAX_PRINT_PAGES_RANGE USHRT_MAX/// CDlgPrintIMPLEMENT_DYNAMIC(CDlgPrint, CPageSetupDialog)
BEGIN_MESSAGE_MAP(CDlgPrint, CPageSetupDialog)
ON_BN_CLICKED(IDC_PRINT_BTN_SET_HEADER_TEXT, OnSetHeaderFooterText)
ON_BN_CLICKED(IDC_PRINT_BTN_SET_FOOTER_TEXT, OnSetHeaderFooterText)
END_MESSAGE_MAP()
CDlgPrint::CDlgPrint(CMyEditView* pOwner) : CPageSetupDialog(0, pOwner)
{
PRINTDLG pd;
memset(&pd,0,sizeof(pd));
GetApp()->GetPrinterDeviceDefaults(&pd);
m_pi= GetAppSettings()->PrintingGetInfo();
m_pOwner= pOwner;
m_bPageSetup= (pOwner== NULL);
m_psd.rtMargin= m_pi.m_rectMargin;
m_psd.hDevMode= pd.hDevMode;
m_psd.hDevNames= pd.hDevNames;
m_psd.Flags&=~(PSD_SHOWHELP| PSD_INTHOUSANDTHSOFINCHES);
m_psd.Flags|= PSD_ENABLEPAGESETUPTEMPLATE| PSD_INHUNDREDTHSOFMILLIMETERS|
PSD_MARGINS| PSD_DEFAULTMINMARGINS;
m_psd.hInstance= AfxGetResourceHandle();
m_psd.lpPageSetupTemplateName= MAKEINTRESOURCE(IDD_PRINT_INITIAL);
}
CDlgPrint::~CDlgPrint()
{
}/// CDlgPrint 消息處理程序BOOL CDlgPrint::OnInitDialog()
{
CPageSetupDialog::OnInitDialog();// TODO: 在此添加額外的初始化 CDlgBase::DlgEnableItem(this, IDC_PRINT_EDT_SCALE,false);
CDlgBase::DlgEnableItem(this, IDC_PRINT_SPN_SCALE,false);
UpdateDataSet();returntrue;// return true unless you set the focus to a control// 異常: OCX 屬性頁(yè)應(yīng)返回 false}void CDlgPrint::OnOK()
{// TODO: 在此添加專用代碼和/或調(diào)用基類if (!UpdateDataGet())
{return;
}
CPageSetupDialog::OnOK();// 復(fù)制頁(yè)邊距和紙張尺寸。 m_pi.m_sizePaper.cx= m_psd.ptPaperSize.x;
m_pi.m_sizePaper.cy= m_psd.ptPaperSize.y;
m_pi.m_rectMargin.CopyRect(&m_psd.rtMargin);// 計(jì)算最小的頁(yè)邊距。 CDC dcPrint;if (dcPrint.Attach(CreatePrinterDC()))
{
CSize sizeLUsPI;// Logic Unit Per Inch sizeLUsPI.cx= dcPrint.GetDeviceCaps(LOGPIXELSX);
sizeLUsPI.cy= dcPrint.GetDeviceCaps(LOGPIXELSY);
CSize sizePaper;// 紙張尺寸。 sizePaper.cx= dcPrint.GetDeviceCaps(PHYSICALWIDTH);
sizePaper.cy= dcPrint.GetDeviceCaps(PHYSICALHEIGHT);
dcPrint.DPtoLP(&sizePaper);
CSize sizePrint;// 可打印范圍。 sizePrint.cx= dcPrint.GetDeviceCaps(HORZRES);
sizePrint.cy= dcPrint.GetDeviceCaps(VERTRES);
dcPrint.DPtoLP(&sizePrint);
CSize sizeOfsLT;// 左邊和上邊,邏輯單位。 sizeOfsLT.cx= dcPrint.GetDeviceCaps(PHYSICALOFFSETX);
sizeOfsLT.cy= dcPrint.GetDeviceCaps(PHYSICALOFFSETY);
dcPrint.DPtoLP(&sizeOfsLT);
CSize sizeOfsRB;// 右邊和下邊,邏輯單位。 sizeOfsRB.cx= sizePaper.cx- sizeOfsLT.cx- sizePrint.cx;
sizeOfsRB.cy= sizePaper.cy- sizeOfsLT.cy- sizePrint.cy;
CSize sizeLT_MM;// 轉(zhuǎn)換成1/100MM單位。 sizeLT_MM.cx= (LONG)((FLOAT)sizeOfsLT.cx*2540/ sizeLUsPI.cx);
sizeLT_MM.cy= (LONG)((FLOAT)sizeOfsLT.cy*2540/ sizeLUsPI.cy);
CSize sizeRB_MM;// 轉(zhuǎn)換成1/100MM單位。 sizeRB_MM.cx= (LONG)((FLOAT)sizeOfsRB.cx*2540/ sizeLUsPI.cx);
sizeRB_MM.cy= (LONG)((FLOAT)sizeOfsRB.cy*2540/ sizeLUsPI.cy);
CRect& rect= m_pi.m_rectMargin;
rect.left= max(sizeLT_MM.cx, rect.left);
rect.top= max(sizeLT_MM.cy, rect.top);
rect.right= max(sizeRB_MM.cx, rect.right);
rect.bottom= max(sizeRB_MM.cy, rect.bottom);
dcPrint.DeleteDC();
}// 保存打印設(shè)置。 GetAppSettings()->PrintingSetInfo(m_pi);// 如果要求啟動(dòng)打印,現(xiàn)在就執(zhí)行。if ((m_pOwner!= NULL)&& (::IsWindow(m_pOwner->GetSafeHwnd())))
{
m_pOwner->SendMessage(WM_COMMAND,
MAKEWPARAM(ID_FILE_PRINT,0),0);
}
}
都是網(wǎng)上的代碼,多搜搜就搞定了。
十分感謝
轉(zhuǎn)載于:https://www.cnblogs.com/cwbo-win/articles/3380196.html
總結(jié)
以上是生活随笔為你收集整理的vc打印机相关设置和pos打印机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于Java窗体的KTV点歌系统在线点歌
- 下一篇: MVC、MVVM、RaectiveCoc