⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 show_windowdcview.cpp

📁 VC编程动态截获并显示窗口DC 实例代码
💻 CPP
字号:
// Show_WindowDCView.cpp : implementation of the CShow_WindowDCView class
//

#include "stdafx.h"
#include "Show_WindowDC.h"

#include "Show_WindowDCDoc.h"
#include "Show_WindowDCView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CShow_WindowDCView

IMPLEMENT_DYNCREATE(CShow_WindowDCView, CView)

BEGIN_MESSAGE_MAP(CShow_WindowDCView, CView)
	//{{AFX_MSG_MAP(CShow_WindowDCView)
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShow_WindowDCView construction/destruction

CShow_WindowDCView::CShow_WindowDCView()
{
	// TODO: add construction code here
    m_bIsTimerOn=TRUE;
}

CShow_WindowDCView::~CShow_WindowDCView()
{
}

BOOL CShow_WindowDCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CShow_WindowDCView drawing

void CShow_WindowDCView::OnDraw(CDC* pDC)
{
	CShow_WindowDCDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(!m_bIsTimerOn) return;

	CWnd *source=FindWindow("GeminiWindowClass",NULL);//搜索窗口
	BOOL rst=Show_WindowDC(this,source);
	if(!rst)
	{
		KillTimer(1);
		m_bIsTimerOn=FALSE;

	}
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CShow_WindowDCView printing

BOOL CShow_WindowDCView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CShow_WindowDCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CShow_WindowDCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CShow_WindowDCView diagnostics

#ifdef _DEBUG
void CShow_WindowDCView::AssertValid() const
{
	CView::AssertValid();
}

void CShow_WindowDCView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CShow_WindowDCDoc* CShow_WindowDCView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShow_WindowDCDoc)));
	return (CShow_WindowDCDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CShow_WindowDCView message handlers

BOOL CShow_WindowDCView::Show_WindowDC(CWnd *pWndDest,CWnd *pWndSrc)
{
	//定义图形大小
    if(pWndDest==NULL || pWndSrc==NULL)		return FALSE;

	CRect SrcRect;
    pWndSrc->GetWindowRect(&SrcRect);
	HDC       hSrcDC, hMemDC;      	// 内存设备描述表	
	HBITMAP    hBitmap, hOldBitmap;   		// 位图句柄	  	

	int    nWidth, nHeight;      	// 位图宽度和高度
	pWndSrc->Invalidate();
	hSrcDC=pWndSrc->GetDC()->m_hDC;
	hMemDC = CreateCompatibleDC(hSrcDC);	
	nWidth = SrcRect.Width();	
	nHeight = SrcRect.Height();		
	hBitmap = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight);	// 创建一个与源窗口设备描述表兼容的位图
	
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);// 把新位图选到内存设备描述表中
	BitBlt(hMemDC, 0, 0, nWidth, nHeight,hSrcDC, 0, 0, SRCCOPY);	// 把屏幕设备描述表拷贝到内存设备描述表中	
	hBitmap =  (HBITMAP)SelectObject(hMemDC, hOldBitmap);//得到位图的句柄
	CRect DestRect;
	GetWindowRect(&DestRect);

	CDC dcMem;
	dcMem.CreateCompatibleDC(GetDC());//创建一个与目标窗口设备描述表兼容的位图
    HBITMAP poldBitmap=(HBITMAP)SelectObject(dcMem.m_hDC,hBitmap);
    GetDC()->StretchBlt(0,0 ,DestRect.Width(),DestRect.Height(),&dcMem,0 ,0,nWidth,nHeight,SRCCOPY);//显示位图

	//善后工作	
	DeleteDC(hSrcDC);
	DeleteDC(hMemDC);
	dcMem.SelectObject(poldBitmap); 
    dcMem.DeleteDC();
    return TRUE;
	
}

void CShow_WindowDCView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	Invalidate();
	CView::OnTimer(nIDEvent);
}

void CShow_WindowDCView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	SetTimer(1,100,NULL);
	
}

void CShow_WindowDCView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here
	if(m_bIsTimerOn)
		KillTimer(1);
}

BOOL CShow_WindowDCView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return TRUE;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -