截图10

laolei1986 2010-10-21 11:07:10
HBITMAP CopyScreenToBitmap(int x1, int x2, int y1, int y2)
{
//屏幕和内存设备描述表
HDC hSrcDC, hMemDC;
//位图句柄
HBITMAP hBitmap, hOldBitmap;
//选定区域坐标
int nX, nY, nX2, nY2;
//位图宽度和高度
int nWidth, nHeight;
//屏幕分辨率
int xScrn, yScrn;
/*
//确保选定区域不为空矩形
if(IsRectEmpty(lpRect))
return NULL;*/
//为屏幕创建设备描述表
hSrcDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hSrcDC);
//获得选定区域坐标
nX = x1;
nY = y1;
nX2 = x2;
nY2 = y2;
//获得屏幕分辨率
xScrn = GetDeviceCaps(hSrcDC, HORZRES);
yScrn = GetDeviceCaps(hSrcDC, 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(hSrcDC, nWidth, nHeight);
//把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
//把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hSrcDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hSrcDC);
DeleteDC(hMemDC);
//返回位置句柄
return hBitmap;
}
Void CaptureScreen()
{
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
HWND hDesktopWnd = GetDesktopWindow();
HDC hDesktopDC = GetDC(hDesktopWnd);
HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC,
nScreenWidth, nScreenHeight);
SelectObject(hCaptureDC,hCaptureBitmap);
BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight,
hDesktopDC,0,0,SRCCOPY|CAPTUREBLT);
SaveCapturedBitmap(hCaptureBitmap); //Place holder - Put your code
//here to save the captured image to disk
ReleaseDC(hDesktopWnd,hDesktopDC);
DeleteDC(hCaptureDC);
DeleteObject(hCaptureBitmap);
}


void CCaptureDlg::Screen(CString fileName)
{
CDC *pDC;//屏幕DC
pDC = this->GetDesktopWindow()->GetDC();
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);


CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);

CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息

CFile file;
if(!file.Open(fileName,CFile::modeCreate|CFile::modeWrite))
{

#ifdef _DENUG
AfxMessageBox("打开文件错误");

#endif
return ;
}

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount =24;// bmp.bmBitsPixel;//每个像素字节大小

bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度

bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

file.Write(&bfh,sizeof(BITMAPFILEHEADER));//写入位图文件头
file.Write(&bih,sizeof(BITMAPINFOHEADER));//写入位图信息头

byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
file.WriteHuge(p,bmp.bmWidthBytes * bmp.bmHeight);
file.Close();
delete [] p;

memDC.SelectObject(oldmemBitmap);

}void CCaptureDlg::Screen(CString fileName)
{
CDC *pDC;//屏幕DC
pDC = this->GetDesktopWindow()->GetDC();
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);


CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);

CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息

CFile file;
if(!file.Open(fileName,CFile::modeCreate|CFile::modeWrite))
{

#ifdef _DENUG
AfxMessageBox("打开文件错误");

#endif
return ;
}

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount =24;// bmp.bmBitsPixel;//每个像素字节大小

bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度

bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

file.Write(&bfh,sizeof(BITMAPFILEHEADER));//写入位图文件头
file.Write(&bih,sizeof(BITMAPINFOHEADER));//写入位图信息头

byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
file.WriteHuge(p,bmp.bmWidthBytes * bmp.bmHeight);
file.Close();
delete [] p;

memDC.SelectObject(oldmemBitmap);

}void CCaptureDlg::Screen(CString fileName)
{
CDC *pDC;//屏幕DC
pDC = this->GetDesktopWindow()->GetDC();
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式
int Width = pDC->GetDeviceCaps(HORZRES);
int Height = pDC->GetDeviceCaps(VERTRES);


CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);

CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息

CFile file;
if(!file.Open(fileName,CFile::modeCreate|CFile::modeWrite))
{

#ifdef _DENUG
AfxMessageBox("打开文件错误");

#endif
return ;
}

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount =24;// bmp.bmBitsPixel;//每个像素字节大小

bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度

bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

file.Write(&bfh,sizeof(BITMAPFILEHEADER));//写入位图文件头
file.Write(&bih,sizeof(BITMAPINFOHEADER));//写入位图信息头

byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
file.WriteHuge(p,bmp.bmWidthBytes * bmp.bmHeight);
file.Close();
delete [] p;

memDC.SelectObject(oldmemBitmap);

}

