GetDC
函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,
以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。
GetDCEx函数是GetDC的一个扩展,它能使应用程序更多地控制在客户区域内如何或是否发生剪切。
数原型:HDC GetDC(HWND hWnd);
参数: hWnd:设备上下文环境被检索的窗口的句柄,
如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境。
注释:GetDC函数根据指定的等级类型检索指定窗口普通的、典型的或特有的设备上下文环境
对于普通设备上下文环境,GetDC在每次检索的时候部分分配给它缺省特性,对于典型和特有的设备上下文环境,
GetDC不改变先前设置的特性。 在使用普通设备上下文环境绘图之后,必须调用ReleaseDc函数释放该设备
上下文环境,典型和特有设备上下文环境不需要释放,设备上下文环境的个数仅受有效内存的限制。
BeginPaint
BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个
PAINTSTRUCT结构中。
HDC BeginPaint( HWND hwnd, // 窗口的句柄
LPPAINTSTRUCT lpPaint // 绘制信息
);
hWnd:[输入]被重绘的窗口句柄
lpPaint:[输出]指向一个用来接收绘画信息的PAINTSTRUCT结构
如果函数成功,返回值是指定窗口的“显示设备描述表”句柄。
如果函数失败,返回值是NULL,表明没有得到显示设备的内容。
Windows NT/2000/XP: 使用GetLastError得到更多的错误信息
一个应用程序除了响应WM_PAINT消息外,不应该调用BeginPaint。每次调用BeginPaint都应该有相应
的EndPaint函数。 如果被绘画的客户区中有一个caret(caret:插入符。是窗口客户区中的一个闪
烁的线,块,或位图。插入符通常表示文本或图形将被插入的地方。即一闪一闪的光标),BeginPaint
自动隐藏该符号,而保证它不被擦除。 如果窗口类有一个背景刷,BeginPaint使用这个刷子来擦除
更新区域的背景。
2.BeginPaint在GDI,GDI+中的具体代码示例
采用GDI绘图
HDC hdc;//设备场景DC
PAINTSTRUCT ps;
HEPN hPen;
HPEN hPenOld;
hdc = BeginPaint( hWnd , &ps );
hPen = CreatePen( PS_SOLID , 3 , RGB( 255 , 0 , 0 );
hPenOld = ( HPEN )SelectObject ( hdc , hPen );
MoveToEx ( hdc , 20 , 10 , NULL );
LineTo( hdc , 200 ,100);
SelectObject (hdc , hOldPen);
DeleteObject ( hPen );
EndPaint ( hWnd , &ps );]
采用GDI+绘图
HDC hdc ;
Graphics *myGraphics = new Graphics ( hdc );
Pen *myPen = new Pen (Color( 255 , 255 , 0 , 0) , 3 );
PANINTSTRUCT ps; hdc = BeginPaint( hWnd , &ps );
myGraphics ->DrawLine ( myPen , 20 ,10 ,200 ,100);
delete myGraphics ;
delete myPen ;
EndPaint (hWnd , hdc);
CreateCompatibleDC
函数功能
该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接
与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。
函数原型
HDC CreateCompatibleDC(HDC hdc);
编辑本段参数
hdc:现有设备上下文环境的句柄,如果该句柄为NULL,该函数创建一个与应用程序的当前
显示器兼容的内存设备上下文环境。
返回值:
如果成功,则返回内存设备上下文环境的句柄;如果失败,则返回值为NULL。
注释:
内存设备上下文环境是仅在内存中存在的设备上下文环境,当内存设备上下文环境被创建时,
它的显示界面是标准的一个单色像素宽和一个单色像素高,在一个应用程序可以使用内存设备上下文
环境进行绘图操作之前,它必须选择一个高和宽都正确的位图到设备上下文环境中,这可以通过使用
CreateCompatibleBitmap函数指定高、宽和色彩组合以满足函数调用的需要。
当一个内存设备上下文环境创建时,所有的特性都设为缺省值,内存设备上下文环境作为一个普通的设
备上下文环境使用,当然也可以设置这些特性为非缺省值,得到它的特性的当前设置,为它选择画笔,
刷子和区域。 CreateCompatibleDc函数只适用于支持光栅操作的设备,应用程序可以通过调用
GetDeviceCaps函数来确定一个设备是否支持这些操作。
当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它。
ICM:如果通过该函数的hdc参数传送给该函数设备上下文环境(Dc)对于独立颜色管理(ICM)是能用的,
则该函数创建的设备上下文环境(Dc)是ICM能用的,资源和目标颜色间隔是在Dc中定义。
SelectObject
函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
参数:
hdc:设备上下文环境的句柄。
hgdiobj:被选择的对象的句柄,该指定对象必须由如下的函数创建。
位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap,
CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备
上下文环境选择位图)。
画刷:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt,
CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。
字体:CreateFont, CreateFontIndirect。
笔: CreatePen, CreatePenIndirect。
区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn,
CreateRectRgn, CreateRectRgnIndirect。
返回值:
如果选择对象不是区域并且函数执行成功,那么返回值是被取代的对象的句柄;
如果选择对象是区域并且函数执行成功,返回如下一值;
SIMPLEREGION:区域由单个矩形组成;
COMPLEXREGION:区域由多个矩形组成。
NULLREGION:区域为空。
注释:该函数返回先前指定类型的选择对象,一个应用程序在它使用新对象进行绘制完成之后,
应该用原始的缺省的对象替换新对象。
应用程序不能同时选择一个位图到多个设备上下文环境中。
ICM:如果被选择的对象是画笔或笔,那么就执行颜色管理。
Rectangle
函数原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
参数:
hdc:设备环境句柄。
nLeftRect:指定矩形左上角的逻辑X坐标。
nTopRect:指定矩形左上角的逻辑Y坐标。
nRightRect:指定矩形右下角的逻辑X坐标。
nBottomRect:指定矩形右下角的逻辑Y坐标。
返回值:
如果函数调用成功,返回值非零,否则返回值为0。
备注:此函数不使用和改变当前位置。
LoadBitmap
函数简介
函数功能:该函数从模块的可执行文件中加载指定的位图资源。该函数已经被函数LoadImage替代。
函数原型:HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
参数
hlnstance:指向模块实例的句柄。该模块的可执行文件包含了要加载的位图。
lpBitmapName:指向字符串(以NULL结束)批指针。该字符串包含了要加载的位图资源名称。
另外一种方式就是该参数可以由低位字是资源标识符、高位字为0位形式组成。
可以使用宏MAKEINTRESOURCE来创建这个参数值。
返回值:如果函数执行成功,则返回值是指向指定位图的句柄。如果函数执行失败,那么返回值是NULL
备注:如果由参数lpBitmapName指向的位图不存在,或者没有足够的内存来加载该位图,则函数失败。
应用程序可以使用函数LoadBitmap来访问Win32 API使用的,预定义的位图。
若要这么做,应用程序必须将hlnstance参数设为NULL,并且lpBitmapName参数应取下列值:
OBM_BTNCORNERS OBM_OLD_RESTORE; OBM_BTSIZE OBM_OLD_RGARROW; OBM_CHECK OBM_OLD_UPARROW;
OBM_OLD_RESTORE; OBM_OLD_ZOOM; OBM_CLOSE OBM_REDUCE; OBM_COMBO OBM_REDUCED;
OBM_DNARROW OBM_RESTORE; OBM_LFARROWD OBM_RGARROW1; OBM_LFARROW1 OBM_SIZE;
OBM_MNARROW OBM_UPARROW; OBM_OLD_CLOSE OBM_UPARROWD; OBM_OLD_DNARROW OBM_PARROW1;
OBM_OLD_LFARROW OBM_ZOOM; OBM_OLD_REDUCE OBM_ZOOMD
以OBM_OLD开头的位图名表示是比3.0 更虫和16位版Windows系统使用的位图。
对于使用任何OBM_常量的应用程序而言,在加入WINDOWS.H头文件之前必须定义常量OEMRESOURCE。
应用程序必须调用DeleteObject函数来删除LoadBitmap函数返回的每一个位图句柄。
GetObject
函数功能:该函数得到指定图形对象的信息,根据图形对象,函数把填满的或结构,
或表项(用于逻辑调色板)数目放入一个指定的缓冲区
函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
参数:
hgdiobj:指向感兴趣的图形对象的句柄,它可以是这样的一个句柄:一个逻辑位图、一个刷子、
一种字体、一个调色板、笔或通过调用CreateDIBsection函数创建的与设备无关位图。
cbBuffer:指定将要写到缓冲区的信息的字节数目。
lpvObject:指向一个缓冲区的指针,该缓冲区将要检索指定图形对象的信息。
下面列出的是缓冲区为每种图形对象类型可接收的信息和类型,可用hgdiobj来指定,写入*lpvObject: HBITMAP BITMAP。
HBITMAP:如果cbBuffer被设置为sizeof(DIBSECTION)或sizeof(BITMAP),则从对CreatDIBSection函数的
DIBSECTION调用中返回。
HPALETTE:逻辑调色板入口数的WORD数目。
HPEN:从对ExtCreatePen函数的LXTLOGPEN调用中返回。
HPENLOGPEN; HBRUSH LOGBRUSH; HFONT LOGFONT
如果lpvObject参数为Null,则函数返回值为指定图形对象需要把信息贮存到缓冲区的字节数目。
返回值:如果函数调用成功,且lpvObject为一个有效指针,则返回值为贮存到缓冲区的字节数目;
如果函数调用成功,且lprObject为Null,则返回值为需要容纳的贮存到缓冲区的信息字节数目;
如果函数调用失败,则返回值为0。
如果hgdiobj标识一个由调用CreateDIBSection创建的位图,且指定的缓冲区足够大,
则GetObject函数返回一个DIBSECTION结构。另外,DIBSECTION中的BITMAP结构中的bmBits元素含有一个
指向位图位值的指针。 如果hgdiobj标识了一个通过其他途径创建的位图,则GetObject只返回位图
的宽、高和颜色格式信息,通过调用GetDIBits或GetBitmapBits函数可以得到位置的位值。
如果hgdiobj标识了一个逻辑调色板,则GetObject检索一个2字节的整数,该整数指定调色板中的项数,
函数不检索定义调色板的LOGPALETTE结构,为检索有关调色板项的信息,
应用程序可以调用GetPaletteEntries函数。
程序示例
下面是在应用程序中获取位图文件*.bmp的大小信息的核心代码:
HBITMAP hBitmapImag;
BITMAP bitmap ;
int nWidth, nHeight;
hBitmapImag = LoadBitmap (hInstance, TEXT ("D:\\photos\\Matthew.jpg")) ;
GetObject (hBitmapImag, sizeof (BITMAP), &bitmap) ;
nWidth = bitmap.bmWidth;
nHeight = bitmap.bmHeight;
/// // your code ///
DeleteObject (hBitmapImag);
BitBlt
函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,
以传送到目标设备环境
函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,
HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
参数:
hdcDest:指向目标设备环境的句柄。
nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
nWidth:指定源和目标矩形区域的逻辑宽度。
nHeight:指定源和目标矩形区域的逻辑高度。
hdcSrc:指向源设备环境的句柄。
nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,
如何与目标矩形区域的颜色数据组合以完成最后的颜色。
下面列出了一些常见的光栅操作代码:
BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,
(对缺省的物理调色板而言,该颜色为黑色)。
DSTINVERT:表示使目标矩形区域颜色取反。
MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色
合并。
NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的
颜色取反。
PATCOPY:将特定的模式拷贝到目标位图上。
PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。
然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。
(对于缺省物理调色板来说,这个颜色就是白色)。
返回值:
如果函数成功,那么返回值非零;如果函数失败,则返回值为零
备注:
如果在源设备环境中可以实行旋转或剪切变换,那么函数BitBlt返回一个错误。如果存在其他变换
(并且目标设备环境中匹配变换无效),那么目标设备环境中的矩形区域将在需要时进行拉伸、
压缩或旋转。 如果源和目标设备环境的颜色格式不匹配,那么BitBlt函数将源场景的颜色格
式转换成能与目标格式匹配的格式。当正在记录一个增强型图元文件时,如果源设备环境标识为一
个增强型图元文件设备环境,那么会出现错误。如果源和目标设备环境代表不同的设备,
那么BitBlt函数返回错误。
GetStockObject
函数功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄
函数原型:HGDIOBJ GetStockObject(int fnObject);
参数:
fnObject:指定对象的类型,该参数可取如下值之一;
BLACK_BRUSH:黑色画笔;
DKGRAY_BRUSH:暗灰色画笔;
DC_BRUSH:在Windows98,Windows NT 5.0和以后版本中为纯颜色画笔,缺省色为白色,
可以用SetDCBrushColor函数改变颜色,更多的信息参见以下的注释部分。
GRAY_BRUSH:灰色画笔;
HOLLOW_BRUSH:空画笔(相当于NULL_BRUSH);
LTGRAY_BRUSH:亮灰色画笔;
NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH);
WHITE_BRUSH:白色画笔;
BLACK_PEN:黑色钢笔;
DC_PEN:在Windows98、Windows NT 5.0和以后版本中为纯色钢笔,缺省色为白色,
使用SetDCPenColor函数可以改变色彩,更多的信息,参见下面的注释部分。
WHITE_PEN:白色钢笔;
ANSI_FIXED_FONT:在Windows中为固定间距(等宽)系统字体;
ANSI_VAR_FONT:在Windows中为变间距(比例间距)系统字体;
DEVICE_DEFAUCT_FONT:在WindowsNT中为设备相关字体;
DEFAULT_GUI_FONT:用户界面对象缺省字体,如菜单和对话框;
OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)字体;
SYSTEM_FONT:系统字体,在缺省情况下,系统使用系统字体绘制菜单,对话框控制和文本;
SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本;
DEFAULT_PALETTE:缺省调色板,该调色板由系统调色板中的静态色彩组成。
返回值
如果成功,返回值标识申请的逻辑对象,如果失败,返回值为NULL。
WindowsNT:若想获得更多错误信息,请调用GetLastError函数。
注释
仅在CS_HREDRAW和CS_UREDRAW风格的窗口中使用DKGRAY_BRUSH、GRAY_BRUSH和LTGRAY_BRUSH对象。
如果在其他风格的窗口中使灰色画笔,可能导致在窗口移动或改变大小之后出现画笔模式错位现象,
原始储存画笔不能被调整。 HOLLOW_BRUSH和NULL_BRUSH储存对象相等。
由DEFAULT_GUI_FONT储存对象使用的字体将改变。当想使用菜单、对话框和其他用户界面对象使用的字体
时请使用此储存对象。 不必要通过调用DeleteObject函数来删除储存对象。
Windows 98、Windows NT 5.0和以后版本:DC_BRUSH和DC_PEN都能与其他储存对象如BLACK_BRUSH和
BLACK_PEN相互交换关于检索当前钢笔和画笔颜色的信息,请参见GetDCBrushColor和GetDCPencolor,
带DC BRUSH或DC PEN参数的Getstockobject函数可以与SetDCPenColor和SetDCBrushColor函数相互交换使用。