有一個應用程式,叫sabaki,在win10下,運行它以后,它有一個棋盤視窗,我用
HDC hdc = GetDC(hwnd); 獲取它的視窗dc
再用BitBlt傳送到另一個影像中,再把這個影像顯示出來,結果發現,影像全黑。是空的。
uj5u.com熱心網友回復:
GetDC在非WM_PAINT訊息時使用,在WM_PAINT訊息時,使用BenginPaint獲取DCuj5u.com熱心網友回復:
據說 DC 是 不能 跨 執行緒的 !uj5u.com熱心網友回復:
試試拷貝螢屏,然后截取其中的部分
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79679.html
標籤:基礎類
