WindowsAPI学习笔记二 - 图形设备接口及windows绘图

来源:互联网 发布:mac os官方下载地址 编辑:程序博客网 时间:2024/05/17 23:11

转载自:http://www.cppblog.com/sunshinealike/archive/2009/03/10/76148.html


Windows 图形设备接口( Graphics Device Interface, GDI )是为与设备无关的图形设计的,由操作系统屏蔽了硬件设备的差异,简化了程序员的程序编写工作。

 

Ÿ           设备上下文( Device Context, DC )

定义了一系列图形对象及其属性的结构,包括图形模式及输出。 PS : DC 一词的翻译上有些疑惑,不明白为什么这么叫。 context: 背景,环境,上下文

目前设备上下文有四种类型:显示,打印,存储和消息类型。

图形对象及其属性:

位图,画刷,调色板,字体,画笔,区域

应用程序每一次图形操作均参照设备 上下文 中的属性执行, DC 可以看作是图形的“输出模板”。

 

Ÿ           图形刷新

Windows 应用程序在使用过程中,窗口大小的调整,窗口移动或者被其它窗口覆盖后,都必须要刷新原窗口内用户区显示的内容。但是 windows 系统只能在有限的几种情况下自动刷新。因此应用程序必须具有及时处理刷新请求和刷新响应的功能。

Windows 系统通常通过发送 WM_PAINT 消息将刷新请求传递给应用程序。一般情况下,刷新有三种可能:

(1)      窗口移动后的刷新 
用户区移动,窗口大小改变,滚动条的使用等

(2)      被覆盖区域的刷新 
下拉式菜单关闭后需恢复被覆盖部分,清除消息框后进行的恢复等

(3)      对象穿越后的刷新 
光标穿过用户区,图标拖过用户区等

Windows 系统为每个窗口建立了一个 PAINTSTRUCT 结构,该结构中包含了指明一个窗口被另一个窗口覆盖的“无效区域”的最小矩形结构 RECT ,程序可根据这个矩形进行刷新。

常用刷新方法包括:

(1)      保持一个显示输出副本,需要时重绘窗口

(2)      记录发生的事件,需要时重新调用该事件

(3)      重新绘图,简单图形常用的方法

 

Ÿ           获取设备 上下文 
获取设备 上下文 是应用程序输出图形的先决条件,常用函数有: 
BeginPaint      响应 WM_PAINT 消息进行图形刷新 
GetDC           非 WM_PAINT 消息驱动时用于获取设备 上下文 
GetDCEx        返回指向特定窗口客户区的整个窗口句柄,是 GetDC 的扩展 

Ÿ           绘图工具与颜色

1.         画笔 & 画刷 
画笔的功能是用来画直线和曲线,画刷用于指定区域的填充 
可以使用 CreatePen 和 CreateBrush 创建自定义画笔画刷,也或以使用 GetStockObject 函数获取系统默认的样式。 
HPEN hPen = CreatePen

(

       int nPenStyle,

       int nWidth,

       COLORREF rgbColor

);

              HBRUSH hBrush = CreateBrush

                            (

                                   int nHatchStyle,

                                   COLORREF rgbColor

)

              画笔画刷不再使用时应使用 DeleteObject 函数删除并释放资源

2.         颜色 
winodws 使用宏 RGB 定义绘图颜色           RGB(nRed, nGreen, nBlue)

其中 nRed, nGreen, nBlue 分别表示红,绿,蓝的数值。

3.         常用绘图函数

(1)      BOOL     MoveToEx
{

HDC hdc,

int x, int y,

LPPOINT lpPoint   // 存放原画笔位置的 POINT 结构

}

(2)      BOOL LineTo
{

HDC hdc,

int x, int y

}

(3)      BOOL Rectangle
{

HDC hdc,

int x1, int y1,         // 矩形左上角逻辑坐标

int x2, int y2          // 矩形右下角逻辑坐标

}

(4)      BOOL Polygon
{

HDC hdc,

LPPOINT lpPoints,              // 包含各顶点坐标的 POINT 数组

int nCount                    // 多边形顶点个数

}

 

 

Ÿ           应用实例 – 简单的图形绘制

 #include  windows.h > 
 
