中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++開發截屏小程序功能的方法

發布時間:2020-08-04 13:45:52 來源:億速云 閱讀:233 作者:小豬 欄目:編程語言

這篇文章主要講解了C++開發截屏小程序功能的方法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

C++開發截屏小程序,Win32程序,可以顯示截屏區域并保存。

上次的流星雨屏幕程序就簡單涉及到GDI繪圖了,這次簡單介紹幾個API函數,涉及到GDI的。

C++開發截屏小程序功能的方法

GetDC,獲取當前創建的窗口的設備環境。
CreateDC,獲取當前屏幕的設備環境。
CreateCompatibleDC,創建一個兼容性的設備環境(相當于一個虛擬的設備環境)
BitBlt,這個函數,相當于拷貝,將一個環境的設備內容拷貝到另一個設備中。
CreateCompatibleBitmap,創建一塊畫布,將其放在兼容性的DC里面,這樣就可以在里面畫圖了,當然還要放入畫筆和畫刷這些。

介紹完這些函數之后,那么設計思路就來了:

1.首先當然還是定義并創建窗口,還有消息循環。

ATOM MyRegisterClass(HINSTANCE hInstance)
{
 WNDCLASSEX wcex;
 
 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
 wcex.lpfnWndProc = WndProc;
 wcex.cbClsExtra = 0;
 wcex.cbWndExtra = 0;
 wcex.hInstance = hInstance;
 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDC_CAPTURESCREEN));
 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(BLACK_BRUSH);
 wcex.lpszMenuName = NULL;
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

 return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{

 hInst = hInstance; // 將實例句柄存儲在全局變量中
 //創建自己的窗口
 hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,
 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

 if (!hWnd)
 {
 return FALSE;
 }
 //顯示和更新窗口
 ShowWindow(hWnd, SW_MAXIMIZE);
 UpdateWindow(hWnd);

 return TRUE;
}

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
 _In_opt_ HINSTANCE hPrevInstance,
 _In_ LPTSTR lpCmdLine,
 _In_ int  nCmdShow)
{
 //playsound只能播放wav格式,而mcisendstring可以播放任意格式的。
 
 //PlaySound("yixi.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
 mciSendString("open ./abc.mp3 alias bk",
 0, 0, 0);
 mciSendString("play bk repeat", 0, 0, 0);

 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);

 // TODO: 在此放置代碼。
 MSG msg;
 HACCEL hAccelTable;

 // 初始化全局字符串
 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadString(hInstance, IDC_CAPTURESCREEN, szWindowClass, MAX_LOADSTRING);
 
 MyRegisterClass(hInstance); //注冊類

 // 執行應用程序初始化: 
 if (!InitInstance(hInstance, nCmdShow)) //初始化窗口
 {

 return FALSE;
 }

 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CAPTURESCREEN));

 // 主消息循環: 
 while (GetMessage(&msg, NULL, 0, 0))
 {
 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 }
 return (int)msg.wParam;
}

2.之后獲取當前屏幕的設備環境,

3.然后將它保存到兼容性的DC中,這就相當于將當前屏幕圖片放到一個緩沖區中。在WM_CREATE消息里面做這個動作。

void ScreenDisplay()
{
 HDC disDc = ::CreateDC("DISPLAY", NULL, NULL, NULL);
 g_memDC = ::CreateCompatibleDC(disDc);
 g_ScreenW = GetDeviceCaps(disDc, HORZRES);
 g_ScreenH = GetDeviceCaps(disDc, VERTRES);
 HBITMAP hbitmap = CreateCompatibleBitmap(disDc, g_ScreenW, g_ScreenH);
 SelectObject(g_memDC, hbitmap);
 BitBlt(g_memDC, 0, 0, g_ScreenW, g_ScreenH, disDc, 0, 0, SRCCOPY);
}

4.接著再將它放到我們創建的窗口中,這時就會看到整個桌面就不動了,就呈現的是一張圖片,

5.之后我們就可以在這張圖片上繪制我們想截取的區域。