CPaintDC dc(this);
CWnd* pWnd=GetDlgItem(IDC_WENBEN);
CDC* pDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->Rectangle(0,0,100,100);
//创建画笔对象**************画X和Y轴
CPen* pPenRed=new CPen;
pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0));
CGdiObject* pOldPen=pDC->SelectObject(pPenRed);
pDC->MoveTo(10,10);
pDC->LineTo(10,280);
pDC->LineTo(280,280);
//创 画笔对象*****************画X轴和Y轴箭头
CPen* pPenBlue=new CPen;
pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255));
pDC->SelectObject(pPenBlue); pDC->MoveTo(5,15);
pDC->LineTo(10,10);
pDC->LineTo(15,15);
pDC->MoveTo(275,275);
pDC->LineTo(280,280);
pDC->LineTo(275,285);
//写X轴刻值
CString str;
str.Format("0");
pDC->SetTextColor(RGB(0,255,0));
pDC->TextOut(10,283,str); str.Format("50");
pDC->TextOut(60,283,str); str.Format("100");
pDC->TextOut(110,283,str); str.Format("150");
pDC->TextOut(160,283,str); str.Format("200");
pDC->TextOut(210,283,str); str.Format("250");
pDC->TextOut(260,283,str); //写X轴刻度线
for(int i=0;i<256;i+=5)
{
if((i&1)==0)
{
//10的倍数
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,284); }
else
{
pDC->MoveTo(i+10,280);
pDC->LineTo(i+10,282);
}
} pDC->SelectObject(pOldPen);
// 除新的画笔
delete pPenRed;
delete pPenBlue;



...全文
123 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
laolei1986 2010-11-15
  • 打赏
  • 举报
回复
IDispatch的存在是因为有些语言不支持虚函数表vtable,比如vb,asp等
它的主要作用是“接收一个函数的名称并执行它”
然后IDispatch有几个函数:
GetIDsOfNames,取一个函数的名称并返回其调度ID,或称DISPID
Invoke,可以将DISPID作为函数数组指针的索引

IDispatch叫做调度接口。它的作用何在呢?这个世上除了C++还有很多别的语言,比如VB、 VJ、VBScript、JavaScript等等。可以这么说,如果这世上没有这么多乱七八糟的语言,那就不会有IDispatch。:-) 我们知道COM组件是C++类,是靠虚函数表来调用函数的,对于VC来说毫无问题,这本来就是针对C++而设计的,以前VB不行,现在VB也可以用指针了,也可以通过VTable来调用函数了,VJ也可以,但还是有些语言不行,那就是脚本语言,典型的如 VBScript、JavaScript。不行的原因在于它们并不支持指针,连指针都不能用还怎么用多态性啊,还怎么调这些虚函数啊。唉,没办法,也不能置这些脚本语言于不顾吧,现在网页上用的都是这些脚本语言,而分布式应用也是COM组件的一个主要市场,它不得不被这些脚本语言所调用,既然虚函数表的方式行不通,我们只能另寻他法了。时势造英雄,IDispatch应运而生。:-) 调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数,仅此而已。当然实际的过程远比这复杂,仅给一个编号就能让别人知道怎么调用一个函数那不是天方夜潭吗,你总得让别人知道你要调用的函数要带什么参数,参数类型什么以及返回什么东西吧,而要以一种统一的方式来处理这些问题是件很头疼的事。IDispatch接口的主要函数是Invoke,客户程序都调用它,然后Invoke再调用相应的函数,如果看一看MS的类库里实现 Invoke的代码就会惊叹它实现的复杂了,因为你必须考虑各种参数类型的情况,所幸我们不需要自己来做这件事,而且可能永远也没这样的机会.

说白了,IDispatch就是Java/.Net里面的Reflection(反射)

支持自动化。
用户只要有COM库,不需要任何说明,
边可知道该库所有对象及对象的方法
属性,及方法、属性的参数、返回值
类型,及其ID。
利用IDispatch,用户不需要获得COM
组件的方法实际指针。因为IDispatch::Invoke
提供了一切方法。这就是为什么叫做
dispatch(分发)接口的原因。
如果没有IDispatch开发者必须提供
该COM虚类的原形。
现在的大多数公用COM都被设计为支持
IDispatch接口
Eleven 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wltg2001 的回复:]
引用 1 楼 xianglitian 的回复:
教学帖?

同问!
[/Quote]
....
wltg2001 2010-10-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xianglitian 的回复:]
教学帖?
[/Quote]
同问!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