480 likes | 635 Views
该类中包含哪些成员类型. class base { public: base( ){} void display(int i) { cout<<"i="<<i<<endl; } virtual inline void view() { cout<<"****"<<endl; } };. 静态成员 虚函数 默认构造函数 内联函数 默认拷贝构造函数. Windows 图形设备接口及 windows 绘图. // 改变图形的映像模式. #include <windows.h>.
E N D
该类中包含哪些成员类型 class base { public: base( ){} void display(int i) { cout<<"i="<<i<<endl; } virtual inline void view() { cout<<"****"<<endl; } }; 静态成员 虚函数 默认构造函数 内联函数 默认拷贝构造函数
//改变图形的映像模式 #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";
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 ;
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);
while( GetMessage(&Msg, NULL, 0, 0)) //消息循环 { TranslateMessage( &Msg) ; DispatchMessage( &Msg) ; } return Msg.wParam; //消息循环结束时将信息返回系统 }
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
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;
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); //定义黑色画刷
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;
case WM_DESTROY: DeleteObject(hB1); //退出窗口时删除画刷和画笔 DeleteObject(hB2); DeleteObject(hP1); PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; }
坐标系统 • 逻辑坐标 当前映射模式下的坐标,输出区域称为窗口 • 设备坐标 以象素为单位的坐标 • 屏幕坐标系统 • 窗口坐标系统 • 用户区坐标系统 输出区域称为视口 • 物理坐标 以现实世界中的实际长度为单位的坐标
固定比例的映射模式 • 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向右为正。
可变比例映射模式 程序员自定义窗口坐标和视口坐标,由以下两种方式完成窗口和视口之间的坐标转换 • MM_ANISOTROPIC 完全按窗口和视口的坐标比例进行映像 • MM_ISOTROPIC 不改变图形的比例,即图形不发生失真,但是可能导致系统强制变换视口。
窗口区域定义 BOOL SetWindowExtEx( HDC hdc,// 设备环境句柄 int nXExtent,// 以逻辑单位表示的新窗口宽度int nYExtent,// 以逻辑单位表示的新窗口高度LPSIZE lpSize// 函数调用前窗口区域尺寸 //如果为NULL,表示忽略调用前尺寸 ); 例如: SetWindowExtEx(hdc,300,300,NULL);
视口区域定义 BOOL SetViewportExtEx( HDC hdc, // 设备环境句柄 int nXExtent,// 以设备单位表示的新窗口宽度int nYExtent,// 以设备单位表示的新窗口高度LPSIZE lpSize// 函数调用前窗口区域尺寸 //如果为NULL,表示忽略调用前尺寸 ); 例如:SetViewportExtEx(hdc,150,500,NULL);
窗口原点设置 BOOL SetWindowOrgEx( HDC hdc, // 设备环境句柄 int X, int Y, LPPOINT lpPoint// 保存函数调用前窗口尺寸 ); 将窗口中的X,Y点作为视口中的原点。
视口原点设置 BOOL SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint// 函数调用前原点坐标); 将窗口的原点映射为视口的X,Y点 设置原点时只能使用SetWindowOrgEx和SetViewportOrgEx其中之一,而且视口原点永远是左上角
比较固定比例和可变比例模式 • 在固定比例的映射模式下 • 只需设定映射模式 • X,Y轴的方向以映射方式的不同而不同 • 在可变比例映射模式下 • 同时设定逻辑坐标和设备坐标。 • X,Y轴的方向可设。 • 在设备坐标中,左上角为原点。
图形刷新 WM_PAINT消息的产生场合: • 当调用UpdateWindow(hwnd)函数绘制客户区时。 • 用户区遇到窗口大小调整,窗口移动或被其他对象覆盖需要刷新。Windows根据刷新请求的产生情况对刷新消息进行处理,这种处理可分三种情况。 • 调用InvalidateRect函数
窗口移动后的刷新 • 用户区移动或显示 • 用户窗口大小改变 • 程序通过滚动条滚动窗口 系统向应用程序发送WM_PAINT消息,程序员自定义刷新方式。
被覆盖区域的刷新 • 下拉式菜单关闭 • Windows清除对话框或消息框等对象,恢复被覆盖的部分。 这种情况发生时,windows系统试图保存被覆盖的区域,以备日后刷新,如果系统不能有效刷新,则向应用程序发送WM_PAINT消息,所以程序员必须定义刷新方法。
对象穿越后的刷新 • 光标穿过用户区 • 图标穿过用户区 这种情况下,windows系统自动完成刷新任务,应用程序不必考虑。
发送刷新消息 • BOOL InvalidateRect( HWND hWnd,//窗口句柄 const RECT *lpRect, //无效矩形,可由程序员指定,若为 NULL,代表整个客户区 BOOL bErase//是否擦除背景 ); 该函数使系统发送一个WM_PAINT消息
常用刷新方法 • 对于位图等复杂图形。在内存中保持一个显示输出的副本,刷新时将副本拷贝到窗口中。 • 简单图形。图形处理程序放在WM_PAINT消息相应模块中,刷新时重新绘制 • 记录曾经发生的事,刷新时重新执行这个事件
获取设备环境 获取设备环境有两种方法,当用于图形刷新时,调用BeginPaint函数,操作区域为无效矩形,当用于其他场合时,调用GetDC函数,操作区域为整个用户区。 • 调用BeginPaint函数 • 调用GetDC函数
无效矩形 窗口被另一个窗口覆盖的区域称为无效区域,windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构包含了包围无效区域的最小矩形结构。 Typedef struct tagPAINTSTRUCT{ HDC hdc; //设备环境句柄 BOOL fErase; //是否擦除无效矩形背景 RECT rcPaint; //无效矩形标识 BOOL fRestore; //系统保留 BOOL fIncUpdate; //系统保留 BYTE rgbReserved[16]; //系统保留 }PAINTSTRUCT;
调用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函数。该函数保护光标。
调用GetDC函数 HDC GetDC( HWND hWnd); 使用ReleaseDC释放: int ReleaseDC( HWND hWnd, // 窗口句柄 HDC hDC // 设备环境句柄 ); 例如: hdc=GetDC(hwnd); ReleaseDC(hwnd,hdc); GetDC的使用范围比较广泛。
绘图工具 • 画笔 • 画笔创建 HPEN hP; //定义画笔句柄 //获取系统定义的画笔: hP=(HPEN)GetStockObject(BLACK_PEN); Windows系统定义了三种画笔: BLACK_PEN 黑色画笔 WHITE_PEN 白色画笔 DC_PEN 画笔颜色可用SetDCPenColor改变
用户自定义画笔: HPEN CreatePen( int fnPenStyle, // 画笔样式 int nWidth, // 画笔宽度 COLORREF crColor// 画笔颜色); 七种画笔样式: PS_ DASH 虚线 PS_DASHDOT 点划线 PS_DOT 点线 PS_INSIDEFRAME 实线 PS_NULL 无 PS_SOLID 实线 PS_DASHDOTDOT 双点划线
将画笔选入设备环境 SelectObject(hdc,hP); 函数返回值保存上一次使用的画笔 例如: • 删除画笔 DelectObject(hP);
画刷应用 • 画刷创建 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);
//用户自定义画刷 hBr=CreateSolidBrush(rgbColor); //创建具有指定颜色的单色画刷 HBRUSH CreateHatchBrush( int fnStyle, // 画刷阴影样式 COLORREF clrref// 画刷颜色 ); //创建具有指定阴影和颜色的画刷 画刷阴影模式: HS_BDLAGONAL 135度阴影 HS_DLAGCROSS 45度交叉线 HS_FDLAGONAL 45度阴影 HS_CROSS 垂直交叉阴影 HS_HORIZONTAL 水平阴影 HS_VERTICAL 垂直阴影
选入设备环境 SelectObject(hdc,hBr); • 删除画刷 DeleteObject(hBr);
颜色设置 • 宏RGB定义绘图颜色 RGB( nRed, //取值1~255 nGreen, //取值1~255 nBlue //取值1~255 ) 例如: RGB(255,0,0); //红色 RGB(125,125,125) //灰色
SetDCPenColor函数 COLORREF SetDCPenColor( HDChdc, COLORREFcrColor // 新颜色); 例如: SelectObject(hdc,GetStockObject(DC_PEN)); SetDCPenColor(hdc,RGB(0,255, 0);
常用绘图函数 • 设置画笔当前位置 BOOL MoveToEx( HDC hdc, int X, int Y, //新画笔位置 LPPOINTlpPoint// 保存原画笔位置);
从当前坐标向指定位置画直线 BOOL LineTo( HDC hdc, int nXEnd, int nYEnd //直线的终止坐标 );
从当前位置开始依次连接各点 BOOLPolyline( HDChdc, constPOINT*lppt, //存放各点坐标的数组 intcPoints //数组中的点数(>=2) );
绘制椭圆弧线 BOOL Arc( HDC hdc, int X1,int Y1,//外接矩形左上角坐标 int X2,int Y2,//外接矩形右下角坐标 int X3,int Y3,//椭圆弧线起始点坐标 int X4,int Y4,//椭圆弧线终止点坐标 )
绘制饼图 BOOL Pie( HDC hdc, int X1,int Y1,//外接矩形左上角坐标 int X2,int Y2,//外接矩形右下角坐标 int X3,int Y3,//椭圆弧线起始点坐标 int X4,int Y4,//椭圆弧线终止点坐标 )
绘制矩形并填充 BOOLRectangle( HDChdc, intnLeftRect, intnTopRect, //矩形左上角坐标 intnRightRect, intnBottomRect //矩形右下角坐标 );
绘制圆角矩形并填充 BOOLRoundRect( HDChdc, intnLeftRect, intnTopRect, //矩形左上角坐标 intnRightRect, intnBottomRect, //矩形右下角坐标 intnWidth, //圆角宽度 intnHeight //圆角高度 );
绘制椭圆并填充 BOOLEllipse( HDChdc, intnLeftRect, intnTopRect, //外接矩形左上角坐标 intnRightRect, intnBottomRect //外接矩形右下角坐标 );
绘制多边形并填充 BOOLPolygon( HDChdc, constPOINT*lpPoints, //多边形各点坐标 intnCount //多边形顶点个数 );