1 / 48

该类中包含哪些成员类型

该类中包含哪些成员类型. class base { public: base( ){} void display(int i) { cout<<"i="<<i<<endl; } virtual inline void view() { cout<<"****"<<endl; } };. 静态成员 虚函数 默认构造函数 内联函数 默认拷贝构造函数. Windows 图形设备接口及 windows 绘图. // 改变图形的映像模式. #include <windows.h>.

mandar
Download Presentation

该类中包含哪些成员类型

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 该类中包含哪些成员类型 class base { public: base( ){} void display(int i) { cout<<"i="<<i<<endl; } virtual inline void view() { cout<<"****"<<endl; } }; 静态成员 虚函数 默认构造函数 内联函数 默认拷贝构造函数

  2. Windows图形设备接口及windows绘图

  3. //改变图形的映像模式 #include <windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; char lpszClassName[] = "映像模式"; char lpszTitle[]= "My_Map_Mode";

  4. wndclass.style = 0; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = lpszClassName ;

  5. if( !RegisterClass( &wndclass)) { MessageBeep(0) ; return FALSE ; } hwnd = CreateWindow( lpszClassName, lpszTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL) ; ShowWindow( hwnd, nCmdShow) ; //显示窗口 UpdateWindow(hwnd);

  6. while( GetMessage(&Msg, NULL, 0, 0)) //消息循环 { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } return Msg.wParam; //消息循环结束时将信息返回系统 }

  7. LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HBRUSH hB1,hB2; static HPEN hP1; static int nMode;//定义映像模式变量nMode

  8. switch(message){ //窗口创建时设置映像模式为MM_TEXT case WM_CREATE: nMode=MM_TEXT; //单击鼠标左键更改映像模式为MM_ISOTROPIC case WM_LBUTTONDOWN: nMode=MM_ISOTROPIC; InvalidateRect(hwnd,NULL,1);//刷新用户区 break; //单击鼠标右键更改显示模式为MM_ANISOTROPIC case WM_RBUTTONDOWN: nMode=MM_ANISOTROPIC; InvalidateRect(hwnd,NULL,1); //刷新用户区 break;

  9. case WM_PAINT: hdc=BeginPaint(hwnd,&ps);//取得设备环境句柄 SetMapMode(hdc,nMode);//设置映像模式 SetWindowExtEx(hdc,150,150,NULL); //设置窗口区域 SetViewportExtEx(hdc,150,100,NULL); //设置视口区域 SetViewportOrgEx(hdc,150,60,NULL); //设置视口原点 //定义画刷和画笔 hP1=CreatePen(PS_DASHDOT,2,RGB(255,0,0)); hB1=CreateHatchBrush(HS_CROSS,RGB(0,255,255)); //定义白色画刷 hB2=(HBRUSH)GetStockObject(GRAY_BRUSH); //定义黑色画刷

  10. SelectObject(hdc,hP1); SelectObject(hdc,hB1); //将黑白画刷选入设备环境 //绘图 RoundRect(hdc,0,0,200,200,30,30); //使用当前画笔绘制一个带圆角的矩形,并用当前画刷填充 SelectObject(hdc,hB2); //更改当前画刷为黑色画刷 Ellipse(hdc,0,10,200,140); //使用当前画笔绘制椭圆,并用当前画刷填充 EndPaint(hwnd,&ps);//释放设备环境句柄 break;

  11. case WM_DESTROY: DeleteObject(hB1); //退出窗口时删除画刷和画笔 DeleteObject(hB2); DeleteObject(hP1); PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; }

  12. 坐标系统 • 逻辑坐标 当前映射模式下的坐标,输出区域称为窗口 • 设备坐标 以象素为单位的坐标 • 屏幕坐标系统 • 窗口坐标系统 • 用户区坐标系统 输出区域称为视口 • 物理坐标 以现实世界中的实际长度为单位的坐标

  13. 固定比例的映射模式 • MM_HIENGLISH 0.001英寸 • MM_HIMETRIC 0.01毫米 • MM_LOENGLISH 0.01英寸 • MM_LOMETRIC 0.1毫米 • MM_TWIPS 1/1440英寸 以上映射模式中,除MM_TEXT方式为Y向下为正,X向右为正,其余全为Y向上为正,X向右为正。

  14. 可变比例映射模式 程序员自定义窗口坐标和视口坐标,由以下两种方式完成窗口和视口之间的坐标转换 • MM_ANISOTROPIC 完全按窗口和视口的坐标比例进行映像 • MM_ISOTROPIC 不改变图形的比例,即图形不发生失真,但是可能导致系统强制变换视口。

  15. 窗口区域定义 BOOL SetWindowExtEx( HDC hdc,// 设备环境句柄 int nXExtent,// 以逻辑单位表示的新窗口宽度int nYExtent,// 以逻辑单位表示的新窗口高度LPSIZE lpSize// 函数调用前窗口区域尺寸 //如果为NULL,表示忽略调用前尺寸 ); 例如: SetWindowExtEx(hdc,300,300,NULL);

  16. 视口区域定义 BOOL SetViewportExtEx( HDC hdc, // 设备环境句柄 int nXExtent,// 以设备单位表示的新窗口宽度int nYExtent,// 以设备单位表示的新窗口高度LPSIZE lpSize// 函数调用前窗口区域尺寸 //如果为NULL,表示忽略调用前尺寸 ); 例如:SetViewportExtEx(hdc,150,500,NULL);

  17. 窗口原点设置 BOOL SetWindowOrgEx( HDC hdc, // 设备环境句柄 int X, int Y, LPPOINT lpPoint// 保存函数调用前窗口尺寸 ); 将窗口中的X,Y点作为视口中的原点。

  18. 视口原点设置 BOOL SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint// 函数调用前原点坐标); 将窗口的原点映射为视口的X,Y点 设置原点时只能使用SetWindowOrgEx和SetViewportOrgEx其中之一,而且视口原点永远是左上角

  19. 比较固定比例和可变比例模式 • 在固定比例的映射模式下 • 只需设定映射模式 • X,Y轴的方向以映射方式的不同而不同 • 在可变比例映射模式下 • 同时设定逻辑坐标和设备坐标。 • X,Y轴的方向可设。 • 在设备坐标中,左上角为原点。

  20. 图形刷新 WM_PAINT消息的产生场合: • 当调用UpdateWindow(hwnd)函数绘制客户区时。 • 用户区遇到窗口大小调整,窗口移动或被其他对象覆盖需要刷新。Windows根据刷新请求的产生情况对刷新消息进行处理,这种处理可分三种情况。 • 调用InvalidateRect函数

  21. 窗口移动后的刷新 • 用户区移动或显示 • 用户窗口大小改变 • 程序通过滚动条滚动窗口 系统向应用程序发送WM_PAINT消息,程序员自定义刷新方式。

  22. 被覆盖区域的刷新 • 下拉式菜单关闭 • Windows清除对话框或消息框等对象,恢复被覆盖的部分。 这种情况发生时,windows系统试图保存被覆盖的区域,以备日后刷新,如果系统不能有效刷新,则向应用程序发送WM_PAINT消息,所以程序员必须定义刷新方法。

  23. 对象穿越后的刷新 • 光标穿过用户区 • 图标穿过用户区 这种情况下,windows系统自动完成刷新任务,应用程序不必考虑。

  24. 发送刷新消息 • BOOL InvalidateRect( HWND hWnd,//窗口句柄 const RECT *lpRect, //无效矩形,可由程序员指定,若为 NULL,代表整个客户区 BOOL bErase//是否擦除背景 ); 该函数使系统发送一个WM_PAINT消息

  25. 常用刷新方法 • 对于位图等复杂图形。在内存中保持一个显示输出的副本,刷新时将副本拷贝到窗口中。 • 简单图形。图形处理程序放在WM_PAINT消息相应模块中,刷新时重新绘制 • 记录曾经发生的事,刷新时重新执行这个事件

  26. 获取设备环境 获取设备环境有两种方法,当用于图形刷新时,调用BeginPaint函数,操作区域为无效矩形,当用于其他场合时,调用GetDC函数,操作区域为整个用户区。 • 调用BeginPaint函数 • 调用GetDC函数

  27. 无效矩形 窗口被另一个窗口覆盖的区域称为无效区域,windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构包含了包围无效区域的最小矩形结构。 Typedef struct tagPAINTSTRUCT{ HDC hdc; //设备环境句柄 BOOL fErase; //是否擦除无效矩形背景 RECT rcPaint; //无效矩形标识 BOOL fRestore; //系统保留 BOOL fIncUpdate; //系统保留 BYTE rgbReserved[16]; //系统保留 }PAINTSTRUCT;

  28. 调用BeginPaint函数 HDC BeginPaint( HWND hwnd, // 窗口句柄 LPPAINTSTRUCT lpPaint// 包含绘图信息的结构体 ); 设备环境必须用EngPaint函数释放: BOOL EndPaint( HWND hWnd, CONST PAINTSTRUCT *lpPaint); 例如: hdc=BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); 只有在响应WM_PAINT消息时才调用BeginPaint函数。该函数保护光标。

  29. 调用GetDC函数 HDC GetDC( HWND hWnd); 使用ReleaseDC释放: int ReleaseDC( HWND hWnd, // 窗口句柄 HDC hDC // 设备环境句柄 ); 例如: hdc=GetDC(hwnd); ReleaseDC(hwnd,hdc); GetDC的使用范围比较广泛。

  30. 绘图工具 • 画笔 • 画笔创建 HPEN hP; //定义画笔句柄 //获取系统定义的画笔: hP=(HPEN)GetStockObject(BLACK_PEN); Windows系统定义了三种画笔: BLACK_PEN 黑色画笔 WHITE_PEN 白色画笔 DC_PEN 画笔颜色可用SetDCPenColor改变

  31. 用户自定义画笔: HPEN CreatePen( int fnPenStyle, // 画笔样式 int nWidth, // 画笔宽度 COLORREF crColor// 画笔颜色); 七种画笔样式: PS_ DASH 虚线 PS_DASHDOT 点划线 PS_DOT 点线 PS_INSIDEFRAME 实线 PS_NULL 无 PS_SOLID 实线 PS_DASHDOTDOT 双点划线

  32. 将画笔选入设备环境 SelectObject(hdc,hP); 函数返回值保存上一次使用的画笔 例如: • 删除画笔 DelectObject(hP);

  33. 画刷应用 • 画刷创建 HBRUSH hBr;//定义画刷句柄 //调用系统提供的画刷: hBr=GetStockObject(nBrushStyle); 系统提供7种画刷: BLACK_BRUSH 黑色画刷 LTGRAY_BRUSH 亮灰色 DKGRAY_BRUSH 深灰色 NULL_BRUSH 空画刷 GRAY_BRUSH 灰色 WHITE_BRUSH 白色画刷 HOLLOW_BRUSH 虚画刷 例如: hBr=(HBRUSH)GetStockObject(BLACK_BRUSH);

  34. //用户自定义画刷 hBr=CreateSolidBrush(rgbColor); //创建具有指定颜色的单色画刷 HBRUSH CreateHatchBrush( int fnStyle, // 画刷阴影样式 COLORREF clrref// 画刷颜色 ); //创建具有指定阴影和颜色的画刷 画刷阴影模式: HS_BDLAGONAL 135度阴影 HS_DLAGCROSS 45度交叉线 HS_FDLAGONAL 45度阴影 HS_CROSS 垂直交叉阴影 HS_HORIZONTAL 水平阴影 HS_VERTICAL 垂直阴影

  35. 选入设备环境 SelectObject(hdc,hBr); • 删除画刷 DeleteObject(hBr);

  36. 颜色设置 • 宏RGB定义绘图颜色 RGB( nRed, //取值1~255 nGreen, //取值1~255 nBlue //取值1~255 ) 例如: RGB(255,0,0); //红色 RGB(125,125,125) //灰色

  37. SetDCPenColor函数 COLORREF SetDCPenColor( HDChdc, COLORREFcrColor // 新颜色); 例如: SelectObject(hdc,GetStockObject(DC_PEN)); SetDCPenColor(hdc,RGB(0,255, 0);

  38. 常用绘图函数 • 设置画笔当前位置 BOOL MoveToEx( HDC hdc, int X, int Y, //新画笔位置 LPPOINTlpPoint// 保存原画笔位置);

  39. 从当前坐标向指定位置画直线 BOOL LineTo( HDC hdc, int nXEnd, int nYEnd //直线的终止坐标 );

  40. 从当前位置开始依次连接各点 BOOLPolyline( HDChdc, constPOINT*lppt, //存放各点坐标的数组 intcPoints //数组中的点数(>=2) );

  41. 绘制椭圆弧线 BOOL Arc( HDC hdc, int X1,int Y1,//外接矩形左上角坐标 int X2,int Y2,//外接矩形右下角坐标 int X3,int Y3,//椭圆弧线起始点坐标 int X4,int Y4,//椭圆弧线终止点坐标 )

  42. 绘制饼图 BOOL Pie( HDC hdc, int X1,int Y1,//外接矩形左上角坐标 int X2,int Y2,//外接矩形右下角坐标 int X3,int Y3,//椭圆弧线起始点坐标 int X4,int Y4,//椭圆弧线终止点坐标 )

  43. 绘制矩形并填充 BOOLRectangle( HDChdc, intnLeftRect, intnTopRect, //矩形左上角坐标 intnRightRect, intnBottomRect //矩形右下角坐标 );

  44. 绘制圆角矩形并填充 BOOLRoundRect( HDChdc, intnLeftRect, intnTopRect, //矩形左上角坐标 intnRightRect, intnBottomRect, //矩形右下角坐标 intnWidth, //圆角宽度 intnHeight //圆角高度 );

  45. 绘制椭圆并填充 BOOLEllipse( HDChdc, intnLeftRect, intnTopRect, //外接矩形左上角坐标 intnRightRect, intnBottomRect //外接矩形右下角坐标 );

  46. 绘制多边形并填充 BOOLPolygon( HDChdc, constPOINT*lpPoints, //多边形各点坐标 intnCount //多边形顶点个数 );

More Related