📄 show_windowdcview.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 + -