C++和MFC的常用总结

版权声明:转载请注明文章出处,否则不得转载! https://blog.csdn.net/hanxiaoyong_/article/details/88849461

1.窗口是Windows应用程序中的一个非常重要的元素,一个Windows程序至少有一个窗口,成为主窗口。利用窗口可以接收用户的输入和输出。

2.窗口可以分为客户区(用来显示文字或绘制图形)和非客户区(标题栏、菜单栏、系统菜单、最小化框、最大化框、可调边框)。

3.窗口可以有父窗口,有父窗口的称为子窗口。窗口有对话框、消息框的窗口。窗口的形式有按钮、单选按钮、复选框、组框、文本编辑框等。

4.窗口由窗口句柄(HWND)标识,要对窗口进行操作,首先得到窗口的句柄。系统的资源包括窗口,图标,光标等,系统在创建资源时为它们分配内存和产生资源标识号。

5.Windows程序设计是以事件驱动方式的程序设计模式,主要是基于消息。窗口过程函数是专门负责处理消息的函数。

6.Windows程序的消息是由MSG结构体来标识。消息的一般定义为WM_XXX宏的形式,XXX为某种消息的英文拼写的大写形式。例:WM_LBUTTONDOWN,WM_KEYDOWN,WM_CHAR。

消息附加信息的变量wParam(unsigned int),lParam(long int)。

7.Windows程序运行的机制:将产生的消息依次放在消息队列中,应用程序则不断的通过一个消息循环从消息队列中取出消息,进行响应。

8.Windows程序消息可以分为“进队消息”和“不进队消息”。系统将进队消息放到应用程序的消息队列中,由应用程序取出和发送。不进队消息由系统调用窗口过程直接发给窗口。

不管进队还是不进队消息都由系统调用窗口过程函数进行处理。

9.WinMain是所有Win32程序的入口点函数,当WinMain函数结束时或返回时,Windows应用程序结束。  创建一个窗口的程序实例步骤: ①、WinMain函数的定义。②创建一个窗口。③进行消息循环。④编写窗口过程函数。

10.  WinMain 函数
(1) int WINAPI WinMain(

    HINSTANCE hInstance,      // handle to current instance

    HINSTANCE hPrevInstance,  // handle to previous instance

     LPSTR lpCmdLine,          // command line

     int nCmdShow              // show state

); 

(2)窗口的创建步骤:①、设计一个窗口类②注册窗口类③创建窗口  ④显示及更新

    设计窗口类

typedef struct _WNDCLASS

{........... } ;

注册窗口类

    ATOM RegisterClass(  CONST WNDCLASS *lpWndClass);

    创建窗口

HWND CreatWindow(........);

显示及更新

BOOL   ShowWindow(.......);    // 显示窗口

BOOL   UpdateWindow(.....);   //更新窗口

(3)消息循环

    BOOL GetMessage(......);

(4) 编写窗口过程函数

 

LRESULT CALLBACK WindowProc(........);

注意:窗口过程的函数名字可以随便取如:WinSunProc

11.Win32 Application与Win32Console Application区别:

   Win32App是标准的Windows程序,完全拥有windows特性,也即我们常说的窗口应用程序,它通过GUI可以把窗口做的比较个性化。

   Win32 Console是控制台应用程序,往往是像MS-DOS窗口,我们得用键盘输入各种命令来使用它,或者CUI(字符用户接口)它是基于DOS开发平台开发应用程序,不能使用与图形有关的函数控制台程序,不过也提供了一部分访问Windows系统API的能力,比如创建窗口,对话框等。

12.C++相比C的优点:封装性(数据与操作数据的函数组织在一起)、继承性、多态性。C++是面向对象的的语言。

13.结构体:定义多个相关的变量,变量可以相同、部分相同、完全不同。结构体可以包含函数,函数称为成员函数。

Eg:struct  point

{

int x;int y;

void output()

{cout<<x<<endl<<y<<endl;}  };

14.类:定义与结构体类似。关键字为class。结构体默认情况下成员是public,类默认情况下是private。

15.类与对象。类是描述了一类事物,以及事物所具有的属性,类具有抽象性。对象是具体的,可以被销毁,而类是不能被销毁的。Eg:;类:电脑,对象:具体的一台电脑。

16构造函数:构造函数用来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。

构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。

在类中定义成员变量时,不能直接给成员变量赋初值。可以通过构造函数。在编写程序时在类的头文件中定义成员对象,在函数原文件中初始化变量。

  #include<iostream.h>

Class point

{

public:

   int x;

   int y;

point()

{x=0;y=0;}

...........};

17.析构函数:当对象生命周期结束时,释放对象所占有的资源。格式:~point()。            

18. C++函数重定义、重载、重写

重写 (override):父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。

1) 被重写的函数不能是 static 的。必须是 virtual 的 ( 即函数在最原始的基类中被声明为 virtual ) 。

2) 重写函数必须有相同的类型,名称和参数列表 (即相同的函数原型)

3) 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的

 重载 (overload):指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

 重定义 (redefining): 子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。

重写与重载的区别(override) PK (overload):

1)重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

2)重写要求参数列表相同;重载要求参数列表不同。

3)重写关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。 

注意:在 C++ 中若基类中有一个函数名被重载,在子类中重定义该函数,则基类的所有 版本将被隐藏——即子类只能用子类定义的,基类的不再可用。——名字隐藏特性。

19.::作用域表示符,指明一个函数属于哪个类或一个数据成员属于哪个类。

20.MFC(微软基础库类)是一套面向对象的函数库,以类的方式提供用户使用。

21.MFC中类的命名都是以C开头。对于一个单文档类的应用程序都有:①CmainFrame类、②C+工程名+APP为名的类、③C+工程名+Doc为名字的类、④C+工程名+View为名字的类。

MFC中也从在WinMain函数,路径为安装目录下Program Files\Microsoft Visual Studio\VC98\MFC\SRC。

22.MFC在程序编译链接时,WinMain就为该程序的一部分。

22.Afx位前缀的函数都是全局函数,可以在程序的任何地方调用。Afc代表应用程序框架类。

23.如果在工程文件中查找某个函数或字符串可以用Edit下的“Find in Files”,

或用Ctrl+F快捷键。F9为设置断点,F7为编译。F5为调试运行。

24.API函数:操作系统提供给应用程序编程的接口。SDK函数软件开发包。DLL动态链接库。

25.C++的窗口类对象与窗口并不是一回事。唯一关系窗口类对象的内部定义了一个窗口句柄变量,保持了与这个C++窗口类对象相关的那个窗口的句柄。窗口销毁时窗口对象不一定销毁,窗口对象销毁时与之相关联的窗口必定销毁。

26.MFC中,CWnd类定义了一个HWND类型的成员变量m_hWnd,用于保存当前窗口的句柄,并且该成员变量具有public类型的访问权限,所以这样的所有操作就不再需要传递这个句柄。

27.ClassWizard为我们添加消息和命令的响应函数以及虚函数的重写。删除某个消息响应函数单击右键点击delete。删除某一个类,选中类中所有的代码进行删除,然后在FileView中删除对应的.cpp和.h文件。在类中定义变量时可以在类的定义后面直接定义。

28.添加一个消息响应函数之后,在原文件中会增加三处代码(1)消息响应函数原型,在对应的头文件的两个AFX_MSG(),AFX_MSG注释宏之间。(2)消息映射宏,在对应类的原文件中,在AFX_MSG_MAP(),AFX_MSG_MAP之间。(3)消息响应函数的定义。

