Windows界面编程之GDI一(入门篇)

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就是要绘制的文字的字符个数。
        


 

















































猜你喜欢

转载自blog.csdn.net/gyaog/article/details/50104043