我用截屏截取了屏幕的一部分再内存DC中,现在我要把他打印出来应该怎么做呀???进来的都有分

962veiri 2002-05-20 02:32:47
我的代码如下
CRect rect;
m_Chart1.GetClientRect(&rect);//m_Chart1是我要打印的控件

CDC memDC,memDC1;
CClientDC srcDC(this);
CBitmap Srcbmp;
memDC.CreateCompatibleDC(&srcDC);
Srcbmp.CreateCompatibleBitmap(&srcDC,rect.Width(),rect.Height());

CBitmap *pOld=memDC.SelectObject(&Srcbmp);
memDC.BitBlt(0,0,rect.Width(),rect.Height(),&srcDC,0,0,SRCCOPY);
memDC.SelectObject(pOld);

CDC dc;
CPrintDialog dlg(false);
if(dlg.DoModal()!=IDOK)
return;
else
dc.Attach(dlg.GetPrinterDC());
memDC1.CreateCompatibleDC(&dc);
CBitmap *pOld1=memDC1.SelectObject(&Srcbmp);

CRect rect1;
GetClientRect(&rect1);


dc.StartDoc("test");
dc.StartPage();
dc.StretchB(rect1.left,rect1.top,rect1.right,rect1.bottom,
&memDC1,0,0,rect.Width(),rect.Height(),SRCCOPY);
//这里为什么打印不出来呀??
dc.EndDoc();

memDC1.SelectObject(pOld1);


谢谢大家!!!
...全文
209 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ideal 2002-05-28
  • 打赏
  • 举报
回复
UP
public 2002-05-28
  • 打赏
  • 举报
回复
关注
tengfei2005 2002-05-28
  • 打赏
  • 举报
回复
up
zyoujie 2002-05-28
  • 打赏
  • 举报
回复
up up
headman 2002-05-27
  • 打赏
  • 举报
回复
up
qindq 2002-05-27
  • 打赏
  • 举报
回复
问题处在这里:

CClientDC srcDC(this);
我不相信这个srcDC能够有你要的bitmap。

this我猜是m_Chart1的父窗口。
其实这种CClientDC 与 Windows API: GetDC(this->m_hWnd)完全等价。据我的经验这种DC往往(绝大多数情况)不能得到你意料中的位图,尤其是上面的子窗口位图。因为Windows的DC要考虑到裁剪等等问题。

即使你用的是CClientDC srcDC(&m_Chart1),恐怕也不行,因为你不知道m_Chart1的内部具体实现。

这个srcDC 可以这样得到CClientDC srcDC(NULL).是一个ScreenDC,你可以把
rect的值映射成屏幕值。这样我相信是可以的。
但是这种方法有缺陷,即--如果m_Chart1如果不在屏幕内,或被其他窗口遮挡一部分,你将会看到不希望的结果。当然你可以强制把它弄到屏幕里,再把它弄到最上面...哈哈。

其实即使CClientDC srcDC(this)真的如你想象的那么强,也不会解决上述缺陷。

这是使用控件的最大的问题。

yessong 2002-05-27
  • 打赏
  • 举报
回复
gz
devil97518 2002-05-27
  • 打赏
  • 举报
回复
guan zhu
962veiri 2002-05-27
  • 打赏
  • 举报
回复
楼上的:我的问题不是说没有设置映射模式,是在我的机器上可以打印出来,但是在我同学的机器上可以打印出来,我们都使用的Win2k,不过我是服务器版本,他是客户端版本,还有就是我用的打印机是HP的,分辨率是600dpi,我同学的是富士通的,分辨率也是600dpi,麻烦你们巴我的代码拷贝到你们的机器上去运行看看,能否打印出来
brushman 2002-05-24
  • 打赏
  • 举报
回复
今天编一个程序,需要在对话框里打印GDI图形,终于把这个问题搞清楚了。
问题出在映射模式上,把StretchBlt那句替换成下面的就可以了。也可以设成其他映射模式,看看MSDN里的说明。
dc.SetMapMode(MM_LOENGLISH);
dc.SetViewportExt(xPage/2,-yPage/2);
dc.SetViewportOrg(xPage/2,yPage/2);
dc.StretchBlt(-BitMap.bmWidth/2,
BitMap.bmHeight/2,
BitMap.bmWidth,
BitMap.bmHeight,
&memDC1,
0,
0,
BitMap.bmWidth,
BitMap.bmHeight,
SRCCOPY);
DanielPrc 2002-05-23
  • 打赏
  • 举报
回复
我也没打出来过,你那个同学说能打出来吗?
叫你试试bitblt函数了,为什么不试?

(先不管图形显示出来是否合要求,你先试试bitblt,因为可能stretchblt对某些打印机驱动有问题吧,谁知道呢!)
962veiri 2002-05-23
  • 打赏
  • 举报
回复
我用的是对话框形式,没用到文档/视图结构:
我的结构很简单,就是对话框上防止了一个MsChart控件,然后我要把他按屏幕比例打印出来,应该怎么实现???我的代码如下:
CRect rect;
m_Chart1.GetClientRect(&rect);

CDC memDC,memDC1;
CDC dc;

CDC *srcDC=m_Chart1.GetDC();
CBitmap Srcbmp;

