VC怎么截图啊?用到哪几个函数?

时间:2022-03-16 08:32:38
VC怎么截图啊?用到哪几个函数?
我想截取屏幕上某个位置的图像,保存到内存中,然后画到界面,但不知道用哪函数可以完成,小弟对这方面不是很了解。
还有,怎么比较两张图是否相同?哪里不同?听说要用到GetPiex函数 好像。然后取点逐一比较,但是这样效率太低了,如果遇到大一点的图更是如此,还有没有更好的方法呢?

12 个解决方案

#1


以下的保存一个截图的,你参考使用吧
#include "stdafx.h" 

#include <windows.h> 
#include <atlimage.h> 

int __stdcall WinMain( 
            HINSTANCE hInstance, 
            HINSTANCE hPrevInstance, 
            LPSTR lpCmdLine, 
            int nShowCmd) 

    HWND hwnd = ::GetDesktopWindow(); 
    HDC hDC = ::GetDC(hwnd); //根据窗口来确定截图的大概位置

    RECT rect; 
    ::GetClientRect(hwnd, &rect); 
    HDC hDCMem = ::CreateCompatibleDC(hDC); 

    HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom); 
    HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap); 

    ::BitBlt(hDCMem, 0, 0,  rect.right, rect.bottom, hDC,  0, 0, SRCCOPY); //红色部分确定图片的大小位置

    CImage image; 
    image.Attach(hBitMap); 
    image.Save("c:\\B.bmp"); 
    image.Detach(); 

    ::SelectObject(hDCMem, hOldMap); 
    ::DeleteObject(hBitMap); 
    ::DeleteDC(hDCMem); 
    ::DeleteDC(hDC); 

    return 0; 

#2


引用 1 楼 fishion 的回复:
以下的保存一个截图的,你参考使用吧
#include "stdafx.h"

#include <windows.h>
#include <atlimage.h>

int __stdcall WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
HWN……

我用的是VC6.0,没有atlimage.h这个文件

#3


引用 2 楼 bllqbz 的回复:
我用的是VC6.0,没有atlimage.h这个文件

 If your project uses ATL without MFC, include atlstr.h before you include atlimage.h. 
 If your project uses MFC (or if it is an ATL project with MFC support), include afxstr.h before you include atlimage.h.
------------------来自MSDN

#4


引用 3 楼 blackboyofsnp 的回复:
引用 2 楼 bllqbz 的回复:
我用的是VC6.0,没有atlimage.h这个文件

If your project uses ATL without MFC, include atlstr.h before you include atlimage.h.
If your project uses MFC (or if it is an ATL project with MFC s……

还是不行啊, atlstr.h  afxstr.h 这两个文件都找不到

#5


用不了#include <atlimage.h>这头文件,就用下面的方法
http://blog.csdn.net/luckywubi/archive/2009/04/28/4131441.aspx

#6


截屏这样就可以了
CRect rect;
rect.left = (this->startPt.x<this->endPt.x)?this->startPt.x:this->endPt.x;
rect.top = (this->startPt.y<this->endPt.y)?this->startPt.y:this->endPt.y;
rect.right = (this->endPt.x>this->startPt.x)?this->endPt.x:this->startPt.x;
rect.bottom = (this->endPt.y>this->startPt.y)?this->endPt.y:this->startPt.y;


HBITMAP hMap =  CopyScreenToBitmap(&rect); 
m_pBitmap=CBitmap::FromHandle(CopyScreenToBitmap(&rect));

#7


引用 6 楼 xianglitian 的回复:
截屏这样就可以了
C/C++ code
CRect rect;
    rect.left    = (this->startPt.x<this->endPt.x)?this->startPt.x:this->endPt.x;
    rect.top    = (this->startPt.y<this->endPt.y)?this->startPt.y:this->endPt.y;
  ……

啊 CopyScreenToBitmap函数又是从哪里来的?

#9


引用 7 楼 bllqbz 的回复:
引用 6 楼 xianglitian 的回复:

截屏这样就可以了
C/C++ code
CRect rect;
rect.left = (this->startPt.x<this->endPt.x)?this->startPt.x:this->endPt.x;
rect.top = (this->startPt.y<this->endPt.y)?this->startPt.y:thi……

不好意思

HBITMAP CScreenDlg::CopyScreenToBitmap(LPRECT lpRect)
{
HDC        hScrDC, hMemDC;      
HBITMAP   hOldBitmap,hBitmap;   
int        nX, nY, nX2, nY2;      
int        nWidth, nHeight;      
         
if (IsRectEmpty(lpRect))
return NULL;
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
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;
        //   创建一个与屏幕设备描述表兼容的位图   
        hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);   
        //   把新位图选到内存设备描述表中   
        hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);   
        //   把屏幕设备描述表拷贝到内存设备描述表中   
    ShowWindow(SW_HIDE);

        BitBlt(hMemDC,0,0,   nWidth,nHeight,hScrDC,   nX,   nY,   SRCCOPY);   
        //得到屏幕位图的句柄   
        hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);   
        //清除     
        DeleteDC(hScrDC);   
        DeleteDC(hMemDC);   

        ShowWindow(SW_SHOW);

        //   返回位图句柄   
        return   hBitmap;       

}

#10


我的资源有一个截屏的源代码

#11


我的资源里面有一个 模仿QQ截图的小程序 楼主可以看看 
要说函数的话 核心是 bitblt 函数。
http://download.csdn.net/source/2459777

#12


截图的事情我已经找到答案了
http://blog.csdn.net/seu07201213/archive/2006/07/16/929738.aspx
那如何快速度比较两张图片是否相同呢?

#1


以下的保存一个截图的,你参考使用吧
#include "stdafx.h" 

#include <windows.h> 
#include <atlimage.h> 

int __stdcall WinMain( 
            HINSTANCE hInstance, 
            HINSTANCE hPrevInstance, 
            LPSTR lpCmdLine, 
            int nShowCmd) 

    HWND hwnd = ::GetDesktopWindow(); 
    HDC hDC = ::GetDC(hwnd); //根据窗口来确定截图的大概位置

    RECT rect; 
    ::GetClientRect(hwnd, &rect); 
    HDC hDCMem = ::CreateCompatibleDC(hDC); 

    HBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom); 
    HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap); 

    ::BitBlt(hDCMem, 0, 0,  rect.right, rect.bottom, hDC,  0, 0, SRCCOPY); //红色部分确定图片的大小位置

    CImage image; 
    image.Attach(hBitMap); 
    image.Save("c:\\B.bmp"); 
    image.Detach(); 

    ::SelectObject(hDCMem, hOldMap); 
    ::DeleteObject(hBitMap); 
    ::DeleteDC(hDCMem); 
    ::DeleteDC(hDC); 

    return 0; 

#2


引用 1 楼 fishion 的回复:
以下的保存一个截图的,你参考使用吧
#include "stdafx.h"

#include <windows.h>
#include <atlimage.h>

int __stdcall WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
HWN……

我用的是VC6.0,没有atlimage.h这个文件

#3


引用 2 楼 bllqbz 的回复:
我用的是VC6.0,没有atlimage.h这个文件

 If your project uses ATL without MFC, include atlstr.h before you include atlimage.h. 
 If your project uses MFC (or if it is an ATL project with MFC support), include afxstr.h before you include atlimage.h.
------------------来自MSDN

#4


引用 3 楼 blackboyofsnp 的回复:
引用 2 楼 bllqbz 的回复:
我用的是VC6.0,没有atlimage.h这个文件

If your project uses ATL without MFC, include atlstr.h before you include atlimage.h.
If your project uses MFC (or if it is an ATL project with MFC s……

还是不行啊, atlstr.h  afxstr.h 这两个文件都找不到

#5


用不了#include <atlimage.h>这头文件,就用下面的方法
http://blog.csdn.net/luckywubi/archive/2009/04/28/4131441.aspx

#6


截屏这样就可以了
CRect rect;
rect.left = (this->startPt.x<this->endPt.x)?this->startPt.x:this->endPt.x;
rect.top = (this->startPt.y<this->endPt.y)?this->startPt.y:this->endPt.y;
rect.right = (this->endPt.x>this->startPt.x)?this->endPt.x:this->startPt.x;
rect.bottom = (this->endPt.y>this->startPt.y)?this->endPt.y:this->startPt.y;


HBITMAP hMap =  CopyScreenToBitmap(&rect); 
m_pBitmap=CBitmap::FromHandle(CopyScreenToBitmap(&rect));

#7


引用 6 楼 xianglitian 的回复:
截屏这样就可以了
C/C++ code
CRect rect;
    rect.left    = (this->startPt.x<this->endPt.x)?this->startPt.x:this->endPt.x;
    rect.top    = (this->startPt.y<this->endPt.y)?this->startPt.y:this->endPt.y;
  ……

啊 CopyScreenToBitmap函数又是从哪里来的?

#8


#9


引用 7 楼 bllqbz 的回复:
引用 6 楼 xianglitian 的回复:

截屏这样就可以了
C/C++ code
CRect rect;
rect.left = (this->startPt.x<this->endPt.x)?this->startPt.x:this->endPt.x;
rect.top = (this->startPt.y<this->endPt.y)?this->startPt.y:thi……

不好意思

HBITMAP CScreenDlg::CopyScreenToBitmap(LPRECT lpRect)
{
HDC        hScrDC, hMemDC;      
HBITMAP   hOldBitmap,hBitmap;   
int        nX, nY, nX2, nY2;      
int        nWidth, nHeight;      
         
if (IsRectEmpty(lpRect))
return NULL;
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
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;
        //   创建一个与屏幕设备描述表兼容的位图   
        hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);   
        //   把新位图选到内存设备描述表中   
        hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);   
        //   把屏幕设备描述表拷贝到内存设备描述表中   
    ShowWindow(SW_HIDE);

        BitBlt(hMemDC,0,0,   nWidth,nHeight,hScrDC,   nX,   nY,   SRCCOPY);   
        //得到屏幕位图的句柄   
        hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);   
        //清除     
        DeleteDC(hScrDC);   
        DeleteDC(hMemDC);   

        ShowWindow(SW_SHOW);

        //   返回位图句柄   
        return   hBitmap;       

}

#10


我的资源有一个截屏的源代码

#11


我的资源里面有一个 模仿QQ截图的小程序 楼主可以看看 
要说函数的话 核心是 bitblt 函数。
http://download.csdn.net/source/2459777

#12


截图的事情我已经找到答案了
http://blog.csdn.net/seu07201213/archive/2006/07/16/929738.aspx
那如何快速度比较两张图片是否相同呢?