MFC期末考试资料_第1页
MFC期末考试资料_第2页
MFC期末考试资料_第3页
MFC期末考试资料_第4页
MFC期末考试资料_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MFC期末考试资料

第1章绪论

•图形用户界血(GUl=GraphicalUserInterface)的概念、组成'J优点

GUI的概念:GraphicalUserInterfaceTII形用户界面,是计算机的一种人机接口。

组成:由图形显示设备(屏幕)和指示跟踪设备(鼠标、跟踪球、光笔/手写笔、触摸屏)组成,用户

可通过指示设备来操作图形设备上的界面元素(窗口、菜单、对话框、图标)以完成各种工作。

优点:与DOS等基于命令行的字符界面的OS相比,GUI形象直观、使用方便、人性化,不需记忆

各种命令和参数,各种应用软件之基本功能的操作一致或相似。有大量API供程序员调用,图形界面的编

程相对DOS要简单。

•Windows的特点、GDI的概念与特点

Windows的主要特点有:面向对象、消息/事件驱动、多任务、图形设备接口GDI与设备无关。

GDI概念:GraphicsDevice11^命©6=与设备无关的图像设备接口。

特点:应用程序可使用同一函数,可在不同的打印机和显示器1:输出同•个图形。

•Windows编程的特点

1.面向对象的编程思想

2.消息/事件驱动的程序结构

3.资源共享与数据交换

4.与设备无关GDI编程

5..NET

•Windows编程的语言工具选择

■小型/应用软件VisualBasic

■大型/系统软件VisualC++

■通用/数据库软件Delphi(Pascal)/PowerBuilder

■网络/安全软件Java

■Wcb/XML软件Java/VisualC#

•WindowsAPI编程的步骤、入口函数和程序结构

SDK(SoftwareDevelopmentKit软件开发工具包)

API(ApplicationProgramInterface应用程序接口)

步骤:

>运行VS

>创建新项目

>编写源代码(也可以直接将已有的源文件加到项目中)

>编译、连接并运行

入口函数:

intW1NAPIWinMain(

HINSTANCEhlnstance,//handletocurrentinstance

HINSTANCEhPrcvInstance,//handletopreviousinstance

LPSTRIpCmdLine,//pointertocommandline

intnCmdShow//showstateofwindow

);

窗口类结构:

typedefstruct_WNDCLASS{

UINTstyle;

WNDPROCIpfnWndProc;

intcbClsExtra;

inicbWndExtra;

HANDLEhlnstance;

EICONhlcon;

HCURSORhCursor;

HBRUSHhbrBackground;

LPCTSTRIpszMenuName;

LPCTSTRIpszClassName;

}WNDCLASS;

•MFC的概念、特点与•优势

MFC的概念:MicrosoftFoundationClassLibrary=微软基础类库,是WindowsAPI的C++类封装,用

于VC的Windows编程。

MFC封装了WindowsSDK的结构、功能、应用程序框架等内部技术,屏蔽了重复繁琐的实现细节,

简化了程序员的工作。

•主要的MFC类及其功能

(1)根类CObject

CObject类可提供下列基础服务:

•序列化(Serialization把对象存入文件/从文件中提取对象)支持

•在运行时的类信息(识别对象的类型)

•对象诊断信息输出

•与类组(collectionclasses)的兼容性

(2)应用程序构架类(ApplicationArchitectureClasses)

CCmdTarget(命令目标)类是MFC中所有可接收和响应消息对象类的基类,CWinApp、CDocumcnt

和CWnd都是从它派生的。

•CWinApp(Windows应用程序)类是应用程序的入口4<程序类(其中封装并隐藏了WinMain函数),

负责初始化和运行应用程序。

•CDocument(文档)类对应于用户文件,支持对文件的创建、装入和保存。

•CWnd(窗口)类是所有窗口的基类。

⑶窗口类CWnd

CWnd类是从CCmdTarget类派生的窗口基类,它封装了一个窗口句柄,定义了消息处理机制,并提

供了操作窗口所必须的成员函数。

(4)图形绘制对象类CGdiObject

CGdiObject类(图形设备接口对象)提供大量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(时间)等

•最简单的MFC程序

//Hello.cpp

#include<afxwin.h>//MFC头文件

