您的位置:首页 > 编程语言

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就是要绘制的文字的字符个数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: