在谈程序之前,先介绍一下位图的基本结构
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); }