




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章 绪论l 图形用户界面(GUI=Graphical User Interface)的概念、组成与优点GUI的概念:Graphical User Interface=图形用户界面,是计算机的一种人机接口。组成:由图形显示设备(屏幕)和指示跟踪设备(鼠标、跟踪球、光笔/手写笔、触摸屏)组成,用户可通过指示设备来操作图形设备上的界面元素(窗口、菜单、对话框、图标)以完成各种工作。优点:与DOS等基于命令行的字符界面的OS相比,GUI形象直观、使用方便、人性化,不需记忆各种命令和参数,各种应用软件之基本功能的操作一致或相似。有大量API供程序员调用,图形界面的编程相对DOS要简单。l Windows的特点、GDI的概念与特点Windows的主要特点有:面向对象、消息/事件驱动、多任务、图形设备接口GDI与设备无关。GDI概念:Graphics Device Interface与设备无关的图像设备接口。特点:应用程序可使用同一函数,可在不同的打印机和显示器上输出同一个图形。l Windows编程的特点1面向对象的编程思想2消息/事件驱动的程序结构3资源共享与数据交换4与设备无关GDI编程5.NETl Windows编程的语言工具选择n 小型/应用软件Visual Basicn 大型/系统软件Visual C+n 通用/数据库软件Delphi (Pascal) / PowerBuildern 网络/安全软件Javan Web/XML软件Java / Visual C#l Windows API编程的步骤、入口函数和程序结构 SDK (Software Development Kit软件开发工具包) API(Application Program Interface 应用程序接口)步骤: 运行VS 创建新项目 编写源代码(也可以直接将已有的源文件加到项目中) 编译、连接并运行入口函数:int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / handle to previous instance LPSTR lpCmdLine, / pointer to command line int nCmdShow / show state of window);窗口类结构:typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS;l MFC的概念、特点与优势MFC的概念:Microsoft Foundation Class Library = 微软基础类库,是Windows API的C+类封装,用于VC的Windows编程。MFC封装了Windows SDK的结构、功能、应用程序框架等内部技术,屏蔽了重复繁琐的实现细节,简化了程序员的工作。l 主要的MFC类及其功能(1) 根类CObjectCObject类可提供下列基础服务:l 序列化(Serialization把对象存入文件/从文件中提取对象)支持l 在运行时的类信息(识别对象的类型)l 对象诊断信息输出l 与类组(collection classes)的兼容性(2) 应用程序构架类(Application Architecture Classes)CCmdTarget(命令目标)类是MFC中所有可接收和响应消息对象类的基类,CWinApp、CDocument和CWnd都是从它派生的。l CWinApp(Windows应用程序)类是应用程序的入口主程序类(其中封装并隐藏了WinMain函数),负责初始化和运行应用程序。l CDocument(文档)类对应于用户文件,支持对文件的创建、装入和保存。l CWnd(窗口)类是所有窗口的基类。(3) 窗口类CWndCWnd类是从CCmdTarget类派生的窗口基类,它封装了一个窗口句柄,定义了消息处理机制,并提供了操作窗口所必须的成员函数。(4) 图形绘制对象类CGdiObjectCGdiObject类(图形设备接口对象)提供大量GDI函数,可用于其各种派生类中,如:CPen(画笔)、CBrush(画刷)、CFont(字体)、CBitmap(位图)、CPalette(调色板)、CRng(绘图区域)(5) 设备上下文类CDC设备上下文(DC = Device-Context设备环境/设备描述表)是由GDI管理的数据结构,直接从CObject派生的CDC是DC的封装,保存着(显示/打印)设备的属性和绘图工具,并提供了多种简单图形的绘制函数。(6) 其他类直接从CObject派生的常用类还有:CFile(文件)、CMenu(菜单)。不是从CObject派生的独立类中常用的有:CArchive(存档)、CPoint(点)、CRect(矩形)、CSize(尺寸)、CString(串)、CTime(时间)等l 最简单的MFC程序/ Hello.cpp#include / MFC头文件class CHelloApp : public CWinApp / 应用程序类virtual BOOL InitInstance(); / 初始化实例虚函数;BOOL CHelloApp:InitInstance() / 初始化应用程序实例的成员函数CFrameWnd *pFrmWnd = new CFrameWnd(); / 创建框架窗口对象pFrmWnd-Create(NULL, LHello world!); / 创建框架窗口m_pMainWnd = pFrmWnd; / 将该框架窗口作为应用程序的主窗口pFrmWnd-ShowWindow(m_nCmdShow); / 显示主窗口return TRUE;CHelloApp theApp; / 唯一的CSHelloApp对象第2章 界面程序设计l Windows操作系统的基本界面元素Windows是一种具有GUI的操作系统,GUI包括:窗口、菜单、对话框和控件等基本界面元素,及MFC提供的工具栏和状态栏等组合控件,还有键盘、鼠标等消息响应与事件驱动。l 菜单设计的一般步骤1:打开菜单编辑器2:编辑菜单3:联接菜单快捷键4:响应菜单项l 动态灰化/禁止/激活菜单项可用CMenu的成员函数UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );来灰化/禁止/激活菜单项。其中l 参数nEnable可取值:MF_DISABLED、MF_ENABLED或MF_GRAYED,及与2)中类似的参数MF_BYCOMMAND或MF_BYPOSITIONl 参数nIDEnableItem的含义与取值同2)中的l 返回值:为调用此函数时菜单项的激活状态,可为MF_DISABLED、MF_ENABLED或MF_GRAYED。若指定的菜单项不存在,则返回0xFFFFFFFF(-1)afx_msg void OnUpdateNameLs(CCmdUI* pCmdUI);ON_UPDATE_COMMAND_UI(ID_NAME_LS, OnUpdateNameLs)void CStudentView:OnUpdateNameLs(CCmdUI* pCmdUI) pCmdUI-Enable(FALSE);pCmdUI-SetCheck(TRUE);(独立的)CCmdUI类的常用成员函数有:virtual void Enable( BOOL bOn = TRUE ); / 禁止/激活virtual void SetCheck( int nCheck = 1 ); / 已选中/未选中virtual void SetText( LPCTSTR lpszText ); / 设置菜单项文本串l 工具条与状态条的概念、组成与功能工具条/栏(tool bar)和状态条/栏(status bar)是构建友好GUI程序的通用标准,但它们并不是Windows API的标准部件,而是由应用程序框架(MFC)增加的一类控件。工具条是CToolBar类的对象,状态条是CStatusBar类的对象,这两个类都是控制条(栏)CControlBar的派生类,而CControlBar类又是从CWnd类派生的工具条由若干可分组的图形按钮组成,在应用程序中单击一个按钮后,会像菜单项和快捷键一样发送一个命令消息(一般对应于一个菜单项消息)。可以响应UI消息来改变按钮状态和图形。状态条既不接受用户输入,也不产生命令消息,只能显示提示/状态信息和其他文本串。状态条窗口由若干文本窗格(pane)组成,窗格分成两类:消息行窗格和状态指示窗格。若想在状态条中显示应用程序数据,则必须禁用标准的状态条。l 对话框的分类,各类对话框的特点 (1) 模式对话框与无模式对话框按工作方式不同,可将对话框分成两类:模式对话框(modal dialog box模态对话框):在关闭模式对话框之前,该程序不能进行其他工作(如“打开文件”对话框)无模式对话框(modeless dialog box非模态对话框):模式对话框打开后,该程序仍然能够进行其他工作(如“查找与替换”对话框)(2) 公用对话框与用户对话框按编程方式不同,还可将Windows对话框分成两类:公用对话框(common dialog boxes通用/公共对话框):Windows提供的一组标准用户接口对话框,包括文件、颜色、字体、查找替换、页面设置、打印等对话框。公用对话框的资源与处理代码被封装在动态连接库文件comdlg32.dll中,该文件一般放在Windows系统安装目录下的system32子目录中,可供所有的Win32应用程序调用。用户对话框(user dialog box):用户自己创建的对话框,对话框的资源与处理代码都由程序员自己来编写。l 创建和使用自定义用户模式对话框的主要步骤n 创建对话框资源:使用对话框编辑器创建对话框资源(如添加各种控件,调整控件的大小与位置,设置控件的ID与内容)n 创建对话框类:使用“MFC类向导”对话框创建CDialog的派生类,并将它与已经创建对话框资源ID相关联n 添加类变量:使用“添加成员变量向导”对话框向派生的对话框类中添加成员变量n 添加消息处理:使用“事件处理程序向导”为对话框中的(按钮和编辑框等可生成事件的)控件添加消息处理函数,编写处理代码n 初始化:在用户对话框类的OnInitDialog函数中,对对话框中的控件做初始化设置,主要是设置应用程序的各种输入和选择参数的初值n 接受用户输入:在用户对话框类的OnOK虚拟成员函数(用户按对话框中的“确定”钮IDOK退出对话框时调用)中,编写接受各种输入和选择参数的代码n 使用对话框:在视图类中的需要处,创建对话框对象,用其成员函数DoModal打开对话框l 常用的公用对话框及其对应的MFC类 CFileDialog:文件对话框类 CColorDialog:颜色对话框类 CFontDialog:字体对话框类 CFindReplaceDialog:查找替换对话框类 CPageSetupDialog:页面设置对话框类 CPrintDialog:打印对话框类l 打开文件公用对话框的使用编码void CStudentView:OnDlgFile()/ TODO: 在此添加命令处理程序代码wchar_t *filters = L位图文件(*.bmp)|*.bmp|可交换图形格式文件(*.gif)|*.gif|联合图像专家组文件(*.jpg;*.jpe)|*.jpg;*.jpe|所有文件(*.*)|*.*|;CFileDialog fileDlg(TRUE, Lbmp, L*.bmp, OFN_HIDEREADONLY, filters);if (fileDlg.DoModal() = IDOK) /*m_sFileName = fileDlg.GetPathName();SetDlgItemText(IDC_FILENAME, m_sFileName);CFile file;VERIFY(file.Open( m_sFileName, CFile:modeRead ) );file.Close();*/l MFC的常用控件类及其功能 CStatic(静态文本):一种静态显示的窗口,一般用于标注(label)显示静态文本串。它不能接受鼠标和键盘输入,也不能向其父窗口(对话框等)发送WM_COMMAND消息。静态控件有时也作为图片框,在其中显示图像 CEdit(编辑控件):一种可编辑文本的窗口,用于接受用户的文本输入。在该类中,提供了大量的文本编辑函数及通知消息的响应接口。如Copy、Cut、Paste、Clear、Undo、SetSel、ReplaceSel、Get Sel、GetLine,ON_EN_CHANGE(改变OnChange*)、ON_EN_SETFOCUS(获得输入焦点OnSetfocus*)、ON_EN_KILLFOCUS(失去输入焦点OnKillFocus*)。 CButton(按钮):用于执行命令。MFC在该类中为按钮(pushbutton)、复选框和单选钮提供编程接口。按钮控件有两个主要的通知消息:ON_BN_CLICKED(单击OnBnClicked*)和ON_BN_ DOUBLECLICKED(双击OnDoubleclicked*) 复选框(check box核对盒):可选中(TRUE设置状态)或不选(FALSE取消设置状态)。在一组复选框中,可以有多个复选框被选中,也可以一个复选框都不选,没有排他性 单选钮(radio button收音机钮):也可选中(TRUE设置状态)或不选(FALSE取消设置状态),但在一组单选钮中,每次只能有一个单选钮被选中,且必须有有一个被选中,具有排他性 CListBox(列表框):显示一串项目列表供用户查看和选择。常用函数有:GetSel / SetSel、GetCurSel / SetCurSel、AddString / InsertString / DeleteString等 CComboBox(组合框):是编辑框与列表框的组合。用户可在编辑框内输入和选择表项,也可从列表框中选择表项,编辑框会显示选中的表项。有三种风格的组合框: 简单组合框(CBS_SIMPLE):列表始终可见 下拉组合框(CBS_DROPDOWN):列表只是在下拉时可见,编辑框可编辑 下拉表组合框(CBS_DROPDOWNLIST):列表也只是在下拉时可见,但编辑框不可编辑 其他比较常用的控件类有:CProgressCtrl(进度控件类)、CSliderCtrl(滑块控件类)、CSpinButtonCtrl(翻滚按钮控件类)、CTabCtrl(选卡控件类)和CTreeCtrl(树形控件类)等, l 获取控件的CWnd指针、获取和设置控件中的整数和文本串的CWnd成员函数的原型获取控件的CWnd指针:CWnd* GetDlgItem( int nID ) const;获取和设置控件中的整数和文本串的CWnd成员函数的原型UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE );int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;void SetDlgItemText( int nID, LPCTSTR lpszString );l 常用的鼠标与键盘事件与消息,及对应消息响应函数的原型鼠标按下(press)和松开(release) 鼠标键、单击(click)或双击(double-click) 鼠标键、移动(move)或拖动(drag)鼠标afx_msg void OnMouseMove( UINT nFlags, CPoint point );afx_msg void OnLButtonDown( UINT nFlags, CPoint point );afx_msg void OnLButtonUp( UINT nFlags, CPoint point );afx_msg void OnLButtonDblClk( UINT nFlags, CPoint point );afx_msg void OnRButtonUp( UINT nFlags, CPoint point );注意,在Windows的鼠标消息中,并没有单击和拖动消息。编程中,单击操作一般用松开左鼠标键消息WM_LBUTTONUP来代替,如void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) CView:OnLButtonUp(nFlags, point);而拖动操作则在鼠标移动的消息响应中判断左鼠标键是否被按下来区分。如void CDrawView:OnMouseMove(UINT nFlags, CPoint point) if (nFlags&MK_LBUTTON) CView:OnMouseMove(nFlags, point);键盘输入焦点HWND SetFocus(HWND hWnd); / hWnd为将获得输入焦点的窗口指针/ 返回失去输入焦点的窗口指针HWND GetFocus(VOID); / 返回拥有输入焦点的窗口指针普通的击键和字符消息WM_KEYDOWN、WM_KEYUP和WM_CHAR所对应的消息响应函数为:afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );l 手工添加事件处理与消息响应函数的方法与步骤n 在类的头文件中添加函数原型:afx_msg void OnScoreMath(); n 在类的代码文件中添加 消息映射宏: ON_COMMAND(ID_SCORE_MATH, &CStudentView:OnScoreMath) 空函数体: void CStudentView:OnScoreMath()/ TODO: 在此添加命令处理程序代码第3章 绘图l Windows应用程序的绘图场所、MFC程序的绘图代码所在的类与函数,该函数被调用的条件绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;/ TODO: 在此处为本机数据添加绘制代码每次需要重绘窗口时(程序启动/窗口大小改变/全部或部分窗口重现/程序员调用RedrawWindow或UpdateWindow),应用程序框架都会调用该CWnd的消息响应成员函数(的覆盖)来绘制窗口客户区。在Windows中,绘图一般在视图窗口的客户区进行,使用的是MFC的设备上下文(DC = device-context)类CDC中各种绘图函数。在绘图前,必须先得到客户区大小和DC、设置绘图颜色,然后再根据文档数据或用户操作来绘制图形。l 点和尺寸类及其使用点类:其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint ); / 低字设为x、高字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);尺寸类:其构造函数也有5种:CSize( );CSize( int initCX, int initCY );CSize( SIZE initSize );CSize( POINT initPt );CSize( DWORD dwSize ); / 低字设为cx、高字设为cyl 矩形类CRect的数据成员和构造函数,判断一点是否在矩形中矩形结构RECT定义了矩形的左上角与右下角的坐标:typedef struct tagRECT LONG left; LONG top; LONG right; LONG bottom; RECT;其构造函数有6种:CRect( );CRect( int l, int t, int r, int b );CRect( const RECT& srcRect );CRect( LPCRECT lpSrcRect );CRect( POINT point, SIZE size );CRect( POINT topLeft, POINT bottomRight );有时需要判断某点(如鼠标位置)是否在某一矩形区域中,这可以调用CRect类的PtInRect函数来做:BOOL PtInRect( POINT point ) const;该函数当点point在其矩形区域内时,返回真。注意,该矩形区域不包括矩形的右边界和底边界。l 创建与设置绘图的笔与刷的颜色、粗细、类型像素(pixel)的颜色是直接由设备上下文类CDC的成员函数SetPixel来设置的,该函数的原型为:COLORREF SetPixel( int x, int y, COLORREF crColor );COLORREF SetPixel( POINT point, COLORREF crColor );l 创建笔对象:创建笔类CPen对象的方法有如下两种:n 使用构造函数CPenCPen( int nPenStyle, int nWidth, COLORREF crColor );其中:nPenStyle为笔的风格,可取值:符号常量数字常量风格名称线例PS_SOLID0实心PS_DASH1虚线PS_DOT2点线PS_DASHDOT3虚点线PS_DASHDOTDOT4虚点点线PS_NULL5空笔PS_INSIDEFRAME6框内注意:04号笔风格只是在笔宽=0或1时有效,笔宽1时总为实心的。u nWidth为笔宽,与映射模式有关,使用缺省映射时为像素数,若nWidth = 0,则不论什么映射模式,笔宽都为一个像素;u crColor为笔的颜色值。例如CPen* pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128);CPen grayPen(PS_SOLID, 0, RGB(128, 128, 128);n 使用成员函数CreatePenBOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );如:CPen grayPen;grayPen.CreatePen(PS_SOLID, 0, RGB(128, 128, 128);n 缺省的笔为单像素宽的实心黑色笔l 构造函数有4个:n CBrush( ); / 创建一个刷的空对象n CBrush( COLORREF crColor ); / 创建颜色为crColor的实心刷n CBrush( int nIndex, COLORREF crColor ); / 创建风格由nIndex指定且颜色为crColor的条纹(hatch孵化)刷,其中nIndex可取条纹风格(Hatch Styles)值:符号常量数字常量风格HS_HORIZONTAL0水平线HS_VERTICAL1垂直线HS_FDIAGONAL2正斜线HS_BDIAGONAL3反斜线HS_CROSS4十字线(正网格)HS_DIAGCROSS5斜十字线(斜网格) 水平线 垂直线 正斜线 反斜线 十字线 斜十字线n CBrush( CBitmap* pBitmap ); / 创建位图为pBitmap的图案刷如:pDC-FillRect( &rect, new CBrush( RGB(r, g, b) ) );l 与构造函数相对应,有多个创建不同类型刷的成员函数:n BOOL CreateSolidBrush( COLORREF crColor );n BOOL CreateHatchBrush( int nIndex, COLORREF crColor );n BOOL CreatePatternBrush( CBitmap* pBitmap );n BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );n BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );n BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );n BOOL CreateSysColorBrush( int nIndex );l 预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH(白刷)l 缺省的刷为空刷可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:(缺省的前景色为黑色,背景色空)COLORREF GetTextColor( ) const;virtual COLORREF SetTextColor( COLORREF crColor );COLORREF GetBkColor( ) const; virtual COLORREF SetBkColor( COLORREF crColor );l 各种绘图函数所在的MFC类,DC的概念与使用DC的概念: 在Windows中,绘图使用的是MFC的设备上下文(DC = device-context)类CDC中各种绘图函数。CDC类是直接从CObject类派生的:CObject CDC使用: 1)获得DC可以从OnDraw函数的输入参数pDC或调用CWnd的成员函数GetDC:CDC* GetDC( );来获得DC的指针。2)释放DC从OnDraw函数的输入参数pDC获得的DC,在该函数运行结束后,系统会自动释放。但由GetDC所获得的DC,必须自己来释放,这可以通过调用CWnd的成员函数ReleaseDC来完成:int ReleaseDC( CDC* pDC ); / 成功返回非0l 基本绘图函数(画点、直线、矩形和椭圆)画像素点函数的原型为:COLORREF SetPixel( int x, int y, COLORREF crColor ); 或COLORREF SetPixel( POINT point, COLORREF crColor );其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。例如pDC-SetPixel(i, j, RGB(r, g, b);画线状图l 当前位置:设置当前位置为(x, y)或point:(返回值为原当前位置的坐标)CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point );l 画线:使用DC中的笔从当前位置画线到点(x, y)或point:(若成功返回非0值):BOOL LineTo( int x, int y ); 或BOOL LineTo( POINT point );l 画折线:使用DC中的笔,依次将点数组lpPoints中的nCount(2)个点连接起来,形成一条折线:BOOL Polyline( LPPOINT lpPoints, int nCount );l 画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:BOOL Polygon( LPPOINT lpPoints, int nCount );l 画矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用DC中的刷填充其内部区域:BOOL Rectangle( int x1, int y1, int x2, int y2 ); 或BOOL Rectangle( LPCRECT lpRect );有时需要根据用户给定的任意两个点来重新构造左上角和右下角的点,例如:rect = CRect(min(p0.x, point.x), min(p0.y, point.y), max(p0.x, point.x), max(p0.y, point.y); l 画圆角矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形的边线,并用宽x3或point.x高y3或point.y矩形的内接椭圆倒角,再用DC中的刷填充其内部区域:BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );BOOL RoundRect( LPCRECT lpRect, POINT point );例如:int d = min(rect.Width(), rect.Height() / 4;pDC- RoundRect(rect, CPoint(d, d);l 画(椭)圆:使用DC中的笔在左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:BOOL Ellipse( int x1, int y1, int x2, int y2 );BOOL Ellipse( LPCRECT lpRect );注意,CDC中没有画圆的专用函数。在这里,圆是作为椭圆的(宽高相等)特例来画的。l 绘制简单图形的步骤与代码void CDrawView:OnDraw(CDC* pDC) CRect rect;GetClientRect(rect);pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(1000,1000);pDC-SetViewportExt(rect.right, -rect.bottom);pDC-SetViewportOrg(rect.right / 2, rect.bottom /2);pDC-Ellipse(CRect(-500, -500, 500, 500);通过以上代码自己分析其步骤l Windows映射模式的概念与功用,常用的映射模式,适用于打印输出的映射模式映射模式(map mode)影响所有的图形和文本绘制函数,它定义(将逻辑单位转换为设备单位所使用的)度量单位和坐标方向,Windows总是用逻辑单位来绘图。映射模式的nMapMode取值与含义符号常量数字常量x方向y方向逻辑单位的大小MM_TEXT1向右向下像素MM_LOMETRIC2向右向上0.1 mmMM_HIMETRIC3向右向上0.01 mmMM_LOENGLISH4向右向上0.01 inMM_HIENGLISH5向右向上0.001 inMM_TWIPS6向右向上1/1440 in MM_ISOTROPIC7自定义自定义自定义MM_ANISOTROPIC8自定义自定义自定义应该除了MM_TEXT之外的模式都可以用于打印输出(不确定)l 缺省的映射模式及其与其他预定义映射模式的主要区别除了可以从上面的表中直接看出一些区别之外,还有比较重要的如下: 对所有非MM_TEXT映射模式,有如下重要规则:n CDC的成员函数(如各种绘图函数)具有逻辑坐标参数n CWnd的成员函数(如各种响应函数)具有设备坐标参数(如鼠标位置point)n 位置的测试操作(如CRect的PtInRect函数)只有使用设备坐标时才有效n 长期使用的值应该用逻辑坐标保存(如窗口滚动后保存的设备坐标就无效了)因此,为了使应用程序能够正确工作,除MM_TEXT映射模式外,其他映射模式都需要进行单位转换。l 绘图模式的概念,缺省绘图模式,常用绘图模式,设置绘图模式概念:绘图模式(drawing mode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原有图的颜色(scCol)相结合而得到结果像素色(pixel)。设置: 可使用CDC类的成员函数SetROP2 (ROP = Raster OPeration光栅操作)来设置绘图模式: int SetROP2( int nDrawMode );其中,nDrawMode可取值:绘图模式nDrawMode的取值符号常量作用运算结果R2_BLACK黑色pixel = blackR2_WHITE白色pixel = whiteR2_NOP不变pixel = pbColR2_NOT反色pixel = scColR2_COPYPEN覆盖pixel = pbColR2_NOTCOPYPEN反色覆盖pixel = pbColR2_MERGEPENNOT反色或pixel = scCol | pbColR2_MERGENOTPEN或反色pixel = scCol | pbColR2_MASKNOTPEN与反色pixel = scCol & pbColR2_MERGEPEN或pixel = scCol | pbColR2_NOTMERGEPEN或非pixel = (scCol | pbCol)R2_MASKPEN与pixel = scCol & pbColR2_NOTMASKPEN与非pixel = (scCol & pbCol)R2_XORPEN异或pixel = scCol pbColR2_NOTXORPEN异或非pixel = (scCol pbCol)其中,R2_COPYPEN(覆盖)为缺省绘图模式,R2_XORPEN(异或)较常用。l 画拖放动态图形的思路与步骤class CDrawView : public CView /protected:BOOL m_bLButtonDown, m_bErase; / 判断是否按下左鼠标键/和是否需要擦除图形的类变量CPoint p0, pm; / 记录直线起点和动态终点的类变量CPen * pGrayPen, * pLinePen; / 定义灰色和直线笔/ 构造函数CDrawView:CDrawView() m_bLButtonDown = FALSE; / 设左鼠标键按下为假m_bErase = FALSE; / 设需要擦除为假pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128); / 创建灰色笔pLinePen = new CPen(PS_SOLID, 0, RGB(255, 0, 0); / 创建红色的直线笔/ 鼠标消息响应函数void CDrawView:OnLButtonDown(UINT nFlags, CPoint point) m_bLButtonDown = TRUE; / 设左鼠标键按下为真SetCapture(); / 设置鼠标捕获p0 = point; / 保存矩形左上角CView:OnLButtonDown(nFlags, point);void CDrawView:OnMouseMove(UINT nFlags, CPoint point) if (m_bLButtonDown) / 左鼠标键按下为真CDC* pDC = GetDC(); / 获取设备上下文pDC-SelectObject(pGrayPen); / 选取灰色笔pDC-SetROP2(R2_XORPEN); / 设置为异或绘图方式if (m_bErase) / 需要擦除为真pDC-MoveTo(p0); pDC-LineTo(pm); / 擦除原直线else / 需要擦除为假m_bErase = TRUE; / 设需要擦除为真pDC-MoveTo(p0); pDC-LineTo(point); / 绘制新直线pm = point; / 记录老终点ReleaseDC(pDC); / 释放设备上下文CView:OnMouseMove(nFlags, point);void CDrawView:OnLButtonUp(UINT nFlags, CPoint point) ReleaseCapture(); / 释放鼠标捕获if (m_bLButtonDown) / 左鼠标键按下为真CDC* pDC = GetDC(); / 获取设备上下文pDC-SelectObject(pGrayPen); / 选取灰色笔pDC-SetROP2(R2_XORPEN); / 设置为异或绘图方式pDC-MoveTo(p0); pDC-LineTo(pm); / 擦除原直线pDC-SelectObject(pLinePen); / 选择直线笔pDC-SetROP2(R2_COPYPEN); / 设置为覆盖绘图方式pDC-MoveTo(p0); pDC-LineTo(point); / 绘制最终的直线m_bLButtonDown = FALSE; / 重设左鼠标键按下为假m_bErase = FALSE; / 重需要擦除为假ReleaseDC(pDC); / 释放设备上下文CView:OnLButtonUp(nFlags, point);l 常用的文本输出函数TextOut与DrawText的使用TextOutvirtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );BOOL TextOut( int x, int y, const CString& str );其中,x与y为显示串的左上角坐标,lpszString或str为要显示的文本串,nCount为串lpszString中的字符数。例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年住院医师规培-新疆-新疆住院医师规培(眼科)历年参考题库含答案解析(5套)
- 2025年住院医师规培-新疆-新疆住院医师规培(医学检验科)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-重庆-重庆计算机文字录入处理员五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-重庆-重庆广播电视天线工一级(高级技师)历年参考题库典型考点含答案解析
- 培训与知识学习
- 中医科面试真题及答案详解
- 气体充装行业安全知识培训课件
- 全国农产品质量安全考试题库及答案
- 钢结构工程质量控制方案
- 2025年中国邮政集团有限公司河南省分公司社会招聘笔试历年参考题库及答案
- 2023年辅警招聘-公共基础知识考试题库(含答案)
- 巷道围岩注浆加固施工安全技术措施
- 实验中学初一新生分班考试数学试卷附答案
- 区治安巡防队员面试题
- 施工组织设计施工总体部署完整版
- TUPSW微机控制电力专用不间断电源(UPS)系统使用说明书
- 骨质疏松诊治与中医药
- LY/T 2383-2014结构用木材强度等级
- GB/T 528-2009硫化橡胶或热塑性橡胶拉伸应力应变性能的测定
- 中日关系历史
- GB/T 15171-1994软包装件密封性能试验方法
评论
0/150
提交评论