16,472
社区成员
发帖
与我相关
我的任务
分享
BOOL CopyWnd(HWND hSrcWnd, HWND hDstWnd, BOOL bClientOnly)
{
BOOL bRet = FALSE;
HWND hDeskTop = NULL;
HDC hSrcDC = NULL;
HDC hMemDC = NULL;
HBITMAP hMemBmp = NULL;
HGDIOBJ hOldBmp = NULL;
HDC hDstDC = NULL;
do
{
hDeskTop = GetDesktopWindow(); //获取桌面句柄
//检测句柄有效性
if(!(hDeskTop
&& (hSrcWnd == NULL || IsWindow(hSrcWnd))
&& IsWindow(hDstWnd)
&& 1))
{
bRet = -1;
break;
}
//桌面DC
hSrcDC = GetDC(hDeskTop);
//Get Widht & Height
int nWidth = GetDeviceCaps(hSrcDC, HORZRES);
int nHeight = GetDeviceCaps(hSrcDC, VERTRES);
//创建内存DC
hMemDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
if(hMemDC == NULL)
{
bRet = -2;
break;
}
//创建内存位图
hMemBmp = CreateBitmap(nWidth, nHeight, 1, 32, NULL);
if(hMemBmp == NULL)
{
bRet = -3;
break;
}
//选入内存位图
hOldBmp = SelectObject(hMemDC, hMemBmp);
/*
if(! PrintWindow(hSrcWnd, hMemDC, 0))
{
bRet = -4;
break;
}
*/
//拷贝桌面DC
if(!BitBlt(hSrcDC, 0, 0, nWidth, nHeight, hMemDC, 0, 0, SRCCOPY))
{
bRet = -4;
break;
}
//获取贴图区域坐标
RECT rcSrc, rcDst;
if(hSrcWnd == NULL) //空时默认为整个屏幕
{
rcSrc.left = rcSrc.top = 0;
rcSrc.right = nWidth, rcSrc.bottom = nHeight;
}
else if(bClientOnly)
{
GetClientRect(hSrcWnd, &rcSrc);
POINT lt = { rcSrc.left, rcSrc.top};
POINT rb = { rcSrc.right, rcSrc.bottom};
ClientToScreen(hSrcWnd, <);
ClientToScreen(hSrcWnd, &rb);
rcSrc.left = lt.x, rcSrc.top = lt.y;
rcSrc.right = rb.x, rcSrc.bottom = rb.y;
}
else
{
GetWindowRect(hSrcWnd, &rcSrc);
}
GetClientRect(hDstWnd, &rcDst);
hDstDC = GetDC(hDstWnd);
if(hDstDC == NULL)
{
bRet = -5;
break;
}
//设置缩放半色调
int nOldMode = SetStretchBltMode(hDstDC, HALFTONE);
//缩放贴图
StretchBlt(hDstDC,
0, 0, rcDst.right-rcDst.left, rcDst.bottom-rcDst.top,
hMemDC,
rcSrc.left, rcSrc.top, rcSrc.right-rcSrc.left, rcSrc.bottom-rcSrc.top,
SRCCOPY);
//恢复缩放模式
SetStretchBltMode(hDstDC, nOldMode);
bRet = TRUE;
}while(0);
//结束清理
if(hDstWnd && hDstDC)
{
ReleaseDC(hDstWnd, hDstDC);
hDstDC = NULL;
}
if(hMemDC && hOldBmp)
{
SelectObject(hMemDC, hOldBmp);
}
if(hMemBmp)
{
DeleteObject(hMemBmp);
hMemBmp = NULL;
}
if(hMemDC)
{
DeleteDC(hMemDC);
hMemDC = NULL;
}
if(hDeskTop && hSrcDC)
{
ReleaseDC(hDeskTop, hSrcDC);
hSrcDC = NULL;
}
return bRet;
}
void CDlg1Dlg::OnButton1()
{
CString szHwnd;
GetDlgItemText(IDC_EDIT1, szHwnd);
HWND hSrcWnd = (HWND)_ttoi64(szHwnd); //窗口句柄
CopyWnd(hSrcWnd, GetDlgItem(IDC_STATIC1)->m_hWnd, 0);
}