c++备考笔记
- 格式:doc
- 大小:210.00 KB
- 文档页数:71
菜单栏,工具栏,状态栏是组成Windows程序图形界面的三个主要元素。
大多数的Win dows应用程序都提供了菜单,作为用户和程序之间的一种交互途径。
菜单栏在设置菜单栏的菜单项的时候,Pop-up属性的为弹出菜单,这种菜单不能响应命令,没有ID号。
菜单命令的路由相应菜单项命令的顺序是:视类(View),文档类(Doc),框架类(Frame),应用程序类(A pp)。
Windows消息的分类标准消息:除了WM_COMMAND消息之外,所有以WM开头的消息都是标准消息,从CWnd(计算机网络cwnd又为计算机网络中拥塞窗口(congestion window)的简写)派生的类都可以响应这类消息。
命令消息:来至菜单、加速键和工具栏按钮的消息,这类消息都是以WM_COMMAND 形式呈现,在MFC(是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows 的API(API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
),并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
)中,通过菜单项的标示ID(代码)来区分不同的命令消息,在SDK(SDK(Software Development Kit, 即软件开发工具包)一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。
)中,通过消息的wParam(WPARAM,消息响应机制)参数标示,从CCmdTarget(类CCmdTarget是MFC类库中消息映射体系的一个基类,是MFC处理命令消息的基础、核心。
消息映射把命令或消息引导给用户为之编写的响应函数。
)派生的类都可以接收这类消息。
通告消息:有控件产生的消息,例如按钮的单击,列表框的选择等都会产生这类消息,目的是向其父窗口通知事件的发生。
这类消息以WM_COMMAND形式发送,从CCmdTar get派生的类都可以接收这类消息。
CWnd派生于CCmdTarget,从CWnd派生的类可以接收所以类型的消息(View,Frame),其他从CCmdTarget派生的类只能接收命令消息和通告消息(Doc,App)。
基本菜单操作Pop-up0 Pop-up1 Pop-up2 Pop-up3 …0-0 1-0 2-0 3-0 …0-1 1-1 2-1 3-1 …0-2 1-2 2-2 3-2 …可以通过CWnd的成员函数GetMenu来获取指向菜单栏的指针,对菜单子项的访问可以通过菜单的索引标识来实现。
操作一个菜单项的2种实例1 GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED);2 GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_OPEN,MF_BYCOMMAND | MF_CHECKED);MSDN中关于MF_BYCOMMAND 和MF_BYPOSITION的解释MF_BYCOMMAND Specifies that the parameter gives the command ID of the existi ng menu item. This is the default.MF_BYPOSITION Specifies that the parameter gives the position of the existing men u item. The first item is at position 0.GetSubMenu有很多成员函数,用于菜单的操作。
快捷菜单工程-添加到工程-Components and Controls,从这里可可以选择VC提供的一些组件和控件,添加一个POPUP MENU,选择所属于View类,此时View类中便添加了一个OnConTe xtMenu函数。
01 void CMenuView::OnConTextMenu(CWnd*, CPoint point)02 {03 // CG: This block was added by the Pop-up Menu component04 {05 if (point.x == -1 && point.y == -1){06 //keystroke invocation07 CRect rect;08 GetClientRect(rect);09 ClientToScreen(rect);10 point = rect.TopLeft();11 point.Offset(5, 5);12 }13 CMenu menu;14 VERIFY(menu.LoadMenu(CG_IDR_POPUP_MENU_VIEW));15 CMenu* pPopup = menu.GetSubMenu(0);16 ASSERT(pPopup != NULL);17 CWnd* pWndPopupOwner = this;18 while (pWndPopupOwner->GetStyle() & WS_CHILD)19 pWndPopupOwner = pWndPopupOwner->GetParent();20 pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, poi nt.y,21 pWndPopupOwner);22 }23 }运行之后,在View类区域右键,会出现一个弹出窗口。
对话框1记得以前上学的时候听一个老师说过,计算机技术的核心是输入输出和二进制。
Windo ws应用程序工作的基本流程就是从用户那里得到数据,经过相应的处理之后,再把处理结果输出到屏幕和其他的输出设备上。
为了实现这个过程,就需要一个很重要的接口-对话框。
7.1对话框的基本知识在MFC中,所有的控件类都是从CWnd类派生而来。
以前做过一些其他开发技术的开发工作,相对其他IDE而言,VC下提供的控件很少,但是基本可以满足开发需要了。
对话框的种类主要分2中,模态对话框和非模态对话框。
模态对话框:指当前显示时,程序会暂停执行,知道关闭这个模态对话框后才能继续执行其他任务(个人感觉这个只是一个相对暂停的概念,暂停的只是针对用户操作部分,我们运行一个杀毒软件程序,杀毒过程中如果有一些参数设定,会出现一些模态对话框,但是这个时候杀毒程序还是会继续执行的)。
非模态对话框:对其他操作没有影响,这个容易理解些。
7.2 对话框的创建和显示在Resources选项卡Dialog目录下,可以添加一个新的对话框。
添加一个对话框之后,类视图可以看到也相应添加了一个新的类。
在创建一个MFC单文档应用程序的时候,系统为默认创建一个CAboutDlg类,在Dialog文件夹下可以看到IDD_ABOUTBOX这个对话框。
在View类和Frame类中操作对话框的时候,首先需要在cpp文件中引入该对话框的头文件。
显示一个对话框1 void CMyboleView::OnDialog()2 {3 // TODO: Add your command handler code here4 CTestDlg dlg;5 dlg.DoModal();//DoModal是一个函数,刚不小心忘了括号,记清楚了67 }如果要显示一个非模态对话框,需要调用Dialog类的Create函数。
MSDN中,Create 类的声明如下1 BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );2 BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );由于非模态对话框显示的时候程序不会暂停等待用户操作,如果使用临时变量的话,对象的生命周期在OnDialog()执行完之后就结束,这样就无法正常显示,所以可采用创建对象指针的方式,由于动态创建的指针对象是分配在堆内存上,堆内存上的变量周期可应用程序相同。
1 CTestDlg *pDlg=new CTestDlg;2 pDlg->Create(IDD_DIALOG1,this);3 pDlg->ShowWindow(SW_SHOW);这里又涉及一个动态内存释放的问题7.3 动态创建按钮参见MSDN,CButton的Create函数。
01 CButton myButton1, myButton2, myButton3, myButton4;02 // Create a push button.03 myButton1.Create(_T("My button"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,04 CRect(10,10,100,30),this, 1);//当前窗口05 // Create a radio button.06 myButton2.Create(_T("My button"),WS_CHILD|WS_VISIBLE|BS_RADIOBUTTO N,07 CRect(10,40,100,70),this, 2); //当前窗口08 // Create an auto 3-state button.09 myButton3.Create(_T("My button"),WS_CHILD|WS_VISIBLE|BS_AUTO3STATE,10 CRect(10,70,100,100),GetParent( ),3); //父窗口11 // Create an auto check box.12 myButton4.Create(_T("My button"),WS_CHILD|WS_VISIBLE|BS_AUTOCHECKB OX,13 CRect(10,100,100,130),GetParent( ),4); //父窗口7.4 访问控件访问控件的方式很多,按照书上的例子简单的抄了几种,感觉这三种最简单,使用上也方便些。
01 void CTestDlg::OnButton1()02 {03 // TODO: Add your control notification handler code here04 int num1,num2,num3;05 //char buf1[10],buf2[10],buf3[10];1,206 //GetDlgItem(IDC_EDIT1)->GetWindowText(buf1,10);107 //GetDlgItem(IDC_EDIT2)->GetWindowText(buf2,10);108 //GetDlgItemText(IDC_EDIT1,buf1,10);209 //GetDlgItemText(IDC_EDIT2,buf2,10);21011 //num1=atoi(buf1);1,212 //num2=atoi(buf2);1,213 num1=GetDlgItemInt(IDC_EDIT1);14 num2=GetDlgItemInt(IDC_EDIT2);15 num3=num1+num2;16 //itoa(num3,buf3,10);1,21718 //GetDlgItem(IDC_EDIT3)->SetWindowText(buf3);119 //SetDlgItemText(IDC_EDIT3,buf3);220 SetDlgItemInt(IDC_EDIT3,num3);21 }对话框2本章节继续讲解对话框的有关知识,以及属性表单和向导的创建。