在谈程序之前,先介绍一下位图的基本结构
256色以及更低色的位图,一般由三部分组成,一是位图信息头,定义了位图的大小等信息,二是颜色表,说明了位图中各个象素点红,绿,蓝三原色各个分量的值,三是位图的象素数据块,定义了位图中每个象素点的数据,它与第二条的颜色信息一起构成了图形的最终显示.
而对于大于256色的位图,一般由两部分组成,一是位图信息头,而是位图的象素快, 他定义了每个象素点的数据以及各个象素点的红,绿,蓝三原色分量.
有了这些之后,开始写程序实践一下吧
首先新建一个基于单文档界面的MFC应用程序,在编辑菜单项下建一个IDM_EDIT_SCREEN的子项,名为抓取屏幕,为它添加消息响应函数(在视图类中),然后在视类中定义两个私有的成员变量
HDC m_hDcCompatible //用来保存兼容DC设备上下文
HBITMAP m_hBitmap; //用来保存位图句柄
void CTestView::OnEditScreen()
{
HDC hdc = ::GetDC();
m_hDcCompatible = ::CreateCompatible(hdc); //创建兼容设备上下文DC
m_hBitmap = ::CreateCompatibleBitmap(hdc,GetDevice(hdc,HORZRES),GetDeviceCaps(hdc,VERTRES));
::SelectObject(m_hDcCompatible,m_hBitmap);//将兼容位图选入兼容设备中
::BitBlt(m_hdcCompatible,0,0,GetDeviceCaps(dc,HORZRES),
GetDeviceCaps(dc,HORZRES),dc,0,0,SRCCOPY);//将位图数据拷贝到兼容设备中
HCURSOR hCursor=GetCursor();
POINT ptCursor;
GetCursorPos(&ptCursor);
//获取光标的图标数据
ICONINFO IconInfo;
if (GetIconInfo(hCursor, &IconInfo))
{
ptCursor.x -= ((int) IconInfo.xHotspot);
ptCursor.y -= ((int) IconInfo.yHotspot);
if (IconInfo.hbmMask != NULL)
DeleteObject(IconInfo.hbmMask);
if (IconInfo.hbmColor != NULL)
DeleteObject(IconInfo.hbmColor);
}
//在兼容设备描述表上画出该光标
DrawIconEx(
m_hdcCompatible, // handle to device context
ptCursor.x, ptCursor.y,
hCursor, // handle to icon to draw
0,0, // width of the icon
0, // index of frame in animated cursor
NULL, // handle to background brush
DI_NORMAL | DI_COMPAT // icon-drawing flags
);
//使窗口无效,调用OnDraw重画窗口
::ReleaseDC(m_hWnd,dc);
Invalidate();
}
然后在ONDRAW中输出图形
void CGrabScreenView::OnDraw(CDC* pDC)
{
CGrabScreenDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
SelectObject(pDC->m_hDC,m_hBmScreen);
BitBlt(pDC->m_hDC,0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CXSCREEN),m_hdcCompatible,0,0,SRCCOPY);
}