导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

急!打印问题,各位高手帮帮忙。在线等!!!

丁淇石头 2003-04-24 10:58:27
我使用MFC本身的打印函数。如果要打印5页的话,只有全部内容都发送到打印机上后(即执行5遍Oprint函数),打印机才开始打印。我现在要打印完前面2页后,弹出一个提示框,单击提示框上的“确认”后再打印剩余的3页,程序中应该怎么处理?
...全文
33 点赞 收藏 23
写回复
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁淇石头 2003-05-14
To:smilewang(急速传说),使用你的方法可以实现。但我的程序中调用了MFC本身的OnPreparePrinting(),OnPrint等函数,好象与直接调用不太一样,我还没有调好,方便的话请再帮帮忙。我已另外开了一个帖子,送上100分表示感谢。http://expert.csdn.net/Expert/topic/1781/1781714.xml?temp=.6276514
回复
Panr 2003-05-13
偶没遇见过
仅从题义无法判断,猜不出
回复
smilewang 2003-05-13
// 这个函数一运行,也会立即弹出对话框,但实际上第一部分已经
// 送到打印机那里了,稍微等一下,你就会看到第一部分开始打印了。
//
// 你可以建立一个dialog base的程序,把下面这段程序放在某个
// 按钮的响应函数中 测试一下。
CPrintDialog dlgPrint(false);//构造一个打印机设置对话框
//
if (dlgPrint.DoModal()==IDCANCEL){
return;
}
//
HDC hDC=NULL;
CDC dc;
hDC=dlgPrint.GetPrinterDC(); //
if (dc.Attach(hDC)==false){ //获得打印机的dc
return;
}
// print job
DOCINFO di; //设置打印文档信息
::ZeroMemory(&di,sizeof(DOCINFO));
di.cbSize=sizeof(DOCINFO);
di.lpszDocName="证书模板工具";//打印作业的名称
// 第一部分打印
dc.StartDoc(&di);// 表示第一次打印作业的开始
dc.StartPage();//表示每一页的开始,可以在此循环,到EndPage为止
dc.SetMapMode(MM_TWIPS);
dc.SelectStockObject(NULL_BRUSH);
// 第一次打印部分
// 例如:
dc.Rectangle(0,0,1440,-1440);
//
if (dc.EndPage()<=0){
dc.AbortDoc();//取消
}
else{
dc.EndDoc();// 第一次打印作业正常结束
}
//
MessageBox("第一面打印完后,请将证书的反面放入打印机",
"提示");

// 第二部分打印
dc.StartDoc(&di);// 表示第二次打印作业的开始
dc.StartPage();
dc.SetMapMode(MM_TWIPS);
dc.SelectStockObject(NULL_BRUSH);
// 第二次打印部分
// 例如:
dc.Rectangle(1440,0,2880,-1440);
if (dc.EndPage()<=0){
dc.AbortDoc();
}
else{
dc.EndDoc();// 第二次打印作业的结束
}

// release resource
dc.Detach();
::DeleteDC(hDC);
回复
smilewang 2003-05-11
FrameWork是这样的:
//
OnPreparePrint()
OnBeginPrinting()
StartDoc() //一次打印作业开始
OnPrepareDC() //多页打印则从这开始循环
StartPage() // 一页开始
再次OnPrepareDC()
OnPrint()
EndPage() //一页结束,多页打印的话,循环.
EndDoc() //一次打印作业结束,直到这是,打印才提交给打印机.开始打印.
OnEndPrinting()
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
所以,改写OnPrepareDC函数,加MessageBox是没用的.
回复
丁淇石头 2003-05-09
楼上的老大,请再详细的说明一下,我已给你发了短消息。
回复
truesideleft 2003-05-09
讲一下原理:

app FRAMWORK 在打印每页时先调用OnPrepareDC。
如果测到pInfo->m_bContinuePrinting==FALSE 则停止打印
回复
truesideleft 2003-05-09
重载 虚拟函数 OnPrepareDC(CDC* pDC, CPrintInfo* pInfo);
{
if (pInfo->m_nCurPage==3)
{
if (AfxMessageBox"要继续?",MB_YESNO)==IDYES)
{
pInfo->m_bContinuePrinting=TRUE;
}
pInfo->m_bContinuePrinting=FALSE;
}
}
部分参数可能有错

回复
goodboyyxh 2003-05-09
up
回复
smilewang 2003-05-08
我也是和你一样的情况.我是在一张纸的正反面打印,打完正面后,给个提示,按确认后再打反面.
反正我再MFC给的框架里,没有实现这个功能.框架会一股脑的全部算完之后再打印,也就是说先谈出对话框然后才打印.最后我用startdoc()和enddoc()来完成的.
伪代码如下:
//各类的初始化
DOCINFO di;
...
dc.StartDoc(&di)
dc.StartPage();
//第一部分的打印
dc.EndPage();
dc.EndDoc();
//
MessageBox("开始第二部分打印","提示",MB_OK);
dc.StartDoc(&di)
dc.StartPage();
//第二部分的打印
dc.EndPage();
dc.EndDoc();
//

回复
丁淇石头 2003-05-08
再顶最后一次。
各位老大,该出手时就出手啊。
回复
丁淇石头 2003-05-06
顶!!!
回复
丁淇石头 2003-05-05
自己顶!!!
回复
1998810 2003-05-04
搞个全局 static 变量.
开个玩笑,帮你顶一下
回复
丁淇石头 2003-05-04
再顶。大侠们都休假去了吗?
回复
丁淇石头 2003-04-29
各位老大帮帮忙呀。
回复
anothervip 2003-04-27
BOOL CALLBACK AbortProc(HDC hDC,int nCode)
{
MSG msg;
while(!Cancel&&::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
AfxGetThread()->PumpMessage();
return !Cancel;
}
回复
丁淇石头 2003-04-24
没人看到吗?自己顶。
回复
丁淇石头 2003-04-24
To BinaryWorld(小生菜鸟):
怎么打印我基本上都知道,关键是怎么在打印的中间用提示框使其暂时停顿。
回复
丁淇石头 2003-04-24
我的E_mail地址:jnxulei@sina.com
回复
BinaryWorld 2003-04-24
《C++技术内幕》5edition 里面有一个和你很像的打印例子,刚好昨天晚上我们给一个添加打印功能的时候看到了。

MFC的打印机制牵扯到5个接口函数.
OnPrint(CDC* pDC, CPrintInfo* pInfo)
OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
OnPreparePrinting(CPrintInfo* pInfo)
OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
OnDraw(CDC* pDC)

其中,工作机制如下:
OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
这两个是为了准备打印和结束打印操作的函数

主要是在OnPaint和OnDraw这两个函数中,基本上来说可以理解为OnDraw负责屏幕显示,OnPaint负责打印显示,这只是个笼统的说法,在屏幕显示和打印的时候都是调用的,OnPaint调用OnDraw,所以你在里面的代码都会被显示出现。

如果你为了达到屏幕显示和打印的不一样效果,可以采用用OnDraw去完成屏幕显示工作,而在OnPaint里面完成打印工作,这样你需要的是在OnPaint里面设置一个参数,(不好意思,在下手头没有这本书,不知道这个参数到底是什么?回头贴出来)。

可能你感觉我还没有回答你的问题。而关键就在了这里,在你的OnPaint函数里执行的就是打印工作打印出来的东西。取得一个页面所能打印的行数,然后打印函数里设置一个累加器的判断页数

具体代码请参与《C++技术内幕 5th Edition》
小生菜鸟也是昨天晚上才开始看着个部分的,如果有说错的地方还请多多指教
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……