MFC 一个dc复制到另一个dc复制粘贴的打印出来来为什么是黑的。

MFC&几中DC的使用
类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC。这意味着和CClientDC对象相关的是窗口的客户区。
几种DC及区别
  CClientDC:(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC:
  用法是:CClientDC
dc(this);//this一般指向本窗口或当前活动视图dc.TextOut(10,10,str,str.GetLength());//利用dc输出文本,如果是在CScrollView中使用,还要注意调用OnPrepareDC(&dc)调整设备上下文的坐标。CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。
  CWindowDC:关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送
  CWindowDC与CClientDC,CPaintDC的区别:CWindowDC可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。CWindowDC下坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。CClientDC与CPaintDC的区别:
  CPaintDC的对象一般用在OnPaint内以响应Windows消息WM_PAINT,自动完成绘制,在整个窗口内进行重画,维持原有窗口完整性。CClientDC应用在非响应Windows消息WM_PAINT的情况下,进行实时绘制,绘制的区域内被重画。&
MFC中的绘图功能需要用到DC,即设备上下文环境,下面列举出几中常用的DC和用法(以直线绘制为例子).
&& HDC//声明一个DC句柄
&& hdc=::GetDC(m_hWnd);
//通过API函数获得当前窗口类的DC句炳(如果在类的成员函数中使用的&&&&&&&&&&&&&
话),m_hWnd是每个窗 口类都有的一个与自身相关的窗口句柄.
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//原点的移动
LineTo(hdc,point.x,point.y);//绘制一条从新原点到(x,y)的直线.
::ReleaseDC(m_hWnd,hdc);//释放DC
&& 用另外一种方法(指针)
CDC *pDC=GetDC();//用窗口的成员函数获得DC指针
pDC-&MoveTo(m_ptOrigin);
pDC-&LineTo(point);
ReleaseDC(pDC);//这几句不用多说了吧
2用CWindowDC类(用类操作的一个好处是:可以不用显式地释放DC,由类的析构函数处理)
CWindowDC dc(this);
CWindowDC dc(GetParent());
CWindowDC dc(GetDesktopWindow());
//这三句任意选取一句就好了,至于区别应该不难看出吧.
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CWindowDC用于整个窗口,包括非客户区
3 使用CClientDC
CClientDC dc(this);
CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
CClientDC用于窗口客户区&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。MFC获取DC的四种方式
1)API函数方法用HDCHDC
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);//必须成对使用这里获得GetDC()函数需要跟ReleaseDC()函数成对使用
2)用CDC类成员函数。此时别忘记ReleaseDCCDC *pDC=GetDC();
pDC-&MoveTo(m_ptOrigin);
pDC-&LineTo(point);
ReleaseDC(pDC);//必须成对使用同样需要成对使用手动释放DC
3)用CClientDCCClientDC dc(this);
//CClientDC dc(GetParent());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);//此处不需要ReleaseDC,因为CClientDC会自动释放DCCClientDC构造函数传递一个窗口类的对象。其在用完后自动释放DC,不需要显式的调用ReleaseDC()
4)用CWindowDC,用它甚至可以整个屏幕区域画线CWindowDC dc(this);
//CWindowDC dc(GetParent());
/*CWindowDC dc(GetDesktopWindow());//此时可以在整个屏幕上画线。
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
CPen pen(PS_DOT,1,RGB(0,255,0));
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);同样CWindowDC构造函数也需要传递一个窗口类的对象。与CClientDC的区别是该对象可以访问整个窗口区域,包括框架窗口(菜单栏,工具栏)。而CClientDC只能访问的是客户区。
这里同时可以初步了解一下CPen *pOldPen=dc.SelectObject(&pen);函数,同时注意一下其返回值!
这是GDI画图的特点,当给dc执行一次SelectObject,它将返回前一次SelectObject的内容,绘图完毕,执行dc.SelectObject(pOldPen)。
就相当于你在画布上画图,你手里本来默认拿着一只白色的画笔,现在你要画蓝色线条,所以你选了一个蓝色画笔,画图完毕,你还要恢复你手里默认拿着的白色画笔。
MFC中的DC,CDC和HDC
没有更多推荐了,怎么将一个DC上的内容复制到CBitmap类型的图片上,速度求帮助
[问题点数:40分,结帖人wanglu]
本版专家分:162
结帖率 96%
CSDN今日推荐
本版专家分:12777
本版专家分:162
本版专家分:13967
本版专家分:13967
本版专家分:162459
2017年10月 VC/MFC大版内专家分月排行榜第一2016年3月 VC/MFC大版内专家分月排行榜第一2014年10月 VC/MFC大版内专家分月排行榜第一2014年9月 VC/MFC大版内专家分月排行榜第一2014年7月 VC/MFC大版内专家分月排行榜第一2014年6月 VC/MFC大版内专家分月排行榜第一2014年5月 VC/MFC大版内专家分月排行榜第一2014年4月 VC/MFC大版内专家分月排行榜第一2014年2月 VC/MFC大版内专家分月排行榜第一2013年7月 VC/MFC大版内专家分月排行榜第一
2018年5月 VC/MFC大版内专家分月排行榜第二2017年12月 VC/MFC大版内专家分月排行榜第二2017年6月 VC/MFC大版内专家分月排行榜第二2017年5月 VC/MFC大版内专家分月排行榜第二2017年1月 VC/MFC大版内专家分月排行榜第二2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2018年6月 VC/MFC大版内专家分月排行榜第三2018年4月 VC/MFC大版内专家分月排行榜第三2018年3月 VC/MFC大版内专家分月排行榜第三2018年2月 VC/MFC大版内专家分月排行榜第三2018年1月 VC/MFC大版内专家分月排行榜第三2017年11月 VC/MFC大版内专家分月排行榜第三2017年9月 VC/MFC大版内专家分月排行榜第三2017年8月 VC/MFC大版内专家分月排行榜第三2017年4月 VC/MFC大版内专家分月排行榜第三2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
本版专家分:140603
2013年10月 荣获微软MVP称号2012年10月 荣获微软MVP称号2011年10月 荣获微软MVP称号2010年10月 荣获微软MVP称号
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
2010年11月 VC/MFC大版内专家分月排行榜第三
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐MFC打印机制
时间: 15:56:01
&&&& 阅读:1617
&&&& 评论:
&&&& 收藏:0
标签:MFC 打印程序的编制
在实现打印编程工作时已经建立了一个已有的框架,我们只要往这个框架里面填东西即可。 打印工作其实就是在
上绘图,不过这里的
是打印机的
,明确这一点之后,想当然的,我们打印的任务可以分为获取打印机
、根据打印机驱动让用户交互设置打印参数、开始打印、打印的具体过程(分页、绘制等)、结束打印、释放
。以下通过一段示列代码来说明:
打印控制函数
则不能实现打印功能,
而是建立打印机,祥查
如果仅打印一份则可以用
通知打印机驱动程序接受打印文档
是否逐份打印
是否全部打印
选定页码范围
选定的选择区域
暂时不知道怎么处理的
只起到判断作用,不
加不会影响正常打印
告诉打印驱动换
页,如果不加则将所有页打在一张纸上
是否全部打印
选定页码范围
选定的选择区域
暂时不知道怎么处理的
只起到判断作用,不
加不会影响正常打印
告诉打印驱动换
页,如果不加则将所有页打在一张纸上
是否全部打印
选定页码范围
选定的选择区域
暂时不知道怎么处理的
只起到判断作用,不加不会
影响正常打印
告诉打印驱动换页,如果不
加则将所有页打在一张纸上
具体的页面绘制函数
以下针对微软封装的几个相应函数按调用顺序做一简单描述: 1.OnPreparePrinting OnPreparePrinting 函数最先被调用,用来初始化打印机等。比如,若没有安装打印机,则该函数将提示用户安装打印机。用户程序可以向其中加入别的初始化代码,比如,计算打印你的文档所需要的总页数,然后调用视类中的打印机初始化函数BOOL & DoPreparePrinting(CPrintInfopInfo)即可。而用AppWizard生成的代码中,OnPreparePrinting函数将只是调用函数DoPreparePrinting,并传递参数。 2.OnBeingPrinting OnBeingPrinting 函数是开始打印文档前调用的函数,用户可以在其中加入另一些对于打印过程的初始化代码,比如分配打印过程中将要使用的“笔”(CPen)、“刷子”(CBrush)等,默认的代码中该函数将直接返回。 3.OnPrepareDC OnPrepareDC 函数用于在打印前准备打印设备场,如窗口大小、原点,视图大小、原点等。同时该函数在视类显示文档内容时也被调用,默认的代码中该函数调用基类中的OnPrepareDC函数。 4.OnPrint OnPrint 函数则是具体的打印过程,它利用前面准备好的设备场进行打印。 5.OnEndPrinting OnEndPrinting 函数是与OnBeginPrinting函数相对应的函数,它在打印完成后由应用框架调用,用于释放在OnBeginPrinting中分配的“对象”,如“笔”、“刷子”等,其默认的代码中该函数将直接返回。 &SetViewportOrg(0,originy);&&& 实现奖 CView OnDraw内容分页。标签:原文地址:http://embeded.blog.51cto.com/0394
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!MFC对话框里获取DC画图的几种方法
对于create的dc应该予以deletedc,而对于getdc的应予以releasedc
一、 CDC *pDC = GetDC();
CPen pen(PS_SOLID, 2, RGB(0,0,255));
pDC-&SelectObject(&pen);
pDC-&MoveTo(10, 10);
pDC-&LineTo(500, 450);
ReleaseDC(pDC);
CClientDC dc(this);
dcCompatible.CreateCompatibleDC(&dc);
dcCompatible.SelectObject(&m_bitmap);
pMemDC-&BitBlt(m_rcWindowRect.left, m_rcWindowRect.top, m_rcWindowRect.Width(), m_rcWindowRect.Heigh(), &dcCompatible, 0, 0, SRCCOPY);
pMemDC-&StretchBlt(m_rcWindowRect.left, m_rcWindowRect.top, m_rcWindowRect.Width(), m_rcWindowRect.Height(),
&dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
DeleteDC(dcCompatible);
CPaintDC dc(this);
//CPaintDC只在OnPaint函数里有效。
CDC *pDC = m_pParentDlg-&GetDC();
hDC = CreateCompatibleDC(pDC-&GetSafeHdc());
hOldBmp = SelectObject(hDC, m_hbitmap);
StretchBlt(pDC-&m_hDC, 535, 70, 200, 150, hDC, 0, 0, m_tuwidth, m_tuheight, SRCCOPY);
SelectObject(hDC, hOldBmp);
DeleteDC(hDC);
m_pParentDlg-&ReleaseDC(pDC);
wince从文件里面加载bmp格式图片:(要包含头文件ShellAPI.h)
#include &ShellAPI.h& HBITMAP
hmap = SHLoadDIBitmap(_T("\\SDMMC\\Test\\kenan.bmp"));
CDC dcC dcCompatible.CreateCompatibleDC(pMemDC);
SelectObject(dcCompatible, hmap);
BitBlt(pMemDC-&m_hDC, m_rcWindowRect.left, m_rcWindowRect.top, m_rcWindowRect.Width(), m_rcWindowRect.Height(), dcCompatible, 0, 0, SRCCOPY);
DeleteDC(dcCompatible)
MFC对话框(Dialog类)中添加客户区(View类)实现绘图
MFC对话框画图
关于在MFC中实用在基于对话框窗口上面绘制折线的实现方法
MFC 学习之 模态对话框图片控件上作图
MFC之设备描述表DC、画笔Pen、画刷Brush
VC在对话框中画图
MFC在对话框上面绘图
MFC中的DC,CDC和HDC
没有更多推荐了,

我要回帖

更多关于 怎么复制图片然后打印出来 的文章

 

随机推荐