memDC.CreateCompatibleDC(srcDC);
Srcbmp.CreateCompatibleBitmap(srcDC,rect.Width(),rect.Height());
CBitmap *pOld=memDC.SelectObject(&Srcbmp);
if(0==memDC.BitBlt(0,0,rect.Width(),rect.Height(),srcDC,0,0,SRCCOPY))
{
AfxMessageBox("BitBlt Error!");
return;
}
memDC.SelectObject(pOld);

CPrintDialog dlg(FALSE);
dlg.DoModal();
dlg.GetDefaults();
dc.Attach(dlg.GetPrinterDC());
memDC1.CreateCompatibleDC(&dc);
pOld=memDC1.SelectObject(&Srcbmp);
//dc.SelectObject(&Srcbmp);

if(dc.StartDoc("test")<0)
{
AfxMessageBox("StratDoc Error!");
return;
}
if(dc.StartPage()<0)
{
AfxMessageBox("StratPage Error!");
return;
}
BITMAP BitMap;
if(!Srcbmp.GetBitmap(&BitMap))
{
AfxMessageBox("取bitmap结构出错");
return;
}
int iPrintResH=dc.GetDeviceCaps(HORZRES);
int iPrintResV=dc.GetDeviceCaps(VERTRES);
dc.StretchBlt(0,
0,
iPrintResH,
iPrintResV,
&memDC1,
0,
0,
BitMap.bmWidth,
BitMap.bmHeight,
SRCCOPY);

dc.EndPage();
dc.EndDoc();

memDC1.SelectObject(pOld);

你们把代码拷贝下来看能不能实现。m_Chart1是 Microsoft Chart Control控件
,鼠标右健点击对话框,选择Insert ActiveX Control就能找到这个控件,加上去,试试代码看。我同学在他机器上市了说可以很好的打印出来,为什么我这里不行??
akademecia 2002-05-23
  • 打赏
  • 举报
回复
只是做个标记,便于以后查询
你们继续谈
doughlus 2002-05-23
  • 打赏
  • 举报
回复
绘图的时候用OnDraw(CDC*pDC)中的pDC指针,不要用CClientDC的指针,它不指向打印机设备。
962veiri 2002-05-23
  • 打赏
  • 举报
回复
我的代码就是上面的,加在一个对话框的一个ButtonClick事件下的,其余没有代码了,大家说还有哪里要改进?
962veiri 2002-05-23
  • 打赏
  • 举报
回复
我用bitblt也打印不出来。楼上的,你也没打印出来吗???那就奇怪了,我同学明明说可以打印出来,在他机器上呀
Bottol 2002-05-22
  • 打赏
  • 举报
回复
问题出在你的打印机的分辨率相对图象来说太高了,你把屏幕存成图象的时候,是以设备坐标转成对应象素存储的,而打印机DC的分辨率和象素与你的图象不同,所以你的代码没什么问题,只是图象太小而已。尝试以下代码,它将你的图象缩放在打印纸张上。如果你要以原ClientRect大小打印,需要计算原ClientRect的大小再打到打印机上去。
CRect rect;
m_Chart1.GetClientRect(&rect);

CDC memDC,memDC1;
CDC dc;

CClientDC srcDC(this);
CBitmap Srcbmp;

memDC.CreateCompatibleDC(&srcDC);
Srcbmp.CreateCompatibleBitmap(&srcDC,rect.Width(),rect.Height());
CBitmap *pOld=memDC.SelectObject(&Srcbmp);
if(0==memDC.BitBlt(0,0,rect.Width(),rect.Height(),&srcDC,0,0,SRCCOPY))
{
AfxMessageBox("BitBlt Error!");
return;
}
memDC.SelectObject(pOld);

CPrintDialog dlg(FALSE);
dlg.DoModal();
dlg.GetDefaults();
dc.Attach(dlg.GetPrinterDC());
memDC1.CreateCompatibleDC(&dc);
pOld=memDC1.SelectObject(&Srcbmp);
//dc.SelectObject(&Srcbmp);

if(dc.StartDoc("test")<0)
{
AfxMessageBox("StratDoc Error!");
return;
}
if(dc.StartPage()<0)
{
AfxMessageBox("StratPage Error!");
return;
}
BITMAP BitMap;
if(!Srcbmp.GetBitmap(&BitMap))
{
AfxMessageBox("取bitmap结构出错");
return;
}
int iPrintResH=dc.GetDeviceCaps(HORZRES);
int iPrintResV=dc.GetDeviceCaps(VERTRES);
dc.StretchBlt(0,
0,
iPrintResH,
iPrintResV,
&memDC1,
0,0,
BitMap.bmWidth,
BitMap.bmHeight,
SRCCOPY);

dc.EndPage();
dc.EndDoc();

memDC1.SelectObject(pOld);
962veiri 2002-05-22
  • 打赏
  • 举报
回复
打印机我都能得到,而且也可以打印,但是就是打印出来的东西要么是空白,要么是黑色的一块,这是为什么呀???
dongfire 2002-05-22
  • 打赏
  • 举报
回复
这样试一下CDC::CreateDC(xxx),在参数里指定要使用的打印机,应该可以.
962veiri 2002-05-22
  • 打赏
  • 举报
回复
大家帮忙呀!!!!!!!!
加载更多回复(45)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