29. 布尔型变量的值只有真(true) 和假(false)。
30.虚函数在该类的所有派生类中都是虚函数。那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数。
31.MFC的绘图功能:
(1)利用SDK全局函数画线
HDC hdc;   //定义HDC类型的变量。
hdc = ::GetDC(m_hWnd);    //获得当前窗口的设备描述表。
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);    //移动到线条的起点。
LineTo(hdc,point.x,point.y);    //画线。
::ReleaseDC(m_hWnd,hdc);  //释放设备描述表。
    在Windows平台下,所有的图形操作都是利用DC来完成的,DC主要和设备驱动打交道,完成设备的绘制。对程序员来说,只需获取DC的句柄,利用这个句柄就可以做图.用hdc保存GetDC函数返回的与特定窗口关联的DC的句柄。在完成图形操作后后,必须调用ReleaseDC函数释放DC所占的资源,否则会引起内存的泄露。
(2)利用CDC类实现画线
CDC* pDC = GetDC();   //定义一个CDC类的指针,利用GetDC获得当前窗口//设备描述表对象的指针。
pDC->MoveTo(m_ptOrigin); //移动到线条的起点。
pDC->LineTo(point);  //画线。
ReleaseDC(pDC);     //释放设备描述表。
32.绘制彩色线条可利用MFC提供的Cpen来创建画笔对象。利用Cbrush类可创
建画刷对象。
33.静态成员函数和静态成员变量属于类本身,在类加载时,即为它们分配了空

间,所以可以通过类名::函数名来访问(Point::init() ).而非静态成员函数和非静态成员变量属于对象的方法和数据,也就是应该首先产生累的对象,然后通过类的对象去引用。(pt.Point)。在静态成员函数中是不能调用非静态成员变量的。因为这时Point类的数据成员还没有分配成员函数,而静态成员函数属于类,所以该函数已经存在于函数程序的代码中。而非静态函数是可以调用静态函数。静态成员函数只能访问静态成员变量。

34.绘制连续线条:(1)得到线条的起点(2)捕获鼠标移动过程的每一个点,利用WM_MOUSEMOVE。

35.在程序中创建插入符,利用CWnd类的CreateSolidCaret()函数来完成。视类窗口(CView)始终位于框架窗口(CMainFrame)。对客户区的鼠标和键盘操作实际上都是在视类窗口上进行。所以应该在视类窗口上创建插入符。

36.调用CDC类的GetTextMetrics(int nWidth,int nHeight)成员函数可以得到设备描述表中当前字体的度量信息。

37.创建图形插入符:利用CWnd类的void CreateCaret(Cbitmap* pBitmap)函数可以实现。首先新建一个位图资源或导入已有的位图资源(.bmp)。接着,把局部的位图资源修改为Cview类的成员变量。(因为与资源相关联的对象,在析构时会把与之相关联的资源销毁。)

38.Windows程序运行时,若程序窗口的大小发生变化,窗口会发生重绘,窗口里的文字和图形就会消失。要保证输入的内容式中在窗口里,可以在OnDraw函数里进行处理。

39.MFC中创建路径层是利用CDC类提供的BeginPath和EndPath这两个函数来实现的。首先调用前者在设备描述表中打开一个路径层,然后利用图形的设备接口GDI提供的绘图函数进行绘图操作。在绘图操作完了之后,利用EndPath函数关闭这个路径层。当前的路径层与设备描述表进行互操作利用SelectClipPath函数。

40.字符串的初始化为空,eg:m_strLine = “”;捕获鼠标按下点的函数:

Static void PASCAL SetCaretPos(POINT point);

41.设置字体利用MFC提供的Cfont类来设置字体。在构造了一个Cfont类的对象后,必须利用该类提供的几个初始化函数之一对该对象进行初始化,然后才能使用这个对象。可以利用BOOL CreatePointFont(int nPointSize,LPCTSTR lpszFace  Name,CDC* pDC=NULL); 一般在使用完新字体后,要在把设备描述表的字体恢复到先前的字体。

Eg:Cclient DC dc(this)

Cfont font;

   font. CreatePointFont(300,“华文行楷”,NULL);

Cfont *pOldFont = dc.SelectObject(&font);

42.利用int DrawText(const Cstring &str,LPRECT lpRect,UNIT nFormat)函数可以在指定的矩形范围里输出字体。首先在已有文本位置重新输出一遍该文本,初始化时把矩形宽度设置为一个较小的值,然后不断的加大矩形的宽度,不断地增加显示文字的内容,从而实现文字的平滑变色。再利用定时器可以自动控制文字的变色进程。

43.Windows程序图形界面的三个主要元素为:菜单栏、工具栏、状态栏。VC++提供了一个所见即所得的资源编辑器,若要为程序添加自己的菜单项,可以直接在ResourceView选项卡中单击Menu进行编辑。

44.VisualC++默认顶层菜单为弹出式菜单(Pop-up),这种菜单不能响应命令。MFC都是采用大写字母来标识资源ID号的,为了与MFC保持一致,程序中也应该用大写字母来标识ID号。菜单资源ID号以“IDM_”开始;光标资源ID号以“IDC_”开始;图标资源ID号以“IDI_”开始。

45.为新建的菜单项添加命令响应函数:

(1)可直接在新添加的菜单项上单击鼠标右键选择ClassWizard。(2)在类名称(Classname)选择相应的窗口,是框架窗口时选择Classname的Cframe,是视类窗口响应时选择Cview。(3)在ObjectIDs下的列表中选择对应的菜单项的IDM_号。(4)在消息(Message)列表框中选择COMMAND项。(5)然后单击AddFunction命令来增加一个响应函数,弹出一个对话框,保持菜单命令响应函数的默认名称不变。(6)单击OK按钮,返回MFClassWizard对话框,在对话框底部的成员函数列表中就出现了新添加的函数。(7)单击EditCode即可跳转到新函数定义处。

46. 在菜单项的命令响应函数添加完成之后,在三个地方添加了与菜单命令消息响应函数相关的信息。(1)在类的头文件中,在两个AFX_MSG注释宏之间添加了命令消息响应函数原型;(2)在类的源文件中,在两个AFX_MSG_MAP注释宏之间添加了ON_COMMAND宏,将菜单ID号与命令响应函数关联起来。(3)在类的源文件中命令消息响应函数的实现代码。

47.Windows消息分类:标准消息,命令消息,通告消息。

   标准消息:除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。从CWnd派生的类都可以接收到这类消息。

   命令消息:来自菜单、加速键或工具按钮的消息。这类消息都以WM_COMMAND形式呈现。在MFC中,通过菜单的标识(ID)来区分不同的命令消息;在SDK中,通过消息wParam参数识别。从CcmdTarget派生的类,都可以接收这类消息。

   通告消息:由控件产生的消息,例如按钮的单击、列表框的选择等。目的是为了向其父窗口(通常是对话框)通知事件的发生。这类消息以WM_COMMMAND形式呈现。从CcmdTarget派生的类,都可以接收这类消息。

   凡是从CWnd派生的类,它们既可以接收标准消息,也可以接收命令消息和通告消息。而对于那些从CcmdTarget派生的类,则只能接收命令消息和通告消息,不能接收标准消息。

48. 程序类对菜单命令的响应顺序为:视类(CView)、文档类(CDoc)、框架类(CFrame)、应用程序类(CApp)。

49.菜单命令消息路由的具体过程:当点击某个菜单项时,最先接收到这个菜单命令消息的是框架类。框架类将把接收的这个消息交给它的子窗口,即视类。由视类首先进行处理。(1)视类首先根据命令消息映射机制查找自身是否对此消息进行了响应,如果响应了,就调用相应的响应函数对这个消息进行处理,消息路由过程结束。(2)如果未响应,就由文档类进行上述的消息处理。(3)如果未响应,文档类把这个消息交还给视类,视类再把该消息交给框架类。(4)如果未响应,再交给应用程序类,进行处理。

50.菜单栏包括子菜单、菜单项。子菜单:对应程序中看到的【文件】、【编辑】、【查看】、【帮助】这些对象。菜单项:对应程序中【文件】子菜单下的[新建]、

[打开]等对象。

51.对菜单项的访问可以通过该菜单项的标识ID或其位置索引来实现。

   对子菜单的访问可以通过索引号进行访问,因为菜单没有标识号。

52.对菜单栏的标记:因为程序的主菜单属于框架窗口。所以需在框架类窗口创建完成之后再去访问菜单对象。可以在框架类(CFrame)的 OnCreate函数的最后添加代码。(但必须在return语句之前)。

 53.对菜单的标记:(1)获得菜单栏,可以通过CWnd的成员函数GetMenu。 Cmenu* GetMenu() const;(2)获得子菜单的索引号可以通过GetSubMenu这个成员函数实现。CMenu* GetSubMenu(init nPos) const;(3)找到菜单项并进行标记可以用CheckMenuItem这个函数。UNIT CheckMenuItem(UNIT nIDCheckItem,UNIT nCheck).

54.对菜单项的索引号计算时分隔栏是占据索引位置的,所以得加1。

55.禁用菜单项:利用EnableMenuItem来实现,UNIT EnableMenuItem(UNIT nIDEnableItem,UNIT nEnable)。

56.移除和装载菜单利用CWnd提供的SetMenu函数来实现。BOOL SetMenu(Cmenu* pMenu)。

57.在设置窗口菜单时,如果定义的是局部菜单对象,则一定要在调用SetMenu函数设置窗口菜单之后,立即调用菜单对象的Detach函数将菜单句柄与菜单对象分离。

58.MFC中所有的控件类都是由CWnd类派生来的,控件实际上也是窗口。

59.想在程序中创建自己的对话框可以插入一个对话框资源来完成。(1)在【Insert】菜单下的【Resource】添加一个新的Dialog(2)在MFC中对资源的操作通常都是通过与一个资源相关的类来完成。选择【View】下的ClassWizard,这是根据提示给对话框添加一个相关的类。创建完成之后,在对应的类中就可以看都这个新类。 新类CTestDlg包括两个成员函数,其中一个是它的构造函数

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/): CDialog(CTestDlg::IDD, pParent) 另一个函数是void CTestDlg::DoDataExchange(CDataExchange* pDX),主要用来完成对话框数据的交换和校检。

60.对话框的分类:模态(Modal)对话框、非模态(Modeless)对话框。

模态对话框:指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中的其他任务。

非模态对话框:当其显示时,允许转而执行程序中的其他任务,而不用关闭这个对话框。

61.基于选择对话框(Dialog based)的应用程序有三个类:CaboutDlg,Capp,CDlg。

可以在对话框上添加一些控件,可以与相应的类关联起来,通过对控件添加的成员变量,实现一定的功能。

62.一个属性表单有一个或多个属性页组成。创建属性表单的步骤:(1)利用MFC中CPropertyPage创建属性页:选择VC开发环境窗口上的【Insert\Resource】

在弹出的对话框列表中选择Resource type.最后选择IDD_PROPPAGE_LARGE类型。在属性页中增加相应控件。(2)创建属性表单:创建一个CpropertySheet对象,在此对象中为每一个属性页创建一个对象(CPropertyPage),并调用AddPage函数添加每一个属性页、(3)调用DoModal函数显示模态属性表单。

63.向导的创建,在DoModal函数之前调用SetWizardMode这一函数,接下

来可以对每一个属性页进行处理。

64.在现有类型的基础上去掉某个类型的的方法,就是对此类型取反,并与现在的窗口进行与操作,从而就可以将窗口的特定类型去掉。

猜你喜欢

转载自blog.csdn.net/hanxiaoyong_/article/details/88849461