classCHelloApp:publicCWinApp{//应用程序类

virtualBOOLInitlnstance();//初始化实例虚函数

};

BOOLCHelloApp::InitInstance(){〃初始化应用程序实例的成员函数

CFrameWnd*pFrmWnd=newCFrameWnd();//创建框架窗II对象

pFrmWnd->Create(NULL,L"Helloworld!");//创建框架窗口

m_pMainWnd=pFrmWnd;//将该框架窗II作为应用程J表的上窗I1

pFrmWnd->ShowWindow(m_nCmdShow)://显小卜.窗口

relumTRUE;

1

CHelloApptheApp;〃唯的CSHelloApp对象

第2章界面程序设计

•Windows操作系统的基本界面元素

Windows是种具有GUI的操作系统,GUI包括:窗口、菜单、对话框和控件等基本界面元素,及

MFC提供的工具栏和状态栏等组合控件,还有键盘、鼠标等消息响应与事件驱动。

•菜单设计的一般步骤

1:打开菜单编辑器

2:编辑菜单

3:联接菜单快捷键

4:响应菜单项

•动态灰化/禁止/激活菜单项

可用CMenu的成员函数

UINTEnablcMcnuItem(UINTnlDEnabldtcm.UINTnEnable);

来灰化/禁止/激活菜单项。其中

•参数nEnable可取值:MF_DISABLED、MF_ENABLED或MF_GRAYED,及与2)中类似的参

数MF_BYCOMMAND或MF_BYPOSITION

•参数nIDEnableltem的含义与取值同2)中的

•返回值:为调用此函数时菜单项的激活状态,可为MF_D1SABLED、MF_ENABLED或

MF_GRAYED。若指定的菜单项不存在,则返回OxFFFFFFFF(-1)

afx_msgvoidOnUpdateNameLs(CCmdUI*pCmdUI);

ON_UPDATE_COMMAND_UI(ID_NAME_LS,OnUpdateNameLs)

voidCSludentView::OnUpdateNameLs(CCmdUI*pCmdUI){

pCmdUI->Enable(FALSE);

pCmdUI->SetCheck(TRUE);

)

(独立的)CCmdUI类的常用成员函数有:

virtualvoidEnable(BOOLbOn=TRUE);//禁止/激活

virtualvoidSetCheck(intnCheck=1);//L_i»选中/未选

virtualvoidSetText(LPCTSTRIpszText);//设置菜单项文本串

•工具条与状态条的概念、组成与功能

工具条/栏(toolbar)和状态条/栏(statusbar)是构建友好GUI程序的通用标准,但它们并不是Windows

API的标准部件,而是由应用程序框架(MFC)增加的一类控件。

工具条是CToolBar类的对象,状态条是CStatusBar类的对象,这两个类都是控制条(栏)CControlBar

的派生类,而CControlBar类又是从CWnd类派生的

工具条由若干可分组的图形按钮组成,在应用程序中单击一个按钮后,会像菜单项和快捷键一样发送

一个命令消息(一般对应于一个菜单项消息)。可以响应UI消息来改变按钮状态和图形。

状态条既不接受用户输入,也不产生命令消息,只能显示提示/状态信息和其他文本串。状态条窗口由

若干文本窗格(pane)组成,窗格分成两类:消息行窗格和状态指示窗格。若想在状态条中显示应用程序数据,

则必须禁用标准的状态条。

•对话框的分类,各类对话框的特点

(I)模式对话框与无模式对话框

按工作方式不同,可将对话框分成两类:

模式对话框(modaldialogbox模态对话框):在关闭模式对话框之前,该程序不能进行其他工作(如“打

开文件”对话框)

无模式对话框(modelessdialogbox非模态对话框):模式对话框打开后,该程序仍然能够进行其他工作

(如“查找与替换”对话框)

(2)公用对话框与用户对话框

按编程方式不同,还可将Windows对话框分成两类:

公用对话框(commondialogboxes通用/公共对话框):Windows提供的一组标准用户接口对话框,包括

文件、颜色、字体、查找杵换、页面设置、打印等对话框。公用对话框的资源与处理代码被封装在动态连

接库文件comdlg32.dll中,该文件一般放在Windows系统安装目录下的system32子目录中,可供所有的

Win32应用程序调用。

用户对话框(userdialogbox):用户自己创建的对话框,对话框的资源与处理代码都由程序员自己来编写。

•创建和使用自定义用户模式对话框的主要步骤

■创建对话框资源:使用对话框编辑器创建对话框资源(如添加各种控件,调整控件的大小与位

置,设置控件的ID与内容)

■创建对话框类:使用“MFC类向导”对话框创建CDialog的派生类,并将它与已经创建对话框

资源ID相关联

■添加类变量:使用“添加成员变量向导”对话框向派生的对话框类中添加成员变量

■添加消息处理:使用“事件处理程序向导”为对话框中的(按钮和编辑框等可生成事件的)控

件添加消息处理函数,编写处理代码

■初始化:在用户对话框类的OnlnitDialog函数中,对对话框中的控件做初始化设置,主要是设置

应用程序的各种输入和选择参数的初值

■接受用户输入:在用户对话框类的OnOK虚拟成员函数(用户按对话框中的“确定"ffl[IDOK]

退出对话框时调用)中,编写接受各种输入和选择参数的代码

■使用对话框:在视图类中的需要处,创建对话框对象,用其成员函数DoM<xlal打开对话框

•常用的公用对话框及其对应的MFC类

>CFileDialog:文件对话框类

>CColorDialog:颜色对话框类

>CFontDialog:字体对话框类

>CFindReplaceDialog:查找替换对话框类

ACPageSetupDialog:页面设置对话框类

>CPrintDialog:打印对话框类

•打开文件公用对话框的使用编码

voidCStudentView::OnDlgFile()

//TODO:在此添加命令处理程序代码

wchar_t*filters=L"位图文件(*.bmp)l*.bmpl可交换图形格式文件

联合图像专家组文件(*加8;*/[)€)1*加8;*/即1所有文件(*产)件•*1;

CFileDialogfileDlg(TRUE,L^bmp",L"*.bmp",OFN_HIDEREADONLY,filters);

if(fileDlg.DoModalO==IDOK){

/*m_sFileName=fiIeDlg.GetPathName();

SetDlgItemText(IDC_FILENAME,m_sFileName);

CFilefile;

VERIFY(file.Open(m_sFileName,CFile::modeRead));

file.Close。;*/

}

•MFC的常用控件类及其功能

ACStatic(静态文本):一种静态显示的窗口,一般用于标注(label)——显示静态文本串。它

不能接受鼠标和键盘输入,也不能向其父窗口(对话框等)发送WM_COMMAND消息。

静态控件有时也作为图片框,在其中显示图像

>CEdit(编辑控件):一种可编辑文本的窗口,用于接受用户的文本输入。在该类中,提供

了大量的文本编辑函数及通知消息的响应接口。如Copy、Cut、Paste.Clear.Undo、SetSek

ReplaceSel,GetSekGetLine,ON_EN.CHANGE(改变OnChange*)、ON_EN_SETFOCUS(获

得输入焦点OnSetfocus*)、ON_EN_KILLFOCUS(失去输入焦点OnKiHFocus*)。

>CButton(按钮):用于执行命令。MFC在该类中为按钮(pushbutton),复选框和单选钮提

供编程接口。按钮控件有两个主:要的通知消息:ON_BN_CLICKED(单击OnBnClicked*)和

ON_BN_DOUBLECLICKED(双击OnDoubleclicked*)

>复选框(checkbox核对盒):可选中(TRUE设置状态)或不选(FALSE取消设置状态)。在・•组

复选框中,可以有多个复选框被选中,也可以一个复选框都不选,没有排他性

>单选钮(radiobutton收音机钮):也可选中(TRUE设置状态)或不选(FALSE取消设置状态),

但在一组单选钮中,每次只能有一个单选钮被选中,且必须有有一个被选中,具有排他性

>CListBox(列表框):显示••串项目列衣供用户查看和选择。常用函数有:GetSel/SetSeh

GetCurSel/SetCurSekAddString/InsertString/DeleteString等

ACComboBox(组合框):是编辑框与列表框的组合。用户可在编辑框内输入和选择表项,

也可从列表框中选择表项,编辑框会显示选中的表项。有三种风格的组合框:

>简单组合框(CBS_SIMPLE):列表始终可见

>下拉组合框(CBS_DROPDOWN):列表只是在下拉时可见,编辑框可编辑

>下拉表组合框(CBS_DROPDOWNLIST):列表也只是在下拉时可见,但编辑框不可编辑

>其他比较常用的控件类有:CProgressCtrl(进度控件类)、CSliderCtrl(滑块控件类)、

CSpinButtonCtrl(翻滚按钮控件类)、CTabCtrl(选卡控件类)和CTrceCtrl(树形控件类)

等,

•获取控件的CWnd指针、获取和设置控件中的整数和文本串的CWnd成员函数的原型

获取控件的CWnd指针:CWnd*GetDlgItem(intnlD)const;

获取和设置控件中的整数和文本串的CWnd成员函数的原型

UINTGetDlgItemInt(intnID,BOOL*IpTrans=NULL,BOOLbSigned=TRUE)const;

voidSetDlgItemInt(intnID,UINTnValue,BOOLbSigned=TRUE);

intGetDlgItemText(intnID,LPTSTRIpStr,intnMaxCount)const;

intGetDlgItemText(intnID.CString&rString)const;

voidSetDlgItemText(intnID,LPCTSTRIpszString);

•常用的鼠标与键盘事件与消息,及对应消息响应函数的原型

鼠标

按下(press)和松开(release)鼠标键、单击(click)或双击(double-click)鼠标键、移动(move)或拖动(drag)鼠标

afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);

afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);

afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);

afx_msgvoidOnLButtonDbICIk(UINTnFlags,CPointpoint);

afx_msgvoidOnRButtonUp(UINTnFlags,CPointpoint);

注意,在Windows的鼠标消息中,并没有单击和拖动消息。编程中,单击操作一般用松开左鼠标键消

息WM_LBUTTONUP来代替,如

voidCDrawView::OnLButtonUp(UINTnFlags,CPointpoint){

CView::OnLButtonUp(nFlags,point);

)

而拖动操作则在鼠标移动的消息响应中判断左鼠标键是否被按下来区分。如

voidCDrawView::OnMouseMove(UINTnFlags,CPointpoint)(

if(nFlags&MK.LBUTTON){

)

CView::OnMouseMove(nFlags,point);

)

键盘

输入焦点

HWNDSetFocus(HWNDhWnd);//hWnd为将获得输入焦点的窗口指针

//返回失去输入焦点的窗口指针

HWNDGetFocus(VOlD);//返回拥有输入焦点的窗口指针

普通的击键和字符消息WM_KEYDOWN、WM.KEYUP和WM_CHAR所对应的消息响应函数为:

afx_msgvoidOnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags);

afx_msgvoidOnKcyUp(UINTnChar,UINTnRcpCnt,UINTnFlags);

afx_msgvoidOnChar(UINTnChar,UINTnRepCnt,UINTnFlags);

•手工添加事件处理与消息响应函数的方法与步骤

■在类的头文件中添加函数原型:afx_msgvoidOnScoreMath();

■在类的代码文件中添加

>消息映射宏:

>ON_COMMAND(ID_SCORE_MATH,&CStudcntView::OnScoreMath)

>空函数体:

>voidCStudentView::OnScoreMath(){

//TODO:在此添加命令处理程序代码

)

第3章绘图

•Windows应用程序的绘图场所、MFC程序的绘图代码所在的类与函数,该函数被调用

的条件

绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:

voidCTestView::OnDraw(CDC*pDC){

CTestDoc*pDoc=GetDocument();

ASSERT.VALID(pDoc);

if(!pDoc)

return;

//TODO:在此处为本机数据添加绘制代码

}

每次需要重绘窗口时(程序启动/窗口大小改变/全部或部分窗口重现/程序员调用RedrawWindow或

UpdateWindow),应用程序框架都会调用该CWnd的消息响应成员函数(的覆盖)来绘制窗口客户区。

在Windows中,绘图一般在视图窗口的客户区进行,使用的是MFC的设备上下文(DC=device-context)

类CDC中各种绘图函数。

在绘图前,必须先得到客户区大小和DC、设置绘图颜色,然后再根据文档数据或用户操作来绘制图

形。

•点和尺寸类及其使用

点类:其构造函数有5种:

CPoint();

CPoint(intinitX,intinitY);

CPoint(POINTinitPt);

CPoinl(SIZEinitSize);

CPoint(LPARAMdwPoint);//低字设为x、高字设为y

CPoint类还定义了4个平移和设置函数:

voidOffset(intxOffset,intyOffset);

voidOffset(POINTpoint);

voidOffset(SIZEsize);

voidSetPoint(intX,intY);

尺寸类:其构造函数也有5种:

CSize();

CSize(intinitCX,intinitCY);

CSize(SIZEinitSize);

CSize(POINTinitPt);

CSize(DWORDdwSize);//低字设为ex、高字设为cy

•矩形类CRect的数据成员和构造函数,判断一点是否在矩形中

矩形结构RECT定义了矩形的左上角与右下角的坐标:

typedefstructtagRECT{

LONGleft;

LONGtop;

LONGright;

LONGbottom;

)RECT;

其构造函数有6种:

CRect();

CRect(intLintt,intr,intb);

CRect(constRECT&srcRect);

CRect(LPCRECTIpSrcRect);

CRect(POINTpoint,SIZEsize);

CRect(POINTtopLeft,POINTbottomRight);

有时需要判断某点(如鼠标位置)是否在某一矩形区域中,这可以调用CRect类的PtlnRect函数来做:

BOOLPtInRect(POINTpoint)const;

该函数当点point在其矩形区域内时,返回真。注意,该矩形区域不包括矩形的右边界和底边界。

•创建与设置绘图的笔与刷的颜色、粗细、类型

像素(pixel)的颜色是直接由设备上卜文类CDC的成员函数SetPixel来设置的,该函数的原型为:

COLORREFSetPixeKintx,inty,COLORREFcrColor);

COLORREFSetPixeKPOINTpoint,COLORREFcrColor);

•创建笔对象:创建笔类CPen对象的方法有如下两种:

■使用构造函数CPen

CPen(intnPenStyle,intnWidth,COLORREFcrColor);

其中:nPenStyle为笔的风格,可取值:

符号常量数字常量风格名称线例

PS_SOLID0实心—

PS_DASH1虚线

.

PS_DOT2点线

PS_DASHDOT3虚点线^■1■

PS_DASHDOTDOT4虚点点线

PS_NULL5空笔

PSJNSIDEFRAME6框内

注意:0~4号笔风格只是在笔宽=0或1时有效,笔宽>1时总为实心的。

♦nWidth为笔宽,与映射模式有关,使用缺省映射时为像素数,若nWidth=0,则不论

什么映射模式,笔宽都为一个像素:

♦crColor为笔的颜色值。

例如

CPen*pGrayPen=newCPen(PS_SOLID,0,RGB(128,128,128));

CPengrayPen(PS_SOLID,0,RGB(128,128,128));

■使用成员函数CreatePen

BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);

如:CPengrayPen;

grayPen.CreatePen(PS_SOLID,0,RGB(128,128,128));

■缺省的笔为单像素宽的实心黑色笔

•构造函数有4个:

■CBrush();〃创建一个刷的空对象

■CBrush(COLORREFcrColor);//创建颜色为crColor的实心刷

■CBrush(intnlndex,COLORREFcrColor);//创建风格由nlndex指定且颜色为crColor的条

纹(hatch孵化)刷,其中nlndex可取条纹风格(HatchStyles)值:

符号常量数字常量风格

HS_HORIZONTAL0水平线

HS.VERTICAL1垂直线

HS_FDIAGONAL2正斜线

HS.BDIAGONAL3反斜线

HS_CROSS4十字线(正网格)

HS_DIAGCROSS5斜十字线(斜网格)

如:pDC->FillRect(&rect,newCBrush(RGB(r,g,b)));

•与构造函数相对应,有多个创建不同类型刷的成员函数:

■BOOLCreateSolidBrush(COLORREFcrColor);

■BOOLCreateHatchBrush(intnlndex,COLORREFcrColor);

■BOOLCreatePatternBrush(CBitm叩*pBitm叩);

■BOOLCreateDIBPattemBrush(HGLOBALhPackedDIB,UINTnUsage);

■BOOLCreateDIBPatternBrush(constvoid:{:IpPackedDIB,UINTnUsage);

■BOOLCreateBrushIndirect(constLOGBRUSH*IpLogBrush);

■BOOLCreatesysColorBrush(intnlndex);

•预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰

刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、

WHITE_BRUSH(白刷)

•缺省的刷为空刷

可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:(缺省

的前景色为黑色,背景色空)

COLORREFGetTextColor()const;

virtualCOLORREFSetTextColor(COLORREFcrColor);

COLORREFGetBkColor()const;

virtualCOLORREFSetBkColor(COLORREFcrColor);

•各种绘图函数所在的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来完成:

intReleaseDC(CDC*pDC);//成功返回非0

•基本绘图函数(画点、直线、矩形和椭圆)

画像素点函数的原型为:

COLORREFSetPixeRintx,inty,COLORREFcrColor);或

COLORREFSetPixeKPOINTpoint,COLORREFcrColor);

其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。例如

pDC->SetPixel(i,j,RGB(r,g,b));

画线状图

•当前位置:设置当前位置为(x,y)或point:(返回值为原当前位置的坐标)

CPointMoveTo(intx,inty);或CPointMoveTo(POINTpoint);

•画线:使用DC中的笔从当前位置画线到点(x,y)或point:(若成功返回非0值):

BOOLLineTo(intx,inty);或BOOLLineTo(POINTpoint);

•画折线:使用DC中的笔,依次将点数组IpPoints中的nCount(>2)个点连接起来,形成一条折

线:

BOOLPolyline(LPPOINTIpPoints,intnCount);

•画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其

内部区域:

BOOLPolygon(LPPOINTIpPoints,intnCount);

•画矩形:使用DC中的笔画左上角为(xl,yl)、右下角为(x2,y2)或范围为*lpRect的矩形的边线,

并用DC中的刷填充其内部区域:

BOOLRectangle(yl,intx2,inty2);或

BOOLRectangle(LPCRECTIpRcct);

有时需要根据用户给定的任意两个点来重新构造左上角和右下角的点,例如:

rect=CRcct(min(pO.x,point.x),inin(p().y,point.y),max(pO.x,point.x),max(pO.y,point.y));

•画圆角矩形:使用DC中的笔画左上角为(xl,yl)、右下角为(x2,y2)或范围为*lpRect的矩形的

边线,并用宽x3或point.x高y3或point.y矩形的内接椭圆倒角,再用DC中的刷填充其内部

区域:

BOOLRoundRcct(intxl,intyl,intx2,inty2,intx3,inty3);

BOOLRoundRect(LPCRECTIpRect,POINTpoint);

例如:

intd=min(recl.Width(),rect.Height())/4;

pDC->RoundRect(rect,CPoint(d,d));

•画(椭)圆:使用DC中的笔在左上角为(xl,yl)、右下角为(x2,y2)或范围为*lpRect的矩形中

画内接(椭)圆的边线,并用DC中的刷填充其内部区域:

BOOLEllipse(intxl,intyl,intx2,inty2);

BOOLEllipse(LPCRECTIpRcct);

注意,CDC中没有画圆的专用函数。在这里,圆是作为椭圆的(宽高相等)特例来画的。

•绘制简单图形的步骤与代码

voidCDrawView::OnDraw(CDC*pDC){

CRectrect;

GetClientRect(rect);

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(1OCX),1OOO);

pDC->SetViewportExt(rect.right,-rect.bottom);

pDC->SetVievvportOrg(rect.right/2,rect.bottom/2);

pDC->EUipse(CRect(-500,-500,500,500));

)

通过以上代码自己分析其步骤

•Windows映射模式的概念与功用,常用的映射模式,适用于打印输出的映射模式

映射模式(m叩mode)影响所有的图形和文本绘制函数,它定义(将逻辑单位转换为设备单位所使用的)

度量单位和坐标方向,Windows总是用逻辑单位来绘图。

映射模式的nMapMode取值与含义

符号常量数字常量X方向y方向逻辑单位的大小

MM.TEXT1向右向下像素

MM.LOMETRIC2向右向上0.1mm

MM.HIMETRIC3向右向上0.01mm

MM.LOENGLISH4向右向上0.01in

MM_HIENGLISH5向右向上0.001in

MM.TWIPS6向右向上1/1440in

MMJSOTROPIC7自定义自定义自定义

MM_ANISOTROPIC8自定义自定义自定义

应该除了MM_TEXT之外的模式都可以用于打印输出(不确定)

•缺省的映射模式及其与其他预定义映射模式的主要区别

除了可以从上面的表中直接看出一些区别之外,还有比较重要的如下:

对所有非MM_TEXT映射模式,有如下重要规则:

■CDC的成员函数(如各种绘图函数)具有逻辑坐标参数

■CWnd的成员函数(如各种响应函数)具有设备坐标参数(如鼠标位置point)

■位置的测试操作(如CRect的PtlnRect函数)只有使用设备坐标时才有效

■长期使用的值应该用逻辑坐标保存(如窗口滚动后保存的设备坐标就无效了)

因此,为了使应用程序能够正确工作,除MM_TEXT映射模式外,其他映射模式都需要进行单位转换。

•绘图模式的概念,缺省绘图模式,常用绘图模式,设置绘图模式

概念:绘图模式(drawingmode)指前景色的混合方式,它决定新画图的笔和刷的颜色(pbCol)如何与原

有图的颜色(scCol)相结合而得到结果像素色(pixel)。

设置:可使用CDC类的成员函数SetROP2(ROP=RasterOPeration光栅操作)来设置绘图模式:

intSetROP2(intnDrawMode);

其中,nDrawMode可取值:

绘图模式nDrawMode的取值

符号常量作用运算结果

R2_BLACK黑色pixel=black

