怎样把屏幕(或CView区)的一个区域Rect 拷贝到CDC MemDC中,QQ123866716 在线等待!

dycdyc123 2002-06-02 07:57:44
如提!
...全文
234 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
msfmegryvc 2002-06-03
  • 打赏
  • 举报
回复
up
dycdyc123 2002-06-03
  • 打赏
  • 举报
回复
埃,谢谢你们的热心!

这些我都有!


我要的是得到Rect那的所有象素值
rgb【300】【300】

应为只有CDC MemDC可以得到!
llm308 2002-06-02
  • 打赏
  • 举报
回复
gz
j_d_s 2002-06-02
  • 打赏
  • 举报
回复
CDC*pDC = GetDC();

//创建兼容DC,在里面绘制后COPY到屏幕上//
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);

CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, 800, 600);

CBitmap *pOldBitmap = MemDC.SelectObject(&MemBitmap);

// 在兼容DC里绘制图像//
MydrawDirect(&MemDC); //你的执行函数
//将绘制完成的图像COPY到屏幕指定位置//
pDC->BitBlt(0, 0, 800, 600, &MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBitmap);

ReleaseDC();
dishou 2002-06-02
  • 打赏
  • 举报
回复
这时Bitmap已经在MemDC中了,你尽可以用CDC MemDC ; Memdc.GetPixel() 得到
dycdyc123 2002-06-02
  • 打赏
  • 举报
回复
内存中的bitmap就保存了你的Wnd的内容??

那我怎样从Bitmap中得到任意位置(100,20)的象素值???

这是关键??

CDC MemDC ; Memdc.GetPixel() 可以得到,但怎样把区域拷贝到MemDC中呢??


dishou 2002-06-02
  • 打赏
  • 举报
回复
CDC *pDC=::GetClientDC(); 得到你的客户区的DC
创建一个Memory DC并且调用CreateCompatibleDC();
CreateCompatibleBitmap()创建一个空的bitamp;
SelectObject()把这个bitmap选入Memory DC中;
BitBlt(0,0,宽,高,pDC,宽,高,SRCCOPY); 把screen DC中的内容copy到Memory DC中去,这样内存中的bitmap就保存了你的Wnd的内容;
pcman1990 2002-06-02
  • 打赏
  • 举报
回复
供参考:

HBITMAP CopyScreenToBitmap(LPRECT lpRect) //lpRect 代表选定区域
{
HDC hScrDC, hMemDC; // 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap; // 位图句柄
int nX, nY, nX2, nY2; // 选定区域坐标
int nWidth, nHeight; // 位图宽度和高度
int xScrn, yScrn; // 屏幕分辨率

// 确保选定区域不为空矩形
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 = SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄
hBitmap = SelectObject(hMemDC, hOldBitmap);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);

// 返回位图句柄
return hBitmap;
}



得到屏幕位图句柄以后,我们可以把屏幕内容粘贴到剪贴板上.

if (OpenClipboard(hWnd)) //hWnd为程序窗口句柄
{
//清空剪贴板
EmptyClipboard();

//把屏幕内容粘贴到剪贴板上,
hBitmap 为刚才的屏幕位图句柄
SetClipboardData(CF_BITMAP, hBitmap);

//关闭剪贴板
CloseClipboard();
}


我们也可以把屏幕内容以位图格式存到磁盘文件上.

int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
//hBitmap 为刚才的屏幕位图句柄, lpFileName 为位图文件名
{
HDC hDC; //设备描述表
int iBits; //当前显示分辨率下每个像素所占字节数

WORD wBitCount; //位图中每个像素所占字节数

//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数

DWORD dwPaletteSize=0, dwBmBitsSize, dwDIBSize, dwWritten;
BITMAP Bitmap;

//位图属性结构
BITMAPFILEHEADER bmfHdr;

//位图文件头结构
BITMAPINFOHEADER bi;

//位图信息头结构
LPBITMAPINFOHEADER lpbi;

//指向位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL;

//定义文件,分配内存句柄,调色板句柄
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) *
GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);

if(iBits < = 1)
wBitCount = 1;
else if (iBits < = 4)
wBitCount = 4;
else if (iBits < = 8)
wBitCount = 8;
else if (iBits < = 24)
wBitCount = 24;

//计算调色板大小
if (wBitCount < = 8)
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);

bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight;

//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;

// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);

if(hPal)
{
hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}

// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,
(BITMAPINFOHEADER *)lpbi, DIB_RGB_COLORS);

//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}

//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if(fh == INVALID_HANDLE_VALUE)
return FALSE;

// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;

bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;

// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
}

dycdyc123 2002-06-02
  • 打赏
  • 举报
回复
我试试!

16,470

社区成员

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

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

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