亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

VC++基于Dx實現的截圖程序示例代碼

2020-01-26 15:26:37
字體:
來源:轉載
供稿:網友

本文所述的程序示例為VC++圖象特效的截圖示例,需要DirectX 3.0以上版,代碼中的GetScreen函數是本截圖程序的關鍵。運行這個程序可用Esc鍵結束。代碼中需要ddutil.h與ddutil.cpp文件,請自行下載添加。關于InitDDraw()函數,功能是初始化DirectDraw環境,創建換頁鏈(主頁面,一個后臺緩沖區),以及創建一個定時器。

具體的功能代碼如下:

#include <windows.h>#include <windowsx.h>#include <stdio.h>#include <ddraw.h>#include <math.h>#include "ddutil.h"#define TITLE "截圖示例" //窗口標題#define CLASSNAME "GetScreen" //窗口類名#define COLORS 16HINSTANCE hInst; //應用程序實例句柄HWND hWndMain; //主窗口句柄LPDIRECTDRAW      lpDD;      // DirectDraw對象LPDIRECTDRAWSURFACE   lpDDSPrimary;  // 主頁面LPDIRECTDRAWSURFACE   lpDDSBack;   // 后臺緩沖區LPDIRECTDRAWSURFACE   lpDDSPic1;   // 離屏頁面1LPDIRECTDRAWPALETTE   lpDDPal;    // 調色板BOOL          bActive;    // 應用程序是否活躍?HBITMAP hbm;RECT rect;//函數聲明void FreeObjects( void );BOOL InitDDraw(void);BOOL InitSurfaces(void);void UpdateFrame(void);void MakeRect(RECT *rect, long left, long top, long right, long bottom);///////////////////////////////////////////////// 截圖函數,是本程序的關鍵// 函數名:GetScreen// 參數:指向屏幕矩形的指針// 返值:Bitmap設備//////////////////////////////////////////////HANDLE GetScreen(LPRECT lpRect){ //定義屏幕的DC和內存DC HDC hScrDC,hMemDC; //定義Bitmap設備 HANDLE hBitmap,hOldBitmap; //定義屏幕坐標變量 unsigned int nX,nY,nX2,nY2; unsigned int nWidth,nHeight; //定義屏幕分辯率變量 unsigned int xScrn,yScrn; //確保屏幕矩形不為空 if(IsRectEmpty(lpRect)) return NULL; //創建屏幕的DC hScrDC=CreateDC("DISPLAY",NULL,NULL,NULL); //創建的內存DC hMemDC=CreateCompatibleDC(hScrDC); //將屏幕矩形坐標付給坐標變量 nX=lpRect->left; nY=lpRect->top ; nX2=lpRect->right ; nY2=lpRect->bottom ; //獲得屏幕分辯率 xScrn=GetDeviceCaps(hScrDC,HORZRES); yScrn=GetDeviceCaps(hScrDC,VERTRES); if(nX<0) nX=0; if(nY<0) nY=0; if(nX2>xScrn) nX2=xScrn; if(nY2>yScrn) nY2=yScrn; //獲得屏幕寬度與長度 nWidth=nX2-nX; nHeight=nY2-nY; //獲得屏幕圖像并付給一個Bitmap設備 hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight); hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY); hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap); //清除設備 DeleteDC(hScrDC); DeleteDC(hMemDC); return hBitmap;}//*******************************************************************//函數:FreeObject//功能:釋放所有DirectDraw對象//*******************************************************************void FreeObjects( void ){ //釋放hbm位圖對象  DeleteObject(hbm);  if( lpDD != NULL )//釋放DirectDraw對象  {    if( lpDDSPrimary != NULL )//釋放主頁面    {      lpDDSPrimary->Release();      lpDDSPrimary = NULL;    }    if( lpDDSPic1 != NULL )//釋放離屏頁面1    {      lpDDSPic1->Release();      lpDDSPic1 = NULL;    }    if( lpDDPal != NULL )//釋放調色板    {      lpDDPal->Release();      lpDDPal = NULL;    }    lpDD->Release();    lpDD = NULL;  }} //*******************************************************************//函數:RestoreAll//功能:頁面丟失后,恢復頁面內存//*******************************************************************HRESULT RestoreAll( void ){  HRESULT   ddrval; //恢復主頁面,這也將恢復換頁鏈中的所有頁面  ddrval = lpDDSPrimary->Restore(); //恢復離屏頁面  ddrval = lpDDSPic1->Restore(); //重新繪制頁面圖象 InitSurfaces();  return ddrval;}//*******************************************************************//函數:WindowProc//功能:主窗口的消息處理過程//*******************************************************************LRESULT CALLBACK WinProc( HWND hWnd, UINT message,               WPARAM wParam, LPARAM lParam ){  switch( message )  {  case WM_SETCURSOR: SetCursor(LoadCursor( NULL, IDC_ARROW )); return TRUE;  case WM_ACTIVATEAPP://應用程序激活消息    bActive = wParam;    break;  case WM_KEYDOWN://擊鍵消息    switch( wParam )    {    case VK_ESCAPE:      PostMessage(hWnd, WM_CLOSE, 0, 0);      break; }    break;  case WM_DESTROY://銷毀窗口消息    FreeObjects();    PostQuitMessage(0);    break;  } //調用缺省的過程處理過程  return DefWindowProc(hWnd, message, wParam, lParam);}//******************************************************************//函數:InitWindow()//功能:創建主窗口。//******************************************************************BOOL InitWindow( HINSTANCE hInstance, int nCmdShow ){  WNDCLASS wc; //窗口類結構 //填充窗口類結構  wc.style = 0;  wc.lpfnWndProc = WinProc;  wc.cbClsExtra = 0;  wc.cbWndExtra = 0;  wc.hInstance = hInstance;  wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );  wc.hCursor = LoadCursor( NULL, IDC_ARROW );  wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//選擇黑色刷做為窗口背景  wc.lpszMenuName = NULL; wc.lpszClassName = CLASSNAME; //注冊窗口類  RegisterClass( &wc ); //創建主窗口  hWndMain= CreateWindowEx( 0, CLASSNAME, //窗口的類名稱,必須與上面的wc.lpszClassName一致 TITLE, //窗口的標題名 WS_POPUP, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ), NULL, NULL, hInstance, NULL );  if( !hWndMain )  return FALSE; //顯示并更新窗口  ShowWindow( hWndMain, nCmdShow ); return TRUE;}//******************************************************************//函數:InitDDraw()//功能:初始化DirectDraw環境,創建換頁鏈(主頁面,一個后臺緩沖區)// 以及創建一個定時器。//******************************************************************BOOL InitDDraw(void){  DDSURFACEDESC    ddsd;  DDSCAPS       ddscaps;  HRESULT       ddrval;  //創建DirectDraw對象 ddrval = DirectDrawCreate( NULL, &lpDD, NULL );  if( ddrval != DD_OK )    return FALSE;  //取得全屏獨占模式  ddrval = lpDD->SetCooperativeLevel( hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );  if( ddrval != DD_OK )    return FALSE;  //設置顯示器顯示模式為當前屏幕的分辯率,16位增強顯示模式  ddrval = lpDD->SetDisplayMode(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), COLORS);  if( ddrval != DD_OK )    return FALSE;  //填充換頁鏈結構  ddsd.dwSize = sizeof( ddsd );  ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;  ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |             DDSCAPS_FLIP |             DDSCAPS_COMPLEX; //后臺緩沖區數量為2  ddsd.dwBackBufferCount = 2; //創建換頁鏈,包括了主頁面及其后臺緩沖區  ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );  if( ddrval != DD_OK )    return FALSE;  //獲得指向后臺緩沖區的頁面指針 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;  ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);  if( ddrval != DD_OK )    return FALSE; //創建離屏頁面 ZeroMemory(&ddsd, sizeof(ddsd));  ddsd.dwSize = sizeof(ddsd);  ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;  ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;  ddsd.dwWidth =GetSystemMetrics(SM_CXSCREEN);  ddsd.dwHeight = GetSystemMetrics(SM_CYSCREEN);  if (lpDD->CreateSurface(&ddsd, &lpDDSPic1, NULL) != DD_OK) return FALSE; //調用頁面初始化函數 if( !InitSurfaces() )    return FALSE;  return TRUE;}//******************************************************************//函數:WinMain()//功能:應用程序入口//******************************************************************int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow){  MSG  msg; hInst=hInstance; //獲得屏幕分辯率 rect.left=rect.top=0; rect.right=GetSystemMetrics(SM_CXSCREEN); rect.bottom=GetSystemMetrics(SM_CYSCREEN); //調用截屏函數 hbm=(HBITMAP)GetScreen(&rect); //初始化主窗口 if (!InitWindow( hInstance, nCmdShow))  return FALSE; //初始化DirectDraw環境 if (!InitDDraw()) { MessageBox(hWndMain, "初始化DirectDraw過程中出錯!", "Error", MB_OK); FreeObjects(); DestroyWindow(hWndMain); return FALSE; } //進入消息循環 while(1) { if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {  if(!GetMessage(&msg, NULL, 0, 0 ))  return msg.wParam;  TranslateMessage(&msg);   DispatchMessage(&msg); } else if(bActive) {  UpdateFrame(); } else WaitMessage(); }  return msg.wParam;} //******************************************************************//函數:InitSurfaces()//功能:初始化頁面圖象//******************************************************************BOOL InitSurfaces( void ){ if (hbm == NULL) return FALSE; DDCopyBitmap(lpDDSPic1, hbm, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));  return TRUE;}//更新屏幕void UpdateFrame( void ){ HRESULT ddrval; //清屏后臺緩沖區 DDBLTFX ddBltFx; ddBltFx.dwSize = sizeof(DDBLTFX); ddBltFx.dwFillColor = DDColorMatch(lpDDSBack, RGB(0,0,0)); lpDDSBack->Blt(NULL, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &ddBltFx); //調用灰度的實現函數 RECT srect, drect; MakeRect(&srect, 0, 0, rect.right ,rect.bottom); MakeRect(&drect, 0, 0, rect.right , rect.bottom); //將背景圖象Blit到后臺緩沖區 lpDDSBack->Blt(&drect, lpDDSPic1, &srect, DDBLT_WAIT, NULL);  // 換頁  while( 1 )  {    ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT );//調用換頁函數    if( ddrval == DD_OK )//成功則退出while循環      break;    else if( ddrval == DDERR_SURFACELOST )//如果頁面丟失,則恢復頁面,再繼續while循環      RestoreAll();    else  break; }}void MakeRect(RECT *rect, long left, long top, long right, long bottom){ rect->left=left; rect->top=top; rect->right=right; rect->bottom=bottom;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费人成在线视频观看| 欧美一区二粉嫩精品国产一线天| 韩国日本不卡在线| 欧美国产第一页| 欧美亚洲另类在线| 日韩有码在线电影| 亚洲a级在线播放观看| 久久天天躁夜夜躁狠狠躁2022| 色综合五月天导航| 色婷婷综合久久久久中文字幕1| 成人精品福利视频| 亚洲欧美在线免费| 久久精品国产免费观看| 国产在线精品成人一区二区三区| 欧美色道久久88综合亚洲精品| 清纯唯美日韩制服另类| 97色在线视频| 国产亚洲一级高清| 久久精品视频亚洲| 庆余年2免费日韩剧观看大牛| 久久亚洲精品一区| 亚洲国产三级网| 亚洲国产中文字幕在线观看| 亚洲欧美在线磁力| 97视频在线播放| 欧美在线观看网址综合| 欧美精品成人在线| 日韩欧美在线看| 午夜欧美大片免费观看| 亚洲色图偷窥自拍| 精品国内产的精品视频在线观看| 欧美日韩精品在线播放| 国产精品爱啪在线线免费观看| 国产一区二区三区日韩欧美| 精品国偷自产在线| 国产亚洲日本欧美韩国| 91精品国产高清| 久久久久久亚洲精品中文字幕| 亚洲精品xxxx| 久久天天躁狠狠躁夜夜躁2014| 亚洲精品国精品久久99热| 国产日韩在线看片| 51ⅴ精品国产91久久久久久| 成人h猎奇视频网站| 国产精品久久久久久久app| 亚洲一区二区三区视频播放| 久久久久九九九九| 色七七影院综合| 一本色道久久综合狠狠躁篇的优点| 亚洲国产一区二区三区四区| 精品国产一区二区三区久久久| 福利一区福利二区微拍刺激| 精品magnet| 国产精品亚洲片夜色在线| 欧美精品在线视频观看| 亚洲第一区在线观看| 欧美亚洲日本网站| 中国日韩欧美久久久久久久久| 国产精品1234| 久久免费国产视频| 亚洲va国产va天堂va久久| 欧美色视频日本高清在线观看| 国产精品三级久久久久久电影| 欧美日韩国产专区| 欧美精品九九久久| 色多多国产成人永久免费网站| 成人性教育视频在线观看| 欧美大尺度电影在线观看| 91在线免费观看网站| 色av吧综合网| 国产成人av网址| 欧美福利视频网站| 亚洲精品国产精品国产自| 91精品国产成人| 亚洲黄页网在线观看| 色婷婷久久av| 日韩av电影在线免费播放| 国产精品999999| 欧美黄色小视频| 亚洲乱码国产乱码精品精天堂| 欧美视频精品一区| 国产主播精品在线| 成人免费观看网址| 97人洗澡人人免费公开视频碰碰碰| 亚洲国产91精品在线观看| 亚洲天堂成人在线视频| 91老司机在线| 欧美一区二区三区免费观看| 91国产美女在线观看| 亚洲精品国偷自产在线99热| 欧美电影免费在线观看| 中文字幕一区二区三区电影| 岛国av一区二区| 综合网中文字幕| 中文字幕久久久| 亚洲国产小视频在线观看| 一区二区三区久久精品| 日韩精品极品在线观看播放免费视频| 欧美精品在线视频观看| 国产精品a久久久久久| 三级精品视频久久久久| 欧美日韩高清在线观看| 在线观看日韩专区| 欧美成人精品在线播放| 日韩中文字幕免费看| 国内精品国产三级国产在线专| 欧美大片免费观看在线观看网站推荐| 欧美日韩国产成人高清视频| 国产精品9999| 久久久人成影片一区二区三区| 在线亚洲午夜片av大片| 久久精品视频中文字幕| 国产精品视频免费在线| 国产激情久久久| 一道本无吗dⅴd在线播放一区| 日韩欧美在线观看| 欧美黑人性猛交| 亚洲香蕉伊综合在人在线视看| xxxxxxxxx欧美| 欧美午夜宅男影院在线观看| 美女啪啪无遮挡免费久久网站| www.久久撸.com| 国产精品香蕉国产| 97精品免费视频| 国产亚洲a∨片在线观看| 91精品在线国产| 国产在线视频2019最新视频| 亚洲精品久久久久中文字幕二区| 欧美老妇交乱视频| 欧美极品美女电影一区| 狠狠色狠狠色综合日日小说| 欧美日韩福利在线观看| 久久久久久久久久久91| 日韩精品在线看| 91在线观看免费网站| 91成品人片a无限观看| 亚洲一区二区三区毛片| 一区二区欧美亚洲| 日韩精品极品视频| 91精品在线国产| 欧美性猛交xxxxx免费看| 91国偷自产一区二区三区的观看方式| 日韩一区二区在线视频| 日本成人激情视频| 欧美亚洲激情在线| 日韩电影免费观看在线| 久久电影一区二区| 日韩黄色在线免费观看| 欧美精品videos性欧美| 91免费的视频在线播放| 国产精品主播视频| 中文字幕精品www乱入免费视频| 亚洲美腿欧美激情另类| 久久99久久99精品免观看粉嫩| 一本色道久久88亚洲综合88| 96pao国产成视频永久免费| 欧美日韩亚洲91| 久久视频在线视频| 亚洲欧洲一区二区三区在线观看| 68精品国产免费久久久久久婷婷| 一区二区三区视频免费在线观看| 国产精品jizz在线观看麻豆| 久久久久久中文| 好吊成人免视频|