Windows界面编程之GDI一(入门篇)
2015-11-30 00:44
423 查看
GDI学习一(入门篇)
1、设备环境DC的概念
设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。他是一个关于如何绘制图形的方法的集合。它即可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
在win32编程中,设备环境是用HDC来标识。H的意思Handle句柄的意思。
2、通过GetDC函数来获取得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制
代码段:
{
HDC hDc =::GetDC(hWnd);
//其他的绘图操作代码
......................
::ReleaseDC(hWnd,hDc);
}
GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
3、通过BeginPaint函数来获取得所在窗口的HDC
BeginPain函数是将窗口上所有内容清除干净,然后在上面绘制。
代码段:
{
PAINTSTRUCT ps;
HDC hDc = ::BeginPain(hWnd,&ps);
//其他的绘图操作代码
::EndPoint(hWnd,&ps);
}
PAINTSTRUCT 结构:
typedef struct tagPAINTSTRUCT{
HDC hdc; //显示器的设备环境句柄
BOOL fErase; //是否擦除背景
RECT rcPaint; //指定了需要绘图的窗口区域
BOOL fRestore;
BOOL fIncUpdte;
BYTE fgbReserved[32];
}PAINTSTRUCT;
4、通过CreateCompatibleDC 创建兼容内存DC
通过调用CreateCompatinbleDC函数来创建于目标DC兼容的内存DC,一般用于解决界面的闪烁问题。
代码片段:
{
HDC hMemDC =::CreateCompatibleDC(hDest);
//其他的绘图操作
.......
::BitBlt(hDest,x,y,w,h,h,hDMemDC,0,0,SRCCOPY);
.......
::DeleteDC(hMenDC);
}
5、画笔Pen:
在GDI中,用HPEN来表示画笔。H是代表句柄的意思。
在GDI中,画线,画边框(如矩形边框,圆边框,饼边框)都是采用画笔来操作的。
GDI默认的画笔是黑色,宽度为1,样式为实线的画笔。
6、画刷Brush:
在GDI中,用HBRUSH来表示画刷。H是表示句柄的意思。
在GDI中,填充矩形,填充圆,填充饼等以及刷窗口背景都是通过画刷来操作的。
GDI默认的是画刷是白色的画刷。
7、字体Font:
在GDI中,用HFONT来表示字体。H是表示句柄的意思。
在GDI中,所有的文本绘制,都是要基于具体的字体对象来绘制的。
GDI中默认的字体,是系统等宽字体,比如对话框标题一般就是采用这个字体。
8、区域Region:
在GDI中,用HRGN来表示区域。H是表示句柄的意思。
在窗口中,一个区域可以是椭圆形,多边形,或是更常见的矩形。
9、位图Bitmap:
在GDI中,用HBITMAP来表示位图。H是代表句柄的意思。
GDI的绘制,从大体上,分为图形绘制跟图像绘制。对于线、矩形、圆、饼等的绘制是属于图形绘制。而对于位图的绘制是属于图像绘制。
10、SelectObject:
HGDIOBJ WINAPI SelectObject(HDC hdc,HGDIOBJ h);
第一个参数是设备DC.
第二个参数是HGDIOBJ,其实是一个void *.这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象。
11、GDI对象的例子代码:
下面是一个完整的使用GDI对象的例子代码
{
LOGFONT lf = {0};
lf.lfWidth = 16;
lf.lfHeight = 40;
lf.ifCharSet = GB2312_CHARSET;
HFONT hFont = ::CreateFontIndirect(&lf);
HFONT hOldFont = :SelectObject(hDc,hFont);
DrawText(hDC,_T("abc"),3,&rect,DT_LEFT);
//其他的绘图操作
..............
::SelectObject(hDC,hOldFont);
::DelectObject(hFont);
}
12、系统提供的自带的GDI对象:
//画刷
#define WHITE_BRUSH 0 //白色画刷
#define LTGRAY_BRUSH 1 //亮灰色画刷
#define GRAY_BRUSH 2 //灰色画刷
#define DKGRAY_BRUSH 3 //暗灰色画刷
#define BLACK_BRUSH 4 //黑色画刷
#define NULL_BRUSH 5 //空画刷
#define HOLLOW_BRUSH NULL_BRUSH
//画笔
#define WHITE_PEN 6 //白色画笔
#define BLACK_PEN 7 //黑色画笔
#define NULL_PEN 8 //空画笔
//字体
#define OEM_FIXED_FONT 10
#define ANSO_FIXED_FONT 11
#define ANSI_VAR_FONT 12
#define SYSTEM_FONT 13
#define DEVICE_DEFAULT_FONT 14 //最常用,返回Windows最常用的默认字体
#define DEFAULT_PALETTE 15
#define SYSTEM_FIXED_FONT 16
#define DEFAULT_GUI_FONT 17
12、库存GDI对象的使用(库存对象是不需要销毁的,也不需要创建)
HGDIOBJ GetStockObject(int i);
13、GDI对象的信息获取
获取对象的一些信息可以通过调用GetObject函数来实现。
int WINAPI GetObject(HANDLE h,int c,LPVOID pv);
第一个参数填入GDI对象的句柄。
第二个参数填入结构的大小。
第三参数填入结构的指针,这里的结构是对应的GDI对象的。
比如:位图HBIMAP对象的结构是BITMAP,画刷HBRUSH对象的结构是LOGBRUSH.我们现在以获得位图对象的信息为例:得到位图的宽度与高度。
BITMAP bm;
::GetObject(hBitmap,sizeof(BITMAP),&bm);
typedef struct tagBITMA
{
LONG bmType;
LONG bmWidth; //宽度
LONG bmHeight; //高度
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits; //位图的数据
}BITMAP,*PBITMAP,NEAR *NPBITMAP,FAR *LPBITMAP;
14、图片与颜色
RGB格式中,R(0~255)红色分量,G(0~255)绿色分量,B(0~255)蓝色分量。没有透明度信息。通常RGB三个分量各种一个字节,所以RGB实际占有的是三个字节。
ARGB格式中,A(0~255)代表Alpha,代表透明度信息。后面的RGB就是红,绿,蓝分量。通常ARGB四个分量各占一个字节,所以ARGB实际占用的是四个字节。
15、图片的加载
1、 LoadBitmap图片的加载
函数的作用是从应用程序工程资源中读取位图数据。
HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);
第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄
第二个参数BitmapName是位图在资源中的ID名称。
2、 LoadImage图片的加载
LaodImage这个函数可以加载位图、图标、光标多种图像数据
从资源加载
hbmpBack = (BITMAP)::LoadImage(hInst,MAKEINTRESOURCE(IDB_BACK),IMAGE_BITMAP,0,0,LP_CREATEDIBSETION|LR_LOADMAP3DCOLORS);
从文件路径加载
hbmpBack =(BITMAP)::LoadImage(NULL,_T(".\\1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
16、BitBlt绘制位图(不是进行拉伸)
BOOL WINAPI BitBlt(
HDC hdc, //目标DC的句柄
int x,int y,int cx,int cy, //目标区域
HDC hdcSrc, //源DC的句
int x1,int y1, //源区域的左上角
DWORD rop //操作标准,一般是SRCCOPY,是拷贝的意思
);
17、总结一下绘制位图的步骤
1、获取目标DC句柄
2、创建与目标DC兼容的临时内存DC
3、将位图句柄选入到临时内存DC中
4、使用BitBlt函数将临时内存DC中的位图拷贝到目标DC上来
5、将为位图句柄选出临时内存DC
6、销毁临时的内存DC
18、获得客户区的大小
BOOL WINAPI GetClientRect(HWND hWnd,LPRECT lpRect);
第一个参数传入窗口的句柄。
第二个参数传入接受返回值Rect的指针。
19、StretchBlt拉伸函数
BOOL WINAPI StretchBlt(
HDC hdcDest, //目标DC的句柄
int xDest,int yDest,int wDest,int hDest, //目标DC的区域
HDC hdcSrc, //源DC的句柄
int xSrc,int ySrc,int wSrc,_int int hSrc, //源DC的区域
DWORD rop //操作标准,一般为SRCCOPY,意思为拷贝
);
20、DrawText绘制文字
int WINAPI DrawText(
HDC hdc, //DC的句柄
LPCWSTR lpchText, //要绘制的文体
int cchText, //要绘制文本的字体长度
LPRECT lprc, //绘制的目标区域
UINT format //绘制标准,DT_SINGLELINE等(居中、对齐等)
);
21、LOGFONTA字体结构体
typedef struct tagLOGFONTA
{
LOGNG lfHeight; //指定需要的字体的高度
LOGNG lfWidth; //指定需要的字体的宽度
LONG lfEscapement; //指定每个自字符的基线相对于页底部的角度
LONG lfWeight; //在0~1000(如400为正常字体,700为黑体)的范围内,指定字体所需的深浅程度。0为默认值。
BYTE lfItalic; //如果要求的字体是倾斜的,则此参数为TRUE
BYTE lfUnderline; //如果要求字体要添加下划线,则此参数为TRUE
BYTE lfStrikeOut; //如果字体要加中划线,则此参数TRUE
BYTE lfCharSet; //指定字体所需要的字符集
BYTE lfOutPrecision; //指定所要求的输出精度。输出精度定义了输出字体必须如何紧密匹配所要求的字体的高度、宽度、字符转角、倾斜度和间距
BYTE lfClipPrecision; //指定所需要的剪贴精度。剪贴精度定义了如何对落在剪贴区域外部的字符进行剪贴
BYTE lfQuality; //指定字体所要求的输出质量
BYTE lfPitchAndFamily; //指定字体的间距和字体系列
CHAR lfFaceName[LF_FACESIZE]; //指向一个NULL为终止符的字符串。该串指定字体的名字
}LOGFONTA,*PLOGFONTA;
22、文字颜色
GDI的文字颜色相关的函数有2个:
一个是GetTextColor用来获得当前DC的文本颜色;
另一个是SetTextColor用来设置当前DC的文本颜色
COLORREF WINAPI SetTextColor(HDC hdc,COLORREF color);
23、背景模式
通过SetBKMode设置DC的背景模式,相对应的GetBKMode是用来获取背景模式的。
int SetBKMode(HDC hdc,int mode);
参数mode可以用TRANSPARENT值(透明)与OPAQUE值(不透明,默认值)
返回值是hdc在设置之前的背景模式。
24、库存字体
库存字体,可以通过GetStockObject函数获取。
GetStockObject(SYSTEM_FONT)获取默认的系统字体的句柄。在缺省情况下,系统使用该字体绘制菜单,文本。除SYSTEM_FONT外还可以设置如下参数。
OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)的字体。
ANSI_FIXED_FONT:在Windows中为固定间距(等宽)的系统字体。
ANSI_VAR_FONT:在Windows中变间距的系统字体。
DEVICE_DEFAULT_FONT:固定间距(等宽)的系统字体,该字体仅提供该兼容16位的Windows版本。
25、TextOut绘制文字
TextOut(HDC hdc,int nXStart,int nYStart,LPCTSTR lpString,int cbString);
参数hdc就是要绘制文字的DC.
参数nXStart就是文字要绘制的起点位置的X坐标。
参数nYStart就是文字要绘制的起点位置的Y坐标。
参数lpString就是要绘制的文字的字符串指针。
参数cbString就是要绘制的文字的字符个数。
1、设备环境DC的概念
设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。他是一个关于如何绘制图形的方法的集合。它即可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
在win32编程中,设备环境是用HDC来标识。H的意思Handle句柄的意思。
2、通过GetDC函数来获取得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制
代码段:
{
HDC hDc =::GetDC(hWnd);
//其他的绘图操作代码
......................
::ReleaseDC(hWnd,hDc);
}
GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
3、通过BeginPaint函数来获取得所在窗口的HDC
BeginPain函数是将窗口上所有内容清除干净,然后在上面绘制。
代码段:
{
PAINTSTRUCT ps;
HDC hDc = ::BeginPain(hWnd,&ps);
//其他的绘图操作代码
::EndPoint(hWnd,&ps);
}
PAINTSTRUCT 结构:
typedef struct tagPAINTSTRUCT{
HDC hdc; //显示器的设备环境句柄
BOOL fErase; //是否擦除背景
RECT rcPaint; //指定了需要绘图的窗口区域
BOOL fRestore;
BOOL fIncUpdte;
BYTE fgbReserved[32];
}PAINTSTRUCT;
4、通过CreateCompatibleDC 创建兼容内存DC
通过调用CreateCompatinbleDC函数来创建于目标DC兼容的内存DC,一般用于解决界面的闪烁问题。
代码片段:
{
HDC hMemDC =::CreateCompatibleDC(hDest);
//其他的绘图操作
.......
::BitBlt(hDest,x,y,w,h,h,hDMemDC,0,0,SRCCOPY);
.......
::DeleteDC(hMenDC);
}
5、画笔Pen:
在GDI中,用HPEN来表示画笔。H是代表句柄的意思。
在GDI中,画线,画边框(如矩形边框,圆边框,饼边框)都是采用画笔来操作的。
GDI默认的画笔是黑色,宽度为1,样式为实线的画笔。
6、画刷Brush:
在GDI中,用HBRUSH来表示画刷。H是表示句柄的意思。
在GDI中,填充矩形,填充圆,填充饼等以及刷窗口背景都是通过画刷来操作的。
GDI默认的是画刷是白色的画刷。
7、字体Font:
在GDI中,用HFONT来表示字体。H是表示句柄的意思。
在GDI中,所有的文本绘制,都是要基于具体的字体对象来绘制的。
GDI中默认的字体,是系统等宽字体,比如对话框标题一般就是采用这个字体。
8、区域Region:
在GDI中,用HRGN来表示区域。H是表示句柄的意思。
在窗口中,一个区域可以是椭圆形,多边形,或是更常见的矩形。
9、位图Bitmap:
在GDI中,用HBITMAP来表示位图。H是代表句柄的意思。
GDI的绘制,从大体上,分为图形绘制跟图像绘制。对于线、矩形、圆、饼等的绘制是属于图形绘制。而对于位图的绘制是属于图像绘制。
10、SelectObject:
HGDIOBJ WINAPI SelectObject(HDC hdc,HGDIOBJ h);
第一个参数是设备DC.
第二个参数是HGDIOBJ,其实是一个void *.这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象。
11、GDI对象的例子代码:
下面是一个完整的使用GDI对象的例子代码
{
LOGFONT lf = {0};
lf.lfWidth = 16;
lf.lfHeight = 40;
lf.ifCharSet = GB2312_CHARSET;
HFONT hFont = ::CreateFontIndirect(&lf);
HFONT hOldFont = :SelectObject(hDc,hFont);
DrawText(hDC,_T("abc"),3,&rect,DT_LEFT);
//其他的绘图操作
..............
::SelectObject(hDC,hOldFont);
::DelectObject(hFont);
}
12、系统提供的自带的GDI对象:
//画刷
#define WHITE_BRUSH 0 //白色画刷
#define LTGRAY_BRUSH 1 //亮灰色画刷
#define GRAY_BRUSH 2 //灰色画刷
#define DKGRAY_BRUSH 3 //暗灰色画刷
#define BLACK_BRUSH 4 //黑色画刷
#define NULL_BRUSH 5 //空画刷
#define HOLLOW_BRUSH NULL_BRUSH
//画笔
#define WHITE_PEN 6 //白色画笔
#define BLACK_PEN 7 //黑色画笔
#define NULL_PEN 8 //空画笔
//字体
#define OEM_FIXED_FONT 10
#define ANSO_FIXED_FONT 11
#define ANSI_VAR_FONT 12
#define SYSTEM_FONT 13
#define DEVICE_DEFAULT_FONT 14 //最常用,返回Windows最常用的默认字体
#define DEFAULT_PALETTE 15
#define SYSTEM_FIXED_FONT 16
#define DEFAULT_GUI_FONT 17
12、库存GDI对象的使用(库存对象是不需要销毁的,也不需要创建)
HGDIOBJ GetStockObject(int i);
13、GDI对象的信息获取
获取对象的一些信息可以通过调用GetObject函数来实现。
int WINAPI GetObject(HANDLE h,int c,LPVOID pv);
第一个参数填入GDI对象的句柄。
第二个参数填入结构的大小。
第三参数填入结构的指针,这里的结构是对应的GDI对象的。
比如:位图HBIMAP对象的结构是BITMAP,画刷HBRUSH对象的结构是LOGBRUSH.我们现在以获得位图对象的信息为例:得到位图的宽度与高度。
BITMAP bm;
::GetObject(hBitmap,sizeof(BITMAP),&bm);
typedef struct tagBITMA
{
LONG bmType;
LONG bmWidth; //宽度
LONG bmHeight; //高度
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits; //位图的数据
}BITMAP,*PBITMAP,NEAR *NPBITMAP,FAR *LPBITMAP;
14、图片与颜色
RGB格式中,R(0~255)红色分量,G(0~255)绿色分量,B(0~255)蓝色分量。没有透明度信息。通常RGB三个分量各种一个字节,所以RGB实际占有的是三个字节。
ARGB格式中,A(0~255)代表Alpha,代表透明度信息。后面的RGB就是红,绿,蓝分量。通常ARGB四个分量各占一个字节,所以ARGB实际占用的是四个字节。
15、图片的加载
1、 LoadBitmap图片的加载
函数的作用是从应用程序工程资源中读取位图数据。
HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance,LPCWSTR lpBitmapName);
第一个参数HINSTANCE,它是资源文件所在的模块的实例句柄
第二个参数BitmapName是位图在资源中的ID名称。
2、 LoadImage图片的加载
LaodImage这个函数可以加载位图、图标、光标多种图像数据
从资源加载
hbmpBack = (BITMAP)::LoadImage(hInst,MAKEINTRESOURCE(IDB_BACK),IMAGE_BITMAP,0,0,LP_CREATEDIBSETION|LR_LOADMAP3DCOLORS);
从文件路径加载
hbmpBack =(BITMAP)::LoadImage(NULL,_T(".\\1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
16、BitBlt绘制位图(不是进行拉伸)
BOOL WINAPI BitBlt(
HDC hdc, //目标DC的句柄
int x,int y,int cx,int cy, //目标区域
HDC hdcSrc, //源DC的句
int x1,int y1, //源区域的左上角
DWORD rop //操作标准,一般是SRCCOPY,是拷贝的意思
);
17、总结一下绘制位图的步骤
1、获取目标DC句柄
2、创建与目标DC兼容的临时内存DC
3、将位图句柄选入到临时内存DC中
4、使用BitBlt函数将临时内存DC中的位图拷贝到目标DC上来
5、将为位图句柄选出临时内存DC
6、销毁临时的内存DC
18、获得客户区的大小
BOOL WINAPI GetClientRect(HWND hWnd,LPRECT lpRect);
第一个参数传入窗口的句柄。
第二个参数传入接受返回值Rect的指针。
19、StretchBlt拉伸函数
BOOL WINAPI StretchBlt(
HDC hdcDest, //目标DC的句柄
int xDest,int yDest,int wDest,int hDest, //目标DC的区域
HDC hdcSrc, //源DC的句柄
int xSrc,int ySrc,int wSrc,_int int hSrc, //源DC的区域
DWORD rop //操作标准,一般为SRCCOPY,意思为拷贝
);
20、DrawText绘制文字
int WINAPI DrawText(
HDC hdc, //DC的句柄
LPCWSTR lpchText, //要绘制的文体
int cchText, //要绘制文本的字体长度
LPRECT lprc, //绘制的目标区域
UINT format //绘制标准,DT_SINGLELINE等(居中、对齐等)
);
21、LOGFONTA字体结构体
typedef struct tagLOGFONTA
{
LOGNG lfHeight; //指定需要的字体的高度
LOGNG lfWidth; //指定需要的字体的宽度
LONG lfEscapement; //指定每个自字符的基线相对于页底部的角度
LONG lfWeight; //在0~1000(如400为正常字体,700为黑体)的范围内,指定字体所需的深浅程度。0为默认值。
BYTE lfItalic; //如果要求的字体是倾斜的,则此参数为TRUE
BYTE lfUnderline; //如果要求字体要添加下划线,则此参数为TRUE
BYTE lfStrikeOut; //如果字体要加中划线,则此参数TRUE
BYTE lfCharSet; //指定字体所需要的字符集
BYTE lfOutPrecision; //指定所要求的输出精度。输出精度定义了输出字体必须如何紧密匹配所要求的字体的高度、宽度、字符转角、倾斜度和间距
BYTE lfClipPrecision; //指定所需要的剪贴精度。剪贴精度定义了如何对落在剪贴区域外部的字符进行剪贴
BYTE lfQuality; //指定字体所要求的输出质量
BYTE lfPitchAndFamily; //指定字体的间距和字体系列
CHAR lfFaceName[LF_FACESIZE]; //指向一个NULL为终止符的字符串。该串指定字体的名字
}LOGFONTA,*PLOGFONTA;
22、文字颜色
GDI的文字颜色相关的函数有2个:
一个是GetTextColor用来获得当前DC的文本颜色;
另一个是SetTextColor用来设置当前DC的文本颜色
COLORREF WINAPI SetTextColor(HDC hdc,COLORREF color);
23、背景模式
通过SetBKMode设置DC的背景模式,相对应的GetBKMode是用来获取背景模式的。
int SetBKMode(HDC hdc,int mode);
参数mode可以用TRANSPARENT值(透明)与OPAQUE值(不透明,默认值)
返回值是hdc在设置之前的背景模式。
24、库存字体
库存字体,可以通过GetStockObject函数获取。
GetStockObject(SYSTEM_FONT)获取默认的系统字体的句柄。在缺省情况下,系统使用该字体绘制菜单,文本。除SYSTEM_FONT外还可以设置如下参数。
OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)的字体。
ANSI_FIXED_FONT:在Windows中为固定间距(等宽)的系统字体。
ANSI_VAR_FONT:在Windows中变间距的系统字体。
DEVICE_DEFAULT_FONT:固定间距(等宽)的系统字体,该字体仅提供该兼容16位的Windows版本。
25、TextOut绘制文字
TextOut(HDC hdc,int nXStart,int nYStart,LPCTSTR lpString,int cbString);
参数hdc就是要绘制文字的DC.
参数nXStart就是文字要绘制的起点位置的X坐标。
参数nYStart就是文字要绘制的起点位置的Y坐标。
参数lpString就是要绘制的文字的字符串指针。
参数cbString就是要绘制的文字的字符个数。
相关文章推荐
- hibernate入门实例
- php验证码的制作
- spring MVC入门
- 故事板控件无法和代码关联的问题解决
- 第一个Python程序
- JAVA事务的概念
- PAT练习基础编程题目之简单求和
- 网页禁止右键代码
- Python解释器
- 神器XPath在Python下的使用
- levelDB
- PAT练习基础编程题目之多项式求值
- Java 多线程 并发编程
- 指针
- springMVC数据封装成POJO
- asp.net实现利用反射,泛型,静态方法快速获取表单值到Model的方法
- ASP.NET2.0使用Enter Key作为默认提交问题分析(附源码)
- ASP.NET基于Ajax的Enter键提交问题分析
- asp.net实现取消页面表单内文本输入框Enter响应的方法
- asp.net实现非常实用的自定义页面基类(附源码)