6.呈現的是靜止的圖片,如果繪制之后,需要更新,這就用到一個函數InvalidateRgn,會無效選定的區域,這樣會觸發消息WM_PAINT,所以在這個消息里面將重新繪制圖形,然后顯示即可。

case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
 // TODO: 在此添加任意繪圖代碼...
 SelectObject(hdc, hpen);
 SelectObject(hdc, hBrush);
 BitBlt(hdc, 0, 0, g_ScreenW, g_ScreenH, g_memDC, 0, 0, SRCCOPY);
 Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
 EndPaint(hWnd, &ps);
break;

接下來就是繪制想要區域的操作,需要用到的幾個鼠標的消息函數,鼠標按下,鼠標彈起,鼠標移動,鼠標雙擊。
那么思路來了:

鼠標按下,確定左上角的點,然后鼠標移動繪制矩形區域,然后鼠標彈起,確定右下角的點,這樣矩形區域繪制完成。

case WM_LBUTTONDOWN:
{
  if (!Iselect)
  {
   POINT pt;
   GetCursorPos(&pt);
   rect.left = pt.x;
   rect.top = pt.y;
   rect.right = pt.x;
   rect.bottom = pt.x;
   InvalidateRgn(hWnd, 0, FALSE);
   Isdowmn = TRUE;
  }


}
 break;
case WM_LBUTTONUP:
{
  if (Isdowmn == TRUE&&!Iselect)
  {
  POINT pt;
  GetCursorPos(&pt);
  rect.right = pt.x;
  rect.bottom = pt.y;
  InvalidateRgn(hWnd, 0, FALSE);
  Isdowmn = FALSE;
  Iselect = TRUE;
  }
}
 break;
case WM_MOUSEMOVE:
{
  if (Isdowmn == TRUE&&!Iselect)
  {
  POINT pt;
  GetCursorPos(&pt);
  rect.right = pt.x;
  rect.bottom = pt.y;
  InvalidateRgn(hWnd, 0, FALSE);
  }
}
 break;

最后鼠標雙擊將截取到的圖片保存剪切板,這樣就完成了屏幕截取。

case WM_LBUTTONDBLCLK:
 if (Iselect == TRUE)
 {
 int iNum = MessageBox(hWnd, "截圖成功!", "張一西", MB_OKCANCEL | MB_ICONINFORMATION);
 if (iNum == 1)
 {
  CopyToCliboard();
  Iselect = FALSE;
  PostQuitMessage(0);
 }
 else
 {
  Iselect = FALSE;
 }
 }
 break;
void CopyToCliboard()
{
 HDC hScreenDC = ::CreateDC("DISPLAY", 0, 0, 0);
 HDC memDC = ::CreateCompatibleDC(hScreenDC);
 int Width = rect.right - rect.left-2;
 int Height = rect.bottom - rect.top-2;
 HBITMAP hBmap = CreateCompatibleBitmap(hScreenDC, Width, Height);
 HBITMAP hOldBmap = (HBITMAP)SelectObject(memDC, hBmap);
 BitBlt(memDC, 0, 0, Width, Height, hScreenDC, rect.left+1, rect.top+1, SRCCOPY);
 HBITMAP hNewBmap = (HBITMAP)SelectObject(memDC, hOldBmap);
 if (OpenClipboard(0))      //打開粘貼板
 {
 EmptyClipboard();      //清空粘貼板
 SetClipboardData(CF_BITMAP, hNewBmap); //把圖片放入粘貼板
 CloseClipboard();      //關閉粘貼板
 }
}

看完上述內容,是不是對C++開發截屏小程序功能的方法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临西县| 积石山| 临漳县| 栾川县| 东丽区| 台北县| 郴州市| 马边| 罗山县| 怀柔区| 蒙自县| 延吉市| 大同县| 安远县| 三原县| 琼中| 兴安盟| 金寨县| 新泰市| 县级市| 化隆| 大悟县| 德庆县| 普宁市| 昭平县| 盐城市| 永济市| 墨竹工卡县| 宁安市| 九龙城区| 文昌市| 木兰县| 潼南县| 旌德县| 万山特区| 屯昌县| 额尔古纳市| 延边| 建阳市| 渭南市| 榆社县|