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

posts - 390,&
comments - 57,&
trackbacks - 0
1 以下代码我是在View类中实现的:
2 /** 利用平台SDK实现画线功能
// 首先获得窗口的设备描述表
hdc = ::GetDC( m_hWnd );
//调用的是平台SDK的成员函数
// 移动到线条的起点
MoveToEx( hdc, m_ptOrigin.x, m_ptOrigin.y, NULL ); // 第四个参数是一个指向Point结构体的指针,用于保存移动前鼠标的位置坐标,这里不需要这个坐标,所以设置为NULL
LineTo( hdc, point.x, point.y );
::ReleaseDC( m_hWnd, hdc );
CView::OnLButtonUp(nFlags, point);
/** CDC 类,利用MFC封装类实现画线功能
CDC* pDC = GetDC();
// 调用的是CWnd类的成员函数,View类也是从CWnd类继承的
pDC-&MoveTo( m_ptOrigin );
pDC-&LineTo( point );
ReleaseDC( pDC );
/** 利用CDC 类的派生类 CClientDC 实现画线功能, 他在构造函数中调用GetDC,在析构时调用ReleaseDC,因此不需要显示调用
//CClientDC dc( this );
CClientDC dc( GetParent() );
dc.MoveTo( m_ptOrigin );
dc.LineTo( point );
/**CWindowDC 也派生于CDC类
//CWindowDC dc( this );
// 在客户区绘图
//CWindowDC dc( GetParent() );
// 可以在菜单栏和工具栏上绘图
CWindowDC dc( GetDesktopWindow());
dc.MoveTo( m_ptOrigin );
dc.LineTo( point );
/** 画笔的使用
//CPen pen( PS_SOLID, 2, RGB(255, 0, 0) );
//CPen pen( PS_DASH, 1, RGB(255, 0, 0) );
//线宽必须&=1才生效
CPen pen( PS_DOT, 1, RGB(255, 0, 0) );
CClientDC dc( this );
CPen* pOldPen = dc.SelectObject( &pen );
dc.MoveTo( m_ptOrigin );
dc.LineTo( point );
dc.SelectObject( pOldPen );
/** 颜色画刷的使用
CBrush brush( RGB(255, 0, 0) );
CClientDC dc( this );
dc.FillRect( CRect( m_ptOrigin, point), &brush );
/** 位图画刷的使用
bitmap.LoadBitmapW( IDB_BITMAP1 );
CBrush brush( &bitmap );
CClientDC dc( this );
dc.FillRect( CRect( m_ptOrigin, point ), &brush );
/** 默认是白色画刷,会覆盖掉先前区域内图行
CClientDC dc( this );
dc.Rectangle( CRect( m_ptOrigin, point ) );
// DC 默认是白色画刷,前边画的图像会把后边的覆盖掉,所以要想办法用透明画刷
/** 使用透明画刷
CClientDC dc( this );
// 创建一个空画刷,FromHandle方法可以将画刷句柄转换成画刷对象
// GetStockObject方法返回的是一个HGDIOBJECT句柄,所以要将其强制类型转化成HBRUSH类型
CBrush* pBrush = CBrush::FromHandle( (HBRUSH)GetStockObject( NULL_BRUSH));
CBrush* pOldBrush = dc.SelectObject( pBrush );
dc.Rectangle( CRect( m_ptOrigin, point ) );
dc.SelectObject( pOldBrush );
阅读(...) 评论()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
没有更多推荐了,在使用vc开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。这通常是通过响应windows的WM_PAINT消息实现的。如果要画的图形比较复杂,或者比较大,那么画图过程可能会造成窗口的闪烁。当窗口调整大小时,这种闪烁由为明显。
解决窗口闪烁问题的有效办法就是使用内存DC,也称为缓冲DC。在内存中准备一个和窗口DC相同属性的DC,在这个内存DC上执行画图操作。完成画图以后,把画图输出的内容整体复制到目标窗口DC上。因为画图操作不在窗口DC上进行,所以在画图的过程中窗口可以保持原来的内容。当画好的内容被复制到窗口DC时,因为复制操作执行的非常快,所以用户感觉窗口仿佛被立刻被画好,从而消除了从旧画面到白板再到新画面的闪烁现象。
生成内存DC主要用到以下四个函数:
CreateCompatibleDC(CDC* pDC )。CDC类的成员函数,用于创建一个和pDC指向的DC兼容的内存DC。
CreateDiscardableBITmap( CDC* pDC, int nWidth, int nHeight)。CBitmap类的成员函数,用于按指定尺寸创建一个和pDC指向的DC兼容的位图。
SelectObject(CBitmap * pBitmap)。CDC类的成员函数,执行以后,所以在该DC上的图像输出都将被画到pBitmap指向的位图上。
BOOL BitBlt (int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop )。CDC类的成员函数,用于从源DC(pSrcDC)复制一个矩形的图象到当前DC中。
对于一个窗口,我们可以用下面的代码来创建内存DC,在内存DC上输出,并最终复制到窗口DC上。
void PaintWnd(CWnd * pWnd)...{
CDC * pWndDC = pWnd-&GetWindowDC();
CRect WndRect = pWnd-&GetWindowRect();
CDC MemDC;
CBitMap MemB
MemDC.CreateCompatibleDC(pWndDC);
利用屏幕DC创建内存DC
MemBitmap.CreateCompatibleBitmap(
利用屏幕DC创建兼容的位图
WndRect.Width(),
WndRect.Height());
MemDC.SelectObject(&MemBitmap);
// 让内存DC输出到位图
// 使用MemDC画图
// 。。。。。。
pWndDC-&BitBlt(
// 从内存DC复制到窗口DC
WndRect.Width(),
WndRect.Height(),
SRCCOPY);}
当然,实际的情况下,我们需要考虑的更多,因为内存DC、位图的创建都可能会失败。为了简化代码,笔者定义了一个类CMemoryDC,包装了内存DC创建过程中的出错处理,内存DC的事后清理等操作,并自动复制内存DC的内容到目标DC上。声明CMemoryDC类的头文件MemoryDC.h如下:
#pragma once#include "Afxwin.h" class CMemoryDC...{public:
CMemoryDC(CDC *dc, RECT * rect,bool autoRender = false);
~CMemoryDC(void);
bool IsOK();
void Render(CDC * p_objectDC = NULL);
CDC* GetMemoryDC();
operator CDC * ();private:
bool m_bAutoR
CRect m_DCR
CDC* m_pOriginalDC;
CDC m_MemoryDC;
CBitmap m_MemoryB};
类的实现文件CMemoryDC.cpp如下:
#include ".MemoryDC.h" CMemoryDC::CMemoryDC(CDC *dc, RECT * rect, bool autoRender)...{
m_bAutoRender = autoR
m_pOriginalDC =
if (dc==NULL || rect==NULL)
if (!m_MemoryDC.CreateCompatibleDC(dc))
m_DCRect.SetRect(rect-&left, rect-&top, rect-&right, rect-&bottom);
if (!m_MemoryBmp.CreateCompatibleBitmap(dc, m_DCRect.Width(), m_DCRect.Height()))
m_MemoryDC.SelectObject(m_MemoryBmp);} CMemoryDC::~CMemoryDC(void)...{
if (m_bAutoRender)
if (m_MemoryDC.m_hDC!=NULL)
m_MemoryDC.DeleteDC();
if (m_MemoryBmp.m_hObject!=NULL)
m_MemoryBmp.DeleteObject();} bool CMemoryDC::IsOK()...{
return m_MemoryDC.m_hDC!=NULL && m_MemoryBmp.m_hObject != NULL; }void CMemoryDC::Render(CDC * p_objectDC)...{
if (!IsOK())
CDC * pDC = (p_objectDC==NULL ? m_pOriginalDC : p_objectDC);
CSize Size = m_MemoryDC.GetViewportExt() ;
pDC-&BitBlt(
m_DCRect.left,
m_DCRect.top,
m_DCRect.Width(),
m_DCRect.Height(),
&m_MemoryDC,
SRCCOPY);}CDC* CMemoryDC::GetMemoryDC()...{
return & m_MemoryDC;}CMemoryDC::operator CDC * ()...{
return & m_MemoryDC;}
使用这个类可以大大简化内存DC的创建操作。如果我们在窗口消息WM_PAINT的响应函数中使用内存DC,只要用如下这样简便的代码便可实现:
CRect RGetClientRect(Rect);CPaintDC dc(this); // device context for painting
CMemoryDC MemDC(&dc, Rect, true);
if (MemDC.IsOK())
// 使用MemDC画窗口}
// MemDC析构时会自动把图像复制到dc,无需其它操作
使用CMemoryDC创建内存DC防止窗口闪烁,编程的代码和不使用内存DC时相比,数量和复杂性几乎没有增加。
关于内存DC
内存DC和屏幕DC
内存DC也有视口和窗口的
mfc 内存dc
MFC 透明内存DC
MFC双缓冲解决闪烁问题
CreateCompatibleDC
创建内存兼容DC
转载自百度经验
CMemoryDC封装类
使用Memory DC
没有更多推荐了,MFC界面的dc怎么清空?
[问题点数:40分,结帖人u]
本版专家分:88
结帖率 93.9%
CSDN今日推荐
本版专家分:118896
2018年5月 VC/MFC大版内专家分月排行榜第一2018年4月 VC/MFC大版内专家分月排行榜第一2018年3月 VC/MFC大版内专家分月排行榜第一2018年2月 VC/MFC大版内专家分月排行榜第一2018年1月 VC/MFC大版内专家分月排行榜第一2017年12月 VC/MFC大版内专家分月排行榜第一2017年11月 VC/MFC大版内专家分月排行榜第一2017年7月 VC/MFC大版内专家分月排行榜第一2012年7月 VC/MFC大版内专家分月排行榜第一
2018年6月 VC/MFC大版内专家分月排行榜第二2017年9月 VC/MFC大版内专家分月排行榜第二2017年8月 VC/MFC大版内专家分月排行榜第二2017年4月 VC/MFC大版内专家分月排行榜第二2017年3月 VC/MFC大版内专家分月排行榜第二2017年2月 VC/MFC大版内专家分月排行榜第二2016年8月 VC/MFC大版内专家分月排行榜第二2016年7月 VC/MFC大版内专家分月排行榜第二2016年6月 VC/MFC大版内专家分月排行榜第二2015年6月 VC/MFC大版内专家分月排行榜第二
2017年10月 VC/MFC大版内专家分月排行榜第三2017年6月 VC/MFC大版内专家分月排行榜第三2017年5月 VC/MFC大版内专家分月排行榜第三2016年9月 VC/MFC大版内专家分月排行榜第三2016年4月 VC/MFC大版内专家分月排行榜第三2015年4月 VC/MFC大版内专家分月排行榜第三2012年8月 VC/MFC大版内专家分月排行榜第三
本版专家分:88
本版专家分:665
本版专家分:162
本版专家分:37420
匿名用户不能发表回复!|
其他相关推荐dc.textout输出的文字如何改变颜色和字体,是不是用CFONT
[问题点数:0分]
本版专家分:1942
结帖率 100%
CSDN今日推荐
本版专家分:14331
本版专家分:43741
2005年9月 荣获微软MVP称号2008年10月 荣获微软MVP称号2007年10月 荣获微软MVP称号2006年10月 荣获微软MVP称号
本版专家分:998
本版专家分:1942
本版专家分:15629
本版专家分:1942
本版专家分:113671
2006年 总版技术专家分年内排行榜第十
2005年8月 总版技术专家分月排行榜第二
2006年6月 VC/MFC大版内专家分月排行榜第一2006年1月 VC/MFC大版内专家分月排行榜第一2005年8月 VC/MFC大版内专家分月排行榜第一
2006年7月 VC/MFC大版内专家分月排行榜第二2006年4月 VC/MFC大版内专家分月排行榜第二2005年11月 VC/MFC大版内专家分月排行榜第二
本版专家分:1415
本版专家分:2526
本版专家分:182
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐}

我要回帖

更多关于 把打印出来的电话号码复制到电脑上 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信