一、printwindow黑屏
printwindow可以用於將任意可見窗口或控件的內容輸出至打印機或圖片,它可以實現截取任意窗口的圖像,並進行輸出。有時候在使用printwindow的過程中,窗口截圖有時會出現黑屏問題。造成黑屏的原因有很多,可能是窗口處於隱藏狀態或被其他窗口覆蓋等。解決方法可以使用ShowWindow函數進行顯示窗口,將其放在printwindow之前即可。
HWND hWnd; HDC hDC; hWnd=FindWindwow(NULL,"title of window"); hDC=GetWindowDC(hWnd); ShowWindow(hWnd,SW_SHOW); PrintWindow(hWnd,hDC,0); BitBlt(hDCMemory,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),hDC,0,0,SRCCOPY);
二、printwindow 截取範圍
printwindow默認情況下會截取整個窗口的圖像,但是有時我們需要指定截取範圍,那麼我們可以使用GetWindowRect獲取窗口區域,並在PrintWindow中指定截取的區域。
HWND hWnd; HDC hDC; hWnd=FindWindow(NULL,"title of window"); hDC=GetWindowDC(hWnd); RECT rect; GetWindowRect(hWnd,&rect); PrintWindow(hWnd,hDC,PW_RENDERFULLCONTENT|PW_CLIENTONLY|PW_RENDERVINTAGECONTENT|PW_RENDERWINDOW);
三、printwindow抓屏
printwindow還可以用於抓取桌面或整個屏幕的圖像,只需要將桌面窗口或屏幕窗口句柄傳入即可。
HDC hDC; hDC=GetDC(NULL); PrintWindow(NULL,hDC,PW_RENDERFULLCONTENT|PW_CLIENTONLY|PW_RENDERVINTAGECONTENT|PW_RENDERWINDOW);
四、printwindow函數
關於printwindow的用法,需要了解以下幾個函數:
PrintWindow():可以把一個窗口的內容畫到某個DC上。
CreateDC():可以創建一個設備上下文環境。
DeleteDC():可以釋放由CreateDC()函數創建的設備上下文環境。
CreateCompatibleBitmap():可以創建一個和某個已經存在的bitmap兼容的bitmap。
BitBlt():可以把一個dc上的圖形複製到另一個dc上。
五、printwindow 閃爍
printwindow在截取部分窗口內容時可能會導致閃爍的出現,出現閃爍的原因是由於窗口重繪和內存刷新頻繁地進行。解決方法就是使用雙緩衝技術,將內容先畫到一個內存中的DC上,再將內存DC上的圖像複製到要輸出到顯示器上的DC中。
HDC hdc_window, hdc_memory; RECT rect; HBITMAP hbm; hdc_window=GetWindowDC(hwnd); GetClientRect(hwnd,&rect); hdc_memory=CreateCompatibleDC(hdc_window); hbm=CreateCompatibleBitmap(hdc_window,rect.right,rect.bottom); SelectObject(hdc_memory,hbm); PrintWindow(hwnd,hdc_memory,PW_CLIENTONLY); BitBlt(hdc_window,0,0,rect.right,rect.bottom,hdc_memory,0,0,SRCCOPY); DeleteDC(hdc_memory); ReleaseDC(hwnd,hdc_window);
六、printwindow 桌面
除了截取指定窗口的圖像,printwindow還可以用於截取整個桌面或者指定屏幕範圍內的圖像。這裡需要注意的是,使用printwindow截取桌面圖片時需要先獲取桌面窗口句柄,再進行截取。
HWND hwnd; HDC hdc,hdcMem; HBITMAP hbitmap; hwnd=GetDesktopWindow(); hdc=GetWindowDC(hwnd); hdcMem=CreateCompatibleDC(hdc); hbitmap=CreateCompatibleBitmap(hdc,1024,768); SelectObject(hdcMem,hbitmap); PrintWindow(hwnd,hdcMem,0);
七、printwindow黑色邊框
在使用printwindow進行截圖時,有時會出現截圖的圖片有一定的黑邊,這是由於窗口有邊框的原因,可以使用GetClientRect()函數獲取窗口客戶區域,從而去掉黑邊。
HWND hwnd; HDC hdc,hdcMem; HBITMAP hbitmap; RECT rect; GetClientRect(hwnd,&rect); hdc=GetWindowDC(hwnd); hdcMem=CreateCompatibleDC(hdc); hbitmap=CreateCompatibleBitmap(hdc,rect.right,rect.bottom); SelectObject(hdcMem,hbitmap); PrintWindow(hwnd,hdcMem,0);
八、printwindow和bitblt的區別
printwindow和bitblt都是用於窗口截圖和輸出的函數,它們之間的主要區別在於,bitblt只能將截圖輸出至指定位置,而printwindow可以將截圖輸出至打印機或圖像文件,從而擴展了其應用場景。
HDC hdc_window,hdc_memory; RECT rect; hdc_window=GetWindowDC(hwnd); GetClientRect(hwnd,&rect); hdc_memory=CreateCompatibleDC(hdc_window); HBITMAP bitmap=CreateCompatibleBitmap(hdc_window,rect.right,rect.bottom); SelectObject(hdc_memory,bitmap); BitBlt(hdc_memory,0,0,rect.right,rect.bottom,hdc_window,0,0,SRCCOPY); DeleteObject(bitmap); ReleaseDC(hwnd,hdc_window); DeleteDC(hdc_memory);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/303694.html