#include 
 math.h > 
 
 

 const   double  pi  =   3.1415926 ;

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, UINT wParam, LONG lParam)

 {

       HDC hDC;

       HBRUSH hBrh;

       HPEN hPen;

       POINT oldPt;

       PAINTSTRUCT ptStr;
 // 定义绘图信息结构体 
 

       
 switch (iMsg)

       
 {

       
 case  WM_PAINT: // 处理绘图信息 
 

              hDC 
 =  BeginPaint(hWnd,  & ptStr); // 获取设备上下文 
 

              SetMapMode(hDC, MM_TEXT);
 // 设置映射模式 
 

 

              hPen 
 =  (HPEN)GetStockObject(BLACK_PEN); // 获取默认黑色画笔 
 

              SelectObject(hDC, hPen);
 // 将画笔选入 
设备上下文 
 

              hBrh 
 =  (HBRUSH)(GetStockObject(DKGRAY_BRUSH)); // 深灰色画刷 
 

              SelectObject(hDC, hBrh);

              RoundRect(hDC, 
 50  50  200  350  25  25 ); // 圆角矩形 
 

              hBrh 
 =  (HBRUSH)(GetStockObject(HOLLOW_BRUSH)); // 虚画刷,填充无效果 
 

              SelectObject(hDC, hBrh);

              Pie(hDC, 
 300  50  400  300  300  50  400  50 ); // 饼图

 

              
 // 一个五角星 
 

              MoveToEx(hDC, 
 500  150  & oldPt);

              LineTo(hDC, 
 650  150 );

              LineTo(hDC, 
 525  250 );

              LineTo(hDC, 
 575  100 );

              LineTo(hDC, 
 625  250 );

              LineTo(hDC, 
 500  150 );

 

              
 // 坐标系 
 

              MoveToEx(hDC, 
 700  150  & oldPt);

              LineTo(hDC, 
 700  300 );

              LineTo(hDC, 
 1500  300 );

              MoveToEx(hDC, 
 700  300  & oldPt);

              
 // 近似的正弦曲线 
 

              
 for ( int  i = 0 ; i   3000  ++ i)

              
 {

                     LineTo(hDC, 
 700 + i * 20  300 - sin(i) * 20 );

              }
 

 
 

              EndPaint(hWnd, 
 & ptStr); // 结束绘图 
 

              
 return   0 ;

       
 case  WM_DESTROY:

              PostQuitMessage(
 0 );

              
 return   0 ;

       
 default : // 其它消息的默认处理函数 
 

              
 return  (DefWindowProc(hWnd, iMsg, wParam, lParam));

       }
 

 
}
 

 
 

 // 对窗口进行初始化 
 

BOOL InitWindow(HINSTANCE hInst, 
 int  nCmdShow)

 {

       HWND hWnd;

       hWnd 
 =  CreateWindow( " WinFill "  // 类名 
 

                                          
 " 填充示例 " ,     // 标题 
 

                                          WS_SYSMENU,    
 // 窗口风格 
 

                                          
 0  0  // 窗口左上角坐标 
 

                                          CW_USEDEFAULT, CW_USEDEFAULT,    
 // 窗口宽高 
 

                                          NULL, NULL,

                                          hInst,

                                          NULL);

       
 if ( ! hWnd)

       
 {

              
 return  FALSE;

       }
 

 
       ShowWindow(hWnd, nCmdShow);

       UpdateWindow(hWnd);

       
 return  TRUE;

}
 

 
 

BOOL InitWindowClass(HINSTANCE hInst)

 {

       WNDCLASS wndClass;

       wndClass.cbClsExtra 
 =   0 ;

       wndClass.cbWndExtra 
 =   0 ;

       wndClass.hbrBackground 
 =  (HBRUSH)GetStockObject(WHITE_BRUSH);

       wndClass.hCursor 
 =  LoadCursor(NULL, IDC_ARROW);

       wndClass.hIcon 
 =  LoadIcon(NULL,  " END " );

       wndClass.hInstance 
 =  hInst;

       wndClass.lpfnWndProc 
 =  WndProc;

       wndClass.lpszClassName 
 =   " WinFill " ;

       wndClass.lpszMenuName 
 =   " NULL " ;

       wndClass.style 
 =  CS_HREDRAW  |  CS_VREDRAW;

 

       
 return  RegisterClass( & wndClass);

}
 

 
 

 int  APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     
 int        nCmdShow)

 {

       MSG msg;

       
 if ( ! InitWindowClass(hInstance))

       
 {

              
 return  FALSE;

       }
 

 
       
 if ( ! InitWindow(hInstance, nCmdShow))

       
 {

              
 return  FALSE;

       }
 

 
       
 while (GetMessage( & msg,  0  0  0 ))

       
 {

              TranslateMessage(
 & msg);

              DispatchMessage(
 & msg);

       }
 

 
       
 return  msg.wParam;

}
0 0
原创粉丝点击