好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

可视化编程技术(4)课件.ppt

78页
  • 卖家[上传人]:桔****
  • 文档编号:574809487
  • 上传时间:2024-08-17
  • 文档格式:PPT
  • 文档大小:320.50KB
  • / 78 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 绘 图l设备文本lCPoint,CSize和CRectl绘图工具l绘图函数l文本处理l位图和位操作l图标和光标l编程范例0可视化编程技术(4) 设备文本(Device Context)l是当是当windowswindows程序必须向一个设备演示输出时所需的存储信息程序必须向一个设备演示输出时所需的存储信息的结构l设备文本提供了一张画布,人们可以在其上绘制点、直线、设备文本提供了一张画布,人们可以在其上绘制点、直线、曲线等一切可见的东西;曲线等一切可见的东西;l设备是指图形既可以在屏幕上显示,还可以在打印机、绘图设备是指图形既可以在屏幕上显示,还可以在打印机、绘图仪、虚拟现实的头盔上显示;仪、虚拟现实的头盔上显示;Windows应用程序经过设备描述表到设备驱动程序1可视化编程技术(4) 五个设备环境类–CDC:MFC设备文本的基类,利用它可以访问整个显示设备–CPaintDC:为窗口的OnPaint函数所使用的设备环境类–CClientDC:窗口客户区(不包括边框、标题栏和菜单栏)–CWindowsDC:整个应用程序窗口的设备环境–CMetaFileDC:表示Windows图元文件的设备环境类做一个画线的程序,演示各个类的作用。

      CDC *pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);CClientDC dc(this);//CClientDC dc(GetParent());dc.MoveTo(m_ptOrigin);dc.LineTo(point);CWindowDC dc(this);//CWindowDC dc(GetParent());CWindowDC dc(GetDesktopWindow());dc.MoveTo(m_ptOrigin);dc.LineTo(point);*/2可视化编程技术(4) 绘图使用方法在堆栈中构造对象:CClientDC myDC(this);myDC.Ellipse(……);通过CWnd的GetDC获得设备环境的指针,此时注意要调用ReleaseDC进行释放CDC* pDC=GetDC();pDC->Ellipse(……);ReleaseDC(pDC);Windows限制了可用设备环境的数目,如果设备环境没有被成功地删除,程序在退出之前有一小部分内存就会丢失3可视化编程技术(4) CPoint,CSize和CRect1、CPoint 封装了标准结构POINT;POINT p;p.x = 10; p.y = 10;pDC->TextOut(p.x, p.y, "POINT为一个结构为一个结构, 成员只有成员只有x,y");CPoint q, q1(10,10), q2(0,100);q=q1+q2;pDC->TextOut(q.x, q.y, "CPoint为一个类为一个类,封装了封装了POINT这个结构这个结构, 成成员有员有x,y,Offset,+,......");2、 CSize 封装了标准结构SIZE; SIZE的成员只有cx,cy, 用来定义一个矩形区域的大小(自己练习);3、CRect 封装了标准结构RECT; RECT的成员只有left ,top, right,bottom,用来定义矩形区域 (自己练习) ;4可视化编程技术(4) 绘图工具lWindows在设备文本中提供了许多绘图工具,如:CPen, CBrush, CFont和CPalette等,它们的基类是CGdiObject。

      l默认的画笔是黑色的,宽度是一个像素,默认的画刷是白色的l颜色由RGB值来指定 (1) RGB(red, green, blue) (2) 0x 00 FF FF FF B G R5可视化编程技术(4) 选择库存对象(画笔、画刷)1、选择库存对象(StockObject)函数原型(见MSDN): virtual CGdiObject *SelectStockObject(int nIndex);2、例子:在void CTestView::OnDraw中加入代码:pDC->SelectStockObject(LTGRAY_BRUSH); //(1)画圆pDC->Ellipse(50,50,150,150);pDC->SelectStockObject(BLACK_PEN); //(2)画线pDC->MoveTo(10,100);pDC->LineTo(550,100);pDC->SelectStockObject(DKGRAY_BRUSH); //(3)椭圆pDC->Ellipse(200,50,350,150);pDC->SelectStockObject(NULL_BRUSH); //(4)矩形pDC->Rectangle(400,50,500,150);6可视化编程技术(4) 自定义画笔-11、一步构造法:CPen NewPen(PS_SOLID,5,RGB(0,0,255)); 画笔风格是实线,画笔宽度是5,颜色为蓝色;2、二步构造法CPen NewPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255)); 7可视化编程技术(4) 自定义画笔-23、、将画笔选入设备文本对象将画笔选入设备文本对象CPen NewPen; //声明画笔对象声明画笔对象CPen *pOldPen; //保存原先画笔指针保存原先画笔指针NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255)); pOldPen = pDC->SelectObject(&NewPen); //将画笔选入设备文本对象将画笔选入设备文本对象pDC->Ellipse(150,100, 300, 200);pDC->MoveTo(100,200); pDC->LineTo(350,200);pDC->SelectObject(pOldPen); //恢复原先的画笔对象恢复原先的画笔对象8可视化编程技术(4) 自定义的画刷1、画刷决定填充区域的颜色和风格(1)实心(solid) 风格 CreateSolidBrush(COLORREF crColor)(2)网格(hatched)风格CreateHatchBrush(int nIndex, COLORREF crColor)(3)模式(patterned)风格,根据用户定义的位图来绘制 CreatePatternBrush(Cbitmap *pBitmap)2、一旦初始化完画刷,可调用CDC的SelectObject将画刷选入设备文本对象9可视化编程技术(4) 自定义的画刷举例//自定义画刷CBrush NewBrush;CBrush *pOldBrush;NewBrush.CreateHatchBrush(HS_CROSS,RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->Rectangle(100,100,200,200);pDC->SelectObject(pOldBrush);10可视化编程技术(4) 绘图函数l绘图函数用到的坐标都是按逻辑单位给出绘图函数用到的坐标都是按逻辑单位给出的,默认时,左上角位于坐标的,默认时,左上角位于坐标(0,0)处,逻处,逻辑单位为像素。

      辑单位为像素l绘图函数见绘图函数见p.133–设置像素、设置当前位置、画简单线、画弧、设置像素、设置当前位置、画简单线、画弧、画矩形、画椭圆和圆、画饼图、画多边形画矩形、画椭圆和圆、画饼图、画多边形…...11可视化编程技术(4) 绘图函数-11、设置像素(SetPixel)、设置当前位置(MoveTo)、画线(LineTo)、画矩形(Rectangle)、画椭圆(圆)2、画弧//pDC->Rectangle(100,100,300,200); //边界矩形//pDC->MoveTo(200,150); pDC->LineTo(300,175); //起点//pDC->MoveTo(200,150); pDC->LineTo(125,100); //终点pDC->Arc(100,100,300,200, 300,175, 125,100);3、圆角矩形pDC->RoundRect(100,100,300,200, 100,50); pDC->Ellipse(100,100,200,150);12可视化编程技术(4) 绘图函数-24、画饼图//pDC->Rectangle(100,100,300,200); //边界矩形pDC->Pie(100,100,300,200,300,100, 100,100);5、画多边形POINT point[4];point[0].x = 100; point[0].y = 100; point[1].x = 200; point[1].y = 200;point[2].x = 200; point[2].y = 100; point[3].x = 100; point[3].y = 200;pDC->Polygon(point, 4);13可视化编程技术(4) 6、填充一个区域 FloodFillpDC->Rectangle(100,100,200,200);CBrush NewBrush;CBrush *pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->FloodFill(150, 150, RGB(0,0,0));pDC->SelectObject(pOldBrush); [自己练习] 7—10,参见书P136绘图函数-314可视化编程技术(4) 绘图函数-47、用点线画一个矩形边框,在CTestView::OnLButtonDown中加入代码:CDC *pDC = GetDC();pDC->DrawFocusRect(new CRect(100,100,200,200));8、用指定画刷填充一个矩形区域,但不画边线 FillRectCBrush NewBrush;CBrush *pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->FillRect(new CRect(100,100,200,200), &NewBrush);pDC->SelectObject(pOldBrush);15可视化编程技术(4) 9、用指定画刷画一个矩形,内部不填充 FrameRect CBrush NewBrush;CBrush *pOldBrush;NewBrush.CreateSolidBrush(RGB(0,0,255));pOldBrush=pDC->SelectObject(&NewBrush);pDC->FrameRect(new CRect(100,100,200,200), &NewBrush);pDC->SelectObject(pOldBrush);绘图函数-516可视化编程技术(4) 绘图函数-610、在给定矩形内反显现有颜色 InvertRectCPen NewPen; //声明画笔对象CPen *pOldPen; //保存原先画笔指针NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255)); pOldPen = pDC->SelectObject(&NewPen); //将画笔选入设备文本对象pDC->MoveTo(100,100); pDC->LineTo(200,200);pDC->SelectObject(pOldPen); //恢复原先的画笔对象pDC->InvertRect(new CRect(100,100,200,200));17可视化编程技术(4) 绘图模式1、绘图模式指定如何将画笔颜色和被填充对象的内部颜色与显示设备上的颜色相结合;2、改变绘图模式 int SetROP2(int nDrawMode)3、绘图模式(P140)(1) R2_COPYPEN,默认绘图模式,复制;(2) R2_NOT,当前显示颜色的反色;(3) R2_XORPEN,显示颜色与画笔颜色进行异或运算;……18可视化编程技术(4) 绘图模式(R2_NOT)-11、当前显示颜色的反色:蓝色(0x000000FF)的反色为黄色(0x00FFFF00) 白色(0x00FFFFFF)的反色为黑色(0x00000000)2、例子:(1)在CTestView::OnDraw中加入代码:CBrush NewBrush, *pOldBrush; NewBrush.CreateSolidBrush(RGB(0,0,255)); pOldBrush = pDC->SelectObject(&NewBrush); pDC->Rectangle(100,10,300,100);pDC->SelectObject(pOldBrush); 19可视化编程技术(4) 绘图模式(R2_NOT)-2(2)在CTestView::OnLButtonDown中加入代码:CDC *pDC = GetDC();CPen NewPen, *pOldPen; NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255)); //与这里RGB设的颜色无关pOldPen = pDC->SelectObject(&NewPen); pDC->SetROP2(R2_NOT);pDC->MoveTo(50,50); pDC->LineTo(350,50);pDC->SelectObject(pOldPen); 20可视化编程技术(4) 绘图模式(R2_XORPEN)-11、显示颜色与画笔颜色进行异或运算:0x000000FF ∧ 0x000000FF = 0x000000000x00FFFFFF ∧ 0x000000FF = 0x00FFFF002、例子:(1)在CTestView::OnDraw中加入代码:CBrush NewBrush, *pOldBrush; NewBrush.CreateSolidBrush(RGB(0,0,255)); pOldBrush = pDC->SelectObject(&NewBrush); pDC->Rectangle(100,10,300,100);pDC->SelectObject(pOldBrush); 21可视化编程技术(4) 绘图模式(R2_XORPEN)-2(2)在CTestView::OnLButtonDown中加入代码:CDC *pDC = GetDC();CPen NewPen, *pOldPen; NewPen.CreatePen(PS_SOLID,3,RGB(0,0,255)); pOldPen = pDC->SelectObject(&NewPen); pDC->SetROP2(R2_XORPEN);pDC->MoveTo(50,50); pDC->LineTo(350,50);pDC->SelectObject(pOldPen); 22可视化编程技术(4) 绘图模式(背景颜色)-1(1)设置背景颜色: 默认时,在绘制图形或输出文本时,背景颜色是白色背景。

      可使用CDC的成员函数SetBKColor来设置新的背景颜色函数原型为:Virtual COLORREF SetBkColor(COLORREF cr);例如:SetBkColor(RGB(0, 255, 0));23可视化编程技术(4) 绘图模式(背景颜色)-2(2)设置背景模式: 设置完当前背景颜色后,若使其在输出时有效,还需要使用CDC的成员函数SetBKMode来控制显示在屏幕上时的背景颜色函数原型为:Int SetBkMode(int nBkmode);参数的值可以是OPAQUE或TRANSPARENT若为前者,则显示时背景都改变为当前颜色,为默认值24可视化编程技术(4) CRgn与区域(P132)l设置区域可以保证绘图时不超过给定的范围,不覆盖已存在的信息lMFC提供CRgn封装了区域,其成员函数有:–CreateRectRgn,CreateEllipseRgn,CreatePolygonRgn,CreatePolyPolygon…–CombineRgn可将新的区域合并起来lCDC的FillClipRgn或PaintRgn可填充区域lCDC的SelectClipRgn可设置剪裁区域l用SelectObject将裁剪区域选入设备文本中,可以防止在裁剪区域以外绘制。

      25可视化编程技术(4) CRgn举例在void CTestView::OnDraw中加入代码: //用点线画矩形边框(画出rgn大小)pDC->DrawFocusRect(new CRect(10,10,200,200)); //CRgn rgn;//rgn.CreateRectRgn(10,10,200,200);//pDC->SelectObject(rgn);pDC->MoveTo(0,50); pDC->LineTo(300, 50);pDC->MoveTo(50,0); pDC->LineTo(50, 300);26可视化编程技术(4) 映射模式-1(P137)1、在视图窗口绘制图形时,给定的坐标称为逻辑坐标,视图窗口内对象的实际坐标称为设备坐标所有绘图函数的坐标都是逻辑坐标,但鼠标消息处理函数的坐标是设备坐标2、映射模式用于定义逻辑坐标的单位与设备单位坐标间的关系(p.137)(1)约束映射模式是指比例因子固定(p.138)(2)非约束映射模式是用矩形区域推导出比例因子及轴向27可视化编程技术(4) 映射模式-23、设置映射模式调用CDC的SetMapModel逻辑坐标与设备坐标的转换 DPtoLP, LPtoDP4、默认的映射模式为MM_TEXT ,把每个逻辑单位映射成一个设备像素,X轴向右,Y轴向下。

      28可视化编程技术(4) 举例1(映射模式)// MM_TEXT : 默认映射模式; MM_HIENGLISH : 每个逻辑单位映射成0.001英寸, X轴正方向向右,Y轴正方向向上pDC->SetMapMode(MM_TEXT);// MM_HIENGLISH CRect rect;GetClientRect(&rect);int nOX = rect.right/2, nOY=rect.bottom/2;pDC->SetViewportOrg(nOX,nOY); //设置视口原点pDC->MoveTo(-20,0); pDC->LineTo(100,0); //坐标轴 XpDC->MoveTo(0,-20); pDC->LineTo(0,100); //坐标轴 YCPoint O(100, 100); int r=50; //圆心、半径pDC->Ellipse(O.x-r, O.y-r, O.x+r, O.y+r);29可视化编程技术(4) 举例2(设备坐标和逻辑坐标)1、新建Project, 在最后一步将CTestView的基类改为CScrollView2、void CTestView::OnInitialUpdate( )修改代码sizeTotal.cx = 640; sizeTotal.cy = 480;3、void CCCView::OnLButtonDown中加入代码:POINT dp, lp; //设备坐标和逻辑坐标dp = point; lp = point;CClientDC dc(this);OnPrepareDC(&dc); //根据当前滚动位置设置窗口原点dc.DPtoLP(&lp); //设备坐标逻辑坐标CString str;str.Format("单击鼠标左键DP(%d,%d), LP(%d,%d)", dp.x, dp.y, lp.x, lp.y);dc.TextOut(lp.x, lp.y, str); 拖动滚动条,单击鼠标左键,看一看结果.30可视化编程技术(4) 文本处理l文本输出函数(P141)1、TextOut 在指定位置输出文本2、DrawText在指定的矩形区域中显示格式化文本3、ExtTextOut 用当前选择字体在指定矩形区域中显示格式化文本4、TabbedTextOut 在指定位置显示字符串,并按指定的制表间距扩展制表符31可视化编程技术(4) 设置文本属性lCDC提供以下成员函数设置文本属性–SetMapMode 设置映射模式–SetBkMode 设置背景模式–SetBkColor 设置背景颜色–SetTextColor 设置文本颜色–SetTextAlign 设置文本对齐标记(P143)–SetTextCharacterExtra 设置字符间间隔值32可视化编程技术(4) 设置文本属性例子-1//SetMapMode 设置映射模式pDC->SetMapMode(MM_TEXT);//SetBkMode 设置背景模式(OPAQUE不透明(默认),TRANSPARENT 透明)pDC->SetBkMode(OPAQUE); //SetBkColor 设置背景颜色pDC->SetBkColor(RGB(100,255,255));//SetTextColor 设置文本颜色pDC->SetTextColor(RGB(0,0,255));33可视化编程技术(4) 设置文本属性例子-2//SetTextAlign 设置文本对齐标记(P143)pDC->SetTextAlign(TA_CENTER|TA_BOTTOM);//SetTextCharacterExtra 设置字符间间隔值pDC->SetTextCharacterExtra(10);pDC->TextOut(100,50,"设置文本属性");//这两条直线的交点为(100,50)pDC->MoveTo(0,50); pDC->LineTo(200, 50);pDC->MoveTo(100,0); pDC->LineTo(100, 100);34可视化编程技术(4) 获取字符属性-11、字符属性:字符大小,字符的行距等2、当前字体的完整描述(书P144)typedef struct tagTEXTMETRIC { …… LONG tmHeight; //字符高度 LONG tmExternalLeading; //行间距} TEXTMETRIC, FAR *LPTEXTMETRIC;ghtmAscenttmDescentbase line35可视化编程技术(4) 获取字符属性-23、例子:在CTestView::OnDraw中加入代码:TEXTMETRIC tm;pDC->GetTextMetrics(&tm);CString str;str.Format("字符高度(tmHeight)=%d, 行间距(tmExternalLeading)=%d", tm.tmHeight, tm.tmExternalLeading);pDC->TextOut(100,50,str);36可视化编程技术(4) 计算字符串的宽度1、计算字符串宽度 CSize GetTextExtent(const CString &str);2、在CTestView::OnDraw中加入代码:CString str;CSize sz = pDC->GetTextExtent("字");str.Format("“字”的宽度=%d, 高度=%d", sz.cx, sz.cy);pDC->TextOut(100,20,str);sz = pDC->GetTextExtent("a"); str.Format("“a”的宽度=%d, 高度=%d", sz.cx, sz.cy);pDC->TextOut(100,80,str);sz = pDC->GetTextExtent("m"); str.Format("“m”的宽度=%d, 高度=%d", sz.cx, sz.cy);pDC->TextOut(100,110,str);sz = pDC->GetTextExtent("am"); str.Format("“am”的宽度=%d, 高度=%d", sz.cx, sz.cy);pDC->TextOut(100,140,str);37可视化编程技术(4) 使用字体(库存字体)使用库存字体SelectStockObject(p.145)pDC->TextOut(100,20,"默认字体");pDC->SelectStockObject(ANSI_FIXED_FONT);pDC->TextOut(100,50,"ANSI_FIXED_FONT字体");pDC->SelectStockObject(SYSTEM_FONT);pDC->TextOut(100,80,"SYSTEM_FONT字体");38可视化编程技术(4) 使用字体(自定义字体P145)LOGFONT lf;lf.lfHeight = 30; //高度30 lf.lfWidth = 0; //默认宽度lf.lfEscapement=150; //逆时针旋转15度lf.lfWeight = FW_BOLD; //粗体lf.lfUnderline = false; //无下划线lf.lfItalic = false; //非斜体lf.lfStrikeOut = false; //无删除线lf.lfCharSet = GB2312_CHARSET;strcpy(lf.lfFaceName, "仿宋_GB2312");CFont NewFont, *pOldFont;NewFont.CreateFontIndirect(&lf);pOldFont=pDC->SelectObject(&NewFont);pDC->TextOut(100,100, "例子Example");pDC->SelectObject(pOldFont);这两种方法等价:1、创建自定义字体方法一(1) LOGFONT结构中定义逻辑字体;(2)使用CreateFontIndrect函数;2、创建自定义字体方法二CreateFont(……)见右边的例子39可视化编程技术(4) 位图和位操作1、BMP文件:(BMP深度:1,4,8,16,24,32) 图像:在 24 位格式中,图像中的每个象素都由存储为 BRG 的三字节 RGB 序列表示。

      2、位图用位模式来形成图像,MFC提供CBitmap类管理位图3、装载预定义位图使用LoadOEMBitmap4、位图可以从资源中装载LoadBitmap,见“loadbitmap用法”文档5、CDC提供有三个成员函数用于传送图形数据块:PatBlt, BitBlt, StetchBlt,可用来在设备文本对象中传送数据或从一个设备文本对象传送数据到另一个设备文本对象用GetDeviceCaps()用来判断设备是否支持位图操作函数40可视化编程技术(4) 使用绘图函数建立位图1、调用CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight)成员函数创建空白位图,其宽度和高度单位是象素 调用该函数时,Windows为位图保留一块内存空间2、空白位图创建后,调用成员函数CreateCompatibleDC(CDC *pDC)来建立与位图相应的内存设备文本对象若pDC为NULL,则创建与系统显示器兼容的内存设备文本对象3、调用成员函数SelectObject将位图选入内存设备文本对象4、使用绘图函数在位图内绘制位图41可视化编程技术(4) 位图举例-11、PatBlt是使用当前选择的画刷来填充一个矩形(MSDN)。

      例子:(1)将MyBitmap.bmp载入ResourceView 改名为IDB_MYBITMAP(2)在CTestView::OnDraw中加入代码:CBitmap bm;bm.LoadBitmap(IDB_MYBITMAP); //从资源中Load BMPCBrush *pOldBrush,NewBrush;NewBrush.CreatePatternBrush(&bm); //创建画刷pOldBrush=pDC->SelectObject(&NewBrush);RECT rect;GetClientRect(&rect);pDC->PatBlt( rect.left,rect.top, rect.right-rect.left, rect.bottom-rect.top, PATCOPY ); //画刷被复制到填充区域pDC->SelectObject(pOldBrush);bm.DeleteObject( );42可视化编程技术(4) 2、BitBlt将图形数据块从一个位置传送到另一个位置,源和目标可以是同一设备文本对象,也可以是不同的设备文本对象(MSDN)CDC MemDC; //定义内存设备文本对象CBitmap bm; //定义CBitmap对象bm.LoadBitmap(IDB_MYBITMAP); //装载位图资源MemDC.CreateCompatibleDC(pDC);//创建内存设备文本对象MemDC.SelectObject(&bm);//将位图选入内存设备文本对象BITMAP tmp;bm.GetBitmap(&tmp); //获得位图参数pDC->BitBlt(20,20,tmp.bmWidth,tmp.bmHeight,&MemDC,0,0,SRCCOPY);bm.DeleteObject();位图举例-243可视化编程技术(4) 位图举例-3//用下面这条语句替换上面红色语句,看看变化://pDC->BitBlt(20,20,tmp.bmWidth,tmp.bmHeight,&MemDC,50,50,SRCCOPY);3、StretchBlt可以执行所有用BitBlt可以执行的操作,还可改变图形数据块的大小(用下面这条语句替换上面红色语句)pDC->StretchBlt(20,20, 2*tmp.bmWidth, 2*tmp.bmHeight, &MemDC,0,0,tmp.bmWidth,tmp.bmHeight, SRCCOPY);44可视化编程技术(4) 4、如果想直接从文件装载BMP图片将这条语句bm.LoadBitmap(IDB_MYBITMAP);用下面三条语句替代即可:HBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL,"MyBitmap.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);bm.Attach(hBitmap);注意:文件名使用相对路径,如"..\\MyBitmap.bmp"45可视化编程技术(4) 图标1、图标是一种特殊形式的位图,与位图不同的是,、图标是一种特殊形式的位图,与位图不同的是,图标具有固定的大小图标具有固定的大小2、、CWinApp的的LoadStandardIcon函数用于装载函数用于装载Windows系统预定义的图标系统预定义的图标P1523、如果使用图形编辑器创建的图标资源,必须调、如果使用图形编辑器创建的图标资源,必须调用用CWinApp的的LoadIcon来装载来装载46可视化编程技术(4) 1.将将IDI_WINFACE.ICO载入载入ResourceView 改名为改名为IDI_WINFACE2.在在CTestView::OnDraw中加入代码:中加入代码: HICON hIcon;RECT rect;GetClientRect(&rect);hIcon=AfxGetApp()->LoadIcon(IDI_WINFACE);int x, y;x = ( rect.right - GetSystemMetrics(SM_CXICON) )/2;y = ( rect.bottom - GetSystemMetrics(SM_CYICON) )/2;pDC->DrawIcon(x,y,hIcon);3. 将上面程序中的红色语句替换为下面语句,看看结果:将上面程序中的红色语句替换为下面语句,看看结果:hIcon=AfxGetApp()->LoadStandardIcon(IDI_QUESTION);图标举例47可视化编程技术(4) 光标1、光标用于表示进行鼠标操作时鼠标的位置和形状、光标用于表示进行鼠标操作时鼠标的位置和形状2、、CWinApp的的LoadStandardCursor函数用于装函数用于装载载Windows系统预定义的光标系统预定义的光标P1543、如果使用图形编辑器创建的光标资源,必须调用、如果使用图形编辑器创建的光标资源,必须调用CWinApp的的LoadCursor来装载来装载4、、Windows的的API函数函数SetCursor可以设置光标形可以设置光标形状状48可视化编程技术(4) 1、在CTestView::OnLButtonDown中加入代码: SetCapture(); //捕获鼠标HCURSOR hCursor; //存放鼠标光标句柄hCursor = AfxGetApp()->LoadStandardCursor(IDC_CROSS);SetCursor(hCursor); //设置自定义光标(这里为十字形)RECT rect; GetClientRect(&rect); //获取视图窗口客户区坐标ClientToScreen(&rect); //转换客户区坐标为屏幕坐标ClipCursor(&rect); //将光标限定在视图窗口客户区内光标举例-149可视化编程技术(4) 2、在CTestView::OnLButtonUp中加入代码:ReleaseCapture(); //释放鼠标捕获并恢复正常输入释放鼠标捕获并恢复正常输入ClipCursor(NULL); //使光标可以移到屏幕任意位置使光标可以移到屏幕任意位置HCURSOR hCursor; //存放鼠标光标句柄存放鼠标光标句柄hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);SetCursor(hCursor); //恢复默认光标恢复默认光标3、自定义光标(1)自定义光标资源,命名为 IDC_MYCURSOR(2)将上一页中的红色语句改为:hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);光标举例-250可视化编程技术(4) 1、Windows系统的设备无关特性使得通过设备文本传给ondraw成员函数而实现的绘制调用,同样可用于在屏幕和打印机等设备上进行绘制。

      2、文档打印时,ondraw接收到的设备文本不是CPaintDC对象,而是与当前打印机相关的CDC对象3、OnDraw通过设备文本进行相同的调用,就像在屏幕中显示文档一样4、当用AppWizard创建应用程序的框架时,已经具备了简单的打印功能,见~view类打印(P155)51可视化编程技术(4) 1、开始逐页打印之前,On将调用CDC::StartDoc,对于待打印的每一页,在开始打印之前,On要调用CView::OnPrepareDC,CDC::StartPage,CView::OnPrint和CDC::EndPage2、OnPrepareDC用于初始化每页的设备文本,例如创建映射模式、创建字体等3、StartPage开始打印新的一页,并通知设备驱动程序新数据已到,EndPage结束一页的打印4、OnPrint负责每一页的打印工作,其实现代码一般不用编写5、OnEndPrinting用于释放在OnBeginPrinting中申请的资源注:打印预览与打印进行的工作类似打印循环52可视化编程技术(4) 编程范例53可视化编程技术(4) 处理视图l在视图类中添加成员变量protected:int m_Draw;HCURSOR m_hCursor;CPoint m_pOld;CPoint m_pOrigin;l初始化成员变量 m_Draw=0; m_hCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);54可视化编程技术(4) l添加处理鼠标左钮按下的消息m_pOld=point;m_pOrigin=point;SetCapture();m_Draw=1;RECT rect;GetClientRect(&rect);ClientToScreen(&rect);ClipCursor(&rect);55可视化编程技术(4) l添加处理鼠标移动的消息SetCursor(m_hCursor);if (m_Draw){CClientDC dc(this);dc.SetROP2(R2_NOT);dc.MoveTo(m_pOrigin);dc.LineTo(m_pOld);dc.MoveTo(m_pOrigin);dc.LineTo(point);m_pOld=point;}56可视化编程技术(4) l添加处理鼠标左钮抬起的消息if (m_Draw){m_Draw=0;ReleaseCapture();ClipCursor(NULL);}l定制视图窗口PreCreateWindowcs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,(HBRUSH)::GetStockObject(WHITE_BRUSH),0);l修改窗口标题(P161)57可视化编程技术(4) 处理文档l创建存放直线坐标的类class CMyLine:public CObject{protected:int m_StartX;int m_StartY;int m_EndX;int m_EndY;public:CMyLine(int StartX,int StartY,int EndX,int EndY);void DrawLine(CDC *pDC);};58可视化编程技术(4) CMyLine::CMyLine(int StartX,int StartY,int EndX,int EndY){m_StartX=StartX;m_StartY=StartY;m_EndX=EndX;m_EndY=EndY;}void CMyLine::DrawLine(CDC *pDC){pDC->MoveTo(m_StartX,m_StartY);pDC->LineTo(m_EndX,m_EndY);}59可视化编程技术(4) l在文档类中添加处理直线集合的数据成员和成员函数protected:CObArray m_ObArray;public:void AddLine(int Startx,int StartY,int EndX,int EndY);CMyLine *GetLine(int index);int GetTotalLine();60可视化编程技术(4) CObArray集合类说明...CObArrayCObArray的对象的对象 由CObject派生的对象Add(...), GetUpperBound(…), RemoveAt(…)GetAt(…), GetSize(…), RemoveAll(…)61可视化编程技术(4) void CExampleDoc::AddLine(int StartX,int StartY,int EndX,int EndY){ CMyLine *pMyLine=new CMyLine(StartX,StartY,EndX,EndY);m_ObArray.Add(pMyLine);}CMyLine *CExampleDoc::GetLine(int index){ if (index<0||index>m_ObArray.GetUpperBound())return 0;return(CMyLine *)m_ObArray.GetAt(index);}int CExampleDoc::GetTotalLine(){ return m_ObArray.GetSize(); }62可视化编程技术(4) l 在OnLButtonUp中添加存放直线坐标的处理CExampleDoc *pDoc=GetDocument();pDoc->AddLine(m_pOrigin.x,m_pOrigin.y,point.x,point.y);l 修改视图类的OnDraw成员函数int index;index=pDoc->GetTotalLine();while (index--)pDoc->GetLine(index)->DrawLine(pDC);63可视化编程技术(4) l删除文档数据,重载DeleteContents函数int index;index=m_ObArray.GetSize();while(index--)delete m_ObArray.GetAt(index);m_ObArray.RemoveAll();64可视化编程技术(4) l处理“撤消”命令向菜单ID_EDIT_UNDO发COMMAND和UPDATE_COMMAND_UI消息 int index;index=m_ObArray.GetUpperBound();if(index>=0){delete m_ObArray.GetAt(index);m_ObArray.RemoveAt(index);}UpdateAllViews(NULL); pCmdUI->Enable(m_ObArray.GetSize());65可视化编程技术(4) 串行化处理l编写CMyLine对象的串行化代码–在CMyLine类中添加DECLARE_SERIAL宏和默认构造函数: CMyLine(){} DECLARE_SERIAL(CMyLine)–在CMyLine类中添加成员函数Serialize virtual void Serialize(CArchive& ar);–在CMyLine的实现文件之前添加IMPLEMENT_SERIAL(CMyLine,CObject,1)66可视化编程技术(4) void CMyLine::Serialize(CArchive& ar){ if (ar.IsStoring())ar<>m_StartX>>m_StartY>>m_EndX>>m_EndY;}–向文档类添加串行化代码 m_ObArray.Serialize(ar);67可视化编程技术(4) 设置修改标记l修改标记用于指示文档是否包含未保存的数修改标记用于指示文档是否包含未保存的数据,该标记由据,该标记由CDocument类维护类维护SetModifiedFlag();68可视化编程技术(4) 滚动处理l添加滚动功能–将视图类的基类从CView改为CScrollViewl转换坐标–在鼠标处理函数内转换设备坐标为逻辑坐标 CClientDC dc(this); OnPrepareDC(&dc);dc.DPtoLP(&point);l限制绘图区域的大小–重载OnInitialUpdate() 函数SIZE Size={640,480}; SetScrollSizes(MM_TEXT,Size);69可视化编程技术(4) 窗口分割l修改主边框窗口类修改主边框窗口类–在父边框中嵌入如下成员变量:在父边框中嵌入如下成员变量:CSplitterWnd m_wndSplitter;–重载父边框的成员函数重载父边框的成员函数OnCreateClient –return m_wndSplitter.Create(this,2,2,CSize(20,20),pContext);l更新视图更新视图 pDoc->UpdateAllViews(NULL);70可视化编程技术(4) 通过鼠标拖动圆范例l在在~view.h中添加数据成员中添加数据成员private:CRect m_ellipse;CPoint m_mousePos;BOOL m_bCaptured;l初始化数据成员初始化数据成员m_ellipse=CRect(0,0,100,100);m_bCaptured = FALSE;71可视化编程技术(4) 用户区域旧圆位置新圆位置72可视化编程技术(4) l在在OnDraw中添加画椭圆的函数中添加画椭圆的函数 pDC->SelectStockObject(GRAY_BRUSH);pDC->Ellipse(m_ellipse); l加入加入OnLButtonDownOnLButtonDown消息消息 73可视化编程技术(4) CRect rect; CRgn circle;circle.CreateEllipticRgnIndirect(m_ellipse);if (circle.PtInRegion(point)){SetCapture();m_bCaptured = TRUE;m_mousePos = point;::SetCursor(::LoadCursor(NULL,IDC_CROSS));}74可视化编程技术(4) l加入OnLButtonUp处理函数 if (m_bCaptured){ReleaseCapture();m_bCaptured = FALSE;}l加入OnMouseMove处理函数CSize offset;CRect tempRect,newRect, invalidRect,clientRect;75可视化编程技术(4) if (m_bCaptured){ GetClientRect(clientRect);if (clientRect.PtInRect(point)){offset = point - m_mousePos;newRect = m_ellipse+offset; tempRect.UnionRect(m_ellipse,newRect); invalidRect.IntersectRect(tempRect, clientRect); InvalidateRect(invalidRect,TRUE);m_mousePos = point;m_ellipse = newRect;}}76可视化编程技术(4) 第二次作业(15分)l编制一个有创意的程序,程序中需包含如下功能(不仅限此功能):–带有快捷选单,点击后有一定意义;–该程序具有绘图功能;–有动画操作;–具有存档功能;–程序的标题和相应的图标、菜单及工具栏具有特定含义l例如:–设计一个带有(Line,Ellipse,Rectangle)快捷选单的程序,当用户选择选单上的某一项时,在窗口客户区可用鼠标左钮控制输出该图形,并能保存到文档中。

      –当用户按键盘上“M”键时,有一位图(该位图用户自由设计)可沿上述图形的边缘缓慢移动77可视化编程技术(4) 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.