R2.WHITE[1色pixel=white

R2_NOP不变pixel=pbCol

R2_NOT反色pixel=-scCol

R2_COPYPEN覆盖pixel=pbCol

R2.NOTCOPYPEN反色覆盖pixel=~pbCol

R2_MERGEPENNOT反色或pixel=-scCol1pbCol

R2_MERGENOTPEN或反色pixel=scCol1-pbCol

R2.MASKNOTPEN与反色pixel=scCol&~pbCol

R2.MERGEPEN或pixel=scCol1pbCol

R2.NOTMERGEPEN或Mpixel=-(scCol1pbCol)

R2_MASKPENpixel=scCol&pbCol

R2_NOTMASKPEN与非pixel=-(scCol&pbCol)

R2_XORPEN斤或pixel=scColApbCol

R2_NOTXORPEN异或非pixel=〜(scColApbCol)

其中,R2.COPYPEN(覆盖)为缺省绘图模式,R2_X0RPEN(异或)较常用。

•画拖放动态图形的思路与步骤

classCDrawView:publicCView{

//...

protected:

BOOLm_bLButtonDown,m_bErase;//判断是否按卜一左鼠标键

〃和是否需要擦除图形的类变量

CPointpO,pm;//记录直线起点和动态终点的类变量

CPen*pGrayPen,*pLinePen;//定义灰色和直线笔

//...

1

//构造函数

CDrawView::CDrawView(){

m_bLButtonDown=FALSE;〃设左鼠标键按卜为假

m_bErase=FALSE;//设需要擦除为假

pGrayPen=newCPen(PS_SOLID,0,RGB(128,128,128));〃创建灰色笔

pLinePen=newCPen(PS_SOLID,0,RGB(255,0,0));//创建红色的直线笔

}

//鼠标消息响应函数

voidCDrawView::OnLButtonDown(UINTnFlags,CPoinlpoint){

m_bLButtonDown=TRUE;//设左鼠标键按下为真

SetCapture();//设置鼠标捕获

p0=point;//保存矩形左匕角

CView::OnLButtonDown(nFlags,point);

)

voidCDrawView::OnMouseMove(UINTnFlags,CPointpoint){

if(m_bLButtonDown){//左鼠标键按下为真

CDC*pDC=GetDCO;//获取设备上卜文

pDC->SelectObject(pGrayPen);//选取灰色竿:

pDC->SetROP2(R2_XORPEN);//设置为异或绘图方式

if(m_bErase){〃需要擦除为真

pDC->MoveTo(pO);pDC->LineTo(pm);//擦除原直.线

)

else//需要擦除为假

m.bErase=TRUE;//设需要擦除为真

pDC->MoveTo(pO);pDC->LineTo(point);//绘制新直.线

pm=point;//记录老终点

ReleaseDC(pDC);//释放设备上下文

)

CView::OnMouseMove(nFlags,point);

1

voidCDrawView::OnLBultonUp(UINTnFlags,CPointpoint){

ReleaseCapture();//样放鼠标捕获

if(m_bLButtonDown){//左鼠标键按卜为真

CDC*pDC=GetDC();//获取设备上下文

pDC->SelectObject(pGrayPen);//选取灰色虫

pDC->SetROP2(R2_XORPEN);//设置为异或绘图方式

pDC->MoveTo(pO);pDC->LineTo(pm);//擦除原直线

pDC->SelectObject(pLinePen);//选择一线笔

pDC->SetROP2(R2_COPYPEN);〃设置为覆盖绘图方式

pDC->MoveTo(pO);pDC->LineTo(point);//绘制最终的直线

m.bLButtonDown=FALSE;//重设左鼠标键按卜.为假

m_bErase=FALSE;//重需要擦除为假

ReleaseDC(pDC);//释放设备上卜.文

)

CView::OnLButtonUp(nFlags,point);

(

•常用的文本输出函数TextOut与DrawText的使用

TextOut

virtualBOOLTextOut(intx,inty,LPCTSTRIpszString,intnCount);

BOOLTcxtOut(intx,inty,constCString&str);

其中,x与y为显示串的左上角坐标,IpszString或str为要显示的文本串,nCount为串IpszString中的字符

数。例如:

pDC->TextOut(10,30,L"Testtext");

DrawText

virtualintDrawText(LPCTSTRIpszString,intnCount,LPRECTIpRect,UINTnFormat);

intDrawText(constCString&str,LPRECTIpRect,UINTnFormat);

其中,IpszString或str为要显示的文本串,nCount为串IpszString中的字符数,IpRect为指定的显示区域,

nFormat为显示格式

•DDB与DIB的概念、区别和联系,它们各有什么特点与用处,CBitmap类和Cimage类

封装的各是其中的哪一种?

DDB=DeviceDependentBitmap设备相关位图,依赖于硬件的调色板,又叫GDI位图。

DIB=DeviceIndependentBitmap设备无关位图,带有自己的颜色信息,通常存储在BMP文件中,直

接由Win32支持。DIB所包含的图像信息主要有:颜色格式、分辨率、调色板和压缩标志。有若干对应的

结构来描述这些信息,如BITMAPFILEHEADER,BITMAPINFO、BITMAPINFOHEADER1,

MFC将GDI位图封装进CBitmap类,在该类中提供了对位图的操作。所以CBitmap类属于DDB。

Cimage是VC中定义的•种MFC/ATL共享类,也是ATL的•种工具类,它提供增强型的(DDB和

DIB)位图支持,可以装入、显示、转换和保存多种格式的图像文件,包括BMP、GIF、JPG、PNG、T1F

等。从以上可以看出Cimage类既支持DDB又支持DIB。

•显示位图资源的主要步骤与编码

(1)装载位图资源

可以用CBitm叩类的成员函数LoadBitmap来装载位图资源:

BOOLLoadBitmap(UINTnIDResource);

其中,nIDResource为位图资源ID,如

IDB.LENABITMAPDISCARDABLE“res\Vena.bmp''

例如:

CBitmapbmp;

bmp.LoadBitmap(IDB_LENA);

HBITMAPhBmp=(HBITMAP)bmp.GetSafeHandle();

(2)显示资源位图

例如:

CBitmapbmp;

bmp.LoadBitmap(IDB_LENA);

BITMAPbs;

bmp.GetBitmap(&bs);

CDCde;

dc.CreateCompatibleDC(pDC);

pOldBmp=(CBitmap*)dc.SelectObject(&bmp);

pDC->BitBlt(10,10,bs.bmWidth,bs.bmHeight,&dc,0,0,SRCCOPY);

•编写位图动画的原理、方法与步骤

原理:动画是利用人的视觉滞留原理(25ms~400ms)动态生成系列相关画面以产生运动视觉的技术。

方法:所谓位图动画就是先制作好•系列表示连续画面的位图,然后按•定的时间间隔幅接幅地显示

这些位图,就可以产生动画效果。

步骤:

1)准备位图

2)加入位图资源

3)装入与删除位图

4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论