GDI GDI.EXE这些动态链接库呼叫您安装的视讯显示器和任何打印机呼叫驱动程序中的例程。 因为PC兼容机种上可以连接许多种不同的视讯设备,所以,GDI的主要目的之一是支持与设备无关的图形 Windows程序应该能够毫无困难地在Windows支持的任意一种图形输出设备上执行,GDI通过将您的程序和不同输出 设备的特性隔离开来的方法来达到这一目的。 Windows GDI允许您使用两种坐标系统之一(甚至依据实际度量衡的坐标系)。您可以使用虚拟坐标系以便让程序 独立于硬件之外,或者也可以使用设备坐标系而完全迎合硬设备提供的环境。
1.GDI的三种位块传输的三种基本方法 /////////////////////////////////////////////////////////////////////////////////////////////////////// 位图传输 BitBlt The BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.
BOOL BitBlt( HDC hdcDest, // handle to destination device context int nXDest, // x-coordinate of destination rectangle's upper-left // corner int nYDest, // y-coordinate of destination rectangle's upper-left // corner int nWidth, // width of destination rectangle int nHeight, // height of destination rectangle HDC hdcSrc, // handle to source device context int nXSrc, // x-coordinate of source rectangle's upper-left // corner int nYSrc, // y-coordinate of source rectangle's upper-left // corner DWORD dwRop // raster operation code ); 位图拉伸 BOOL StretchBlt( HDC hdcDest, // handle to destination device context int nXOriginDest, // x-coordinate of upper-left corner of dest. rectangle int nYOriginDest, // y-coordinate of upper-left corner of dest. rectangle int nWidthDest, // width of destination rectangle int nHeightDest, // height of destination rectangle HDC hdcSrc, // handle to source device context int nXOriginSrc, // x-coordinate of upper-left corner of source rectangle int nYOriginSrc, // y-coordinate of upper-left corner of source rectangle int nWidthSrc, // width of source rectangle int nHeightSrc, // height of source rectangle DWORD dwRop // raster operation code ); 填充矩形区域 PatBlt (hdc, x, y, cx, cy, BLACKNESS) ; ******************************************************* 这个也可以 int FillRect( HDC hDC, // handle to device context CONST RECT *lprc, // pointer to structure with rectangle HBRUSH hbr // handle to brush ); 反正视图颜 BOOL InvertRect( HDC hDC, // handle to device context CONST RECT *lprc // pointer to structure with rectangle ); BitBlt、PatBlt和StretchBlt是最合适的GDI画图函数,它们根据从一个角测得的逻辑宽度和高度来指定逻辑直角坐标。 矩形边框用到的其它所有GDI画图函数都要求根据左上角和右下角的坐标来指定坐标。对于MM_TEXT映像模式, 上面讲述的PatBlt参数就是正确的。然而对于公制的映像模式来说,就不正确。如果您使用负的cx和cy值, 那么点(x,y)将是矩形的左下角。如果希望点(x,y)是矩形的左上角,那么cy参数必须设为矩形的负高度。
GetWindowDC is intended for special painting effects within a window's nonclient area. Painting in nonclient areas of any window is not recommended. 可以使用非客户区 TheGetSystemMetrics function can be used to retrieve the dimensions of various parts of the nonclient area, such as the title bar, menu, and scroll bars. 得到窗口上图标的大小 The GetDC function can be used to retrieve a device context for the entire screen. 得到客户区整个屏幕的DC After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications. 注意释放DC GetWindowDC 返回整个窗口的设备
DCHDC GetSafeHdc( ) const;
HDC GetWindowDC( HWND hWnd // handle of window ); int GetSystemMetrics( int nIndex // system metric or configuration setting to retrieve ); HDC GetDC( HWND hWnd // handle to a window ); ******************************************************* 3.GDI的使用 hBitmap = LoadBitmap (hInstance, szBitmapName) ;//创建位图 hdcMem = CreateCompatibleDC (hdc) ;//得到DC SelectObject (hdcMem, hBitmap) ;//将位图和DC联系在一起 然后就可以调用刚才的三种位图传输函数 ×××××××××××××××××××××××××× 4. 在windows里面注意一些内存 句柄 指针 一类的建立、释放 由LoadBitmap加载的所有位图最终应用DeleteObject清除 应用程序建立的任何内存设备内容最终都通过呼叫DeleteDC来清除。 ××××××××××××××××××××××××××
typedef struct tagBITMAPINFOHEADER{ // bmih DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount //调色板的大小 DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; //实际上使用的颜色数目 DWORD biClrImportant; } BITMAPINFOHEADER;
typedef struct tagBITMAPINFO { // bmi BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; }BITMAPINFO; 数据:记录位图的每一个像素值或者在调色板中的索引值 1.图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的 最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的 2.文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储, 否则,需要在后端补0,凑足4的倍数。 以字节为单位的每行长度始终是4的倍数。行的长度可以计算为: RowLength = 4 * ((bmch.bcWidth * bmch.bcBitCount + 31) / 32) ; 如果需要,可通过在右边补充行(通常是用零)来完成长度。图素数据的总字节数等于RowLength和 bmch.bcHeight的乘积。 24位图素不需要调色板 ///////////////////////////////////////////////////////////////////////////////////////////////// 2.显示 DIB的使用 SetDIBitsToDevice 直接显示或打印,不进行缩放 图像过大,占用的内存较多的时候可以使用这个函数分段显示图片 The SetDIBitsToDevice function sets the pixels in the specified rectangle on the device that is associated with the destination device context using color data from a device-independent bitmap (DIB). int SetDIBitsToDevice( HDC hdc, // handle to device context int XDest, // x-coordinate of upper-left corner of // dest. rect. int YDest, // y-coordinate of upper-left corner of // dest. rect. DWORD dwWidth, // source rectangle width DWORD dwHeight, // source rectangle height int XSrc, // x-coordinate of lower-left corner of // source rect. int YSrc, // y-coordinate of lower-left corner of // source rect. UINT uStartScan, // first scan line in array UINT cScanLines, // number of scan lines CONST VOID *lpvBits, // address of array with DIB bits CONST BITMAPINFO *lpbmi, // address of structure with bitmap info. UINT fuColorUse // RGB or palette indexes ); *******************************************************
可以根据目标区域的大小进行放大、缩小 The StretchDIBits function copies the color data for a rectangle of pixels in a -independent bitmap (DIB) to the specified destination rectangle. If the destination rectangle is larger than the source rectangle, this function stretches the rows and columns of color data to fit the destination rectangle. If the destination rectangle is smaller than the source rectangle, this function compresses the rows and columns by using the specified raster operation. Windows 98 and Windows NT 5.0: SetDIBitsToDevice has been extended to allow a JPEG image to be passed as the source image. int StretchDIBits( HDC hdc, // handle to device context int XDest, // x-coordinate of upper-left corner of dest. rectangle int YDest, // y-coordinate of upper-left corner of dest. rectangle int nDestWidth, // width of destination rectangle int nDestHeight, // height of destination rectangle int XSrc, // x-coordinate of upper-left corner of source rectangle int YSrc, // y-coordinate of upper-left corner of source rectangle int nSrcWidth, // width of source rectangle int nSrcHeight, // height of source rectangle CONST VOID *lpBits, // address of bitmap bits CONST BITMAPINFO *lpBitsInfo, // address of bitmap data UINT iUsage, // usage flags DWORD dwRop // raster operation code ); ******************************************************** 要呼叫SetDIBitsToDevice来显示整个DIB图像,您需要下列信息: hdc目的表面的设备内容句柄 xDst和yDst图像左上角的目的坐标 cxDib和cyDibDIB的图素宽度和高度,在这里,cyDib是BITMAPINFOHEADER结构内biHeight字段的绝对值。 pInfo和pBits指向位图信息部分和图素位的指针 ************************************************* 下面这个函数可以返回DC DC BeginPaint( HWND hwnd, // handle to window LPPAINTSTRUCT lpPaint // pointer to structure for paint information );
也可以用GETDC() InvalidateRect函数定义更新的区域,该函数发出WM_PAINT消息 The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn. BOOL InvalidateRect( HWND hWnd, // handle of window with changed update region CONST RECT *lpRect, // address of rectangle coordinates BOOL bErase // erase-background flag ); ////////////////////////////////////////////////////////////////////////////////////////////
hdc, // device context handle pInfoHdr, // pointer to DIB information header fInit, // 0 or CBM_INIT pBits, // pointer to DIB pixel bits pInfo, // pointer to DIB information fClrUse) ; // color use flag
该函数返回一个DDB位图的结构 如果仅需显示DIB一次,并担心SetDIBitsToDevice显示太慢,则呼叫CreateDIBitmap并使用BitBlt或StretchBlt 来显示DDB就没有什么意义。因为SetDIBitsToDevice和CreateDIBitmap都执行颜色转换,这两个工作会占用同样 长的时间。只有在多次显示DIB时(例如在处理WM_PAINT消息时)进行这种转换才有意义。 DDB到DIB int WINAPI GetDIBits( hdc, // device context handle hBitmap, // bitmap handle yScan, // first scan line to convert cyScans, // number of scan lines to convert pBits, // pointer to pixel bits (out) pInfo, // pointer to DIB information (out) fClrUse) ; // color use flag
文章评论(0条评论)
登录后参与讨论