真正的排序列表控件应当是,当单击第一列标头时,按编号对所有列表项进行排序;单击第二列时,按姓名对所有列表项进行排序;以此类推单击不同列就按不同的规则对所有列表项排序。打开本章第2节的“Si”工程,本节继续演示使用CListCtrl::SortItems函数对列表项排序的方法。5)以此类推,再创建按国籍排序的回调函数并修改代码。在列表控件中若要按多种方式对列表项排序,就要在调用CListCtrl::SortItems函数时,代入不同的回调函数的地址。......
2025-09-30
在本章第1节的示例中,调用了多种控件类的创建函数,例如,CStatic::Create和CEdit::Create等。
跟踪查看控件类创建函数的源代码,这些创建函数的共同特点如下。
1)所有控件类的创建函数,都通过调用基类成员函数CWnd::Create来实现。
2)所有控件创建时,都要在CWnd::Create函数中代入窗口ID、风格、位置和父窗口等。
3)所有控件创建时,都要在CWnd::Create函数的第一个参数中代入控件种类,即窗口类型名。
4)有些控件要有标题文字(如,按钮),在CWnd::Create的第二个参数中代入,否则代入NULL。
注册和创建自定义窗口的过程如下。
1)什么是窗口类型名。
生物的基因决定了一个新生命的特征,新生的小狗和小鸟之所以特征不同,就是因为各自的基因是不同的。窗口类型名就相当于窗口“体内的基因”,指定什么窗口类型名就能创建出什么类型的窗口。窗口类型名允许大小写不匹配,系统已注册的包括对话框、工具栏以及所有控件。系统通用窗口类型见表11-1。
表11-1 系统通用窗口类型
2)CWnd::Create和CWnd::CreateEx。
窗口创建函数CWnd::Create,调用的是带扩展风格的窗口创建函数CWnd::CreateEx。
3)对比CWnd::Create和CWnd::CreateEx两个函数。
①从函数格式上看,后者只多出一个参数(第一个参数),是用于指定扩展风格的。
②若要创建的窗口无需扩展风格(例如,边缘凸起或下陷等),就直接调用CWnd::Create函数。
③若要在创建窗口时指定扩展风格就调用CWnd::CreateEx函数,在第一个参数中指定扩展风格(如同在第1节中创建第2个编辑框那样)。
④CWnd::Create函数只限于创建包括所有控件在内的子窗口,不能用于创建主窗口。
⑤CWnd::CreateEx函数不但可以创建子窗口,还可以用于创建框架类型的主窗口。
4)注册自定义窗口类型。
以上是通过调用CWnd::Create和CWnd::CreateEx函数,对系统已注册的窗口类型进行创建。如果要创建一个自定义的窗口类型,首先就要注册一个新的自定义窗口类型。
注册窗口类型名有以下3种方法。
①调用RegisterClass和RegisterClassEx函数。最早期的注册API函数,主要用于Win32程序开发。
②调用AfxRegisterClass函数。MFC全局函数,先检测要注册的窗口类型是否存在。若是已经注册过的类型名则无需再次注册,内部封装的是GetClassInfo和RegisterClass函数。
③调用AfxRegisterWndClass函数。MFC全局函数,内部调用AfxRegisterClass函数。并将接口参数简化以方便调用,返回值是自动生成的随机窗口类型名。
5)创建一个工程名为“wd”的对话框程序,用于演示自定义窗口的注册和创建。
6)编译并运行,测试代码,如图11-5所示。
图11-5 查看运行结果
7)再次修改InitInstance函数代码,调用CWnd::CreateEx函数创建一个弹出式的全屏窗口。
8)编译并运行,测试代码。
窗口根据风格分类主要有三大类。
①重叠式窗口(WS_TILEDWINDOW或WS_OVERLAPPEDWINDOW),具有应用程序主窗口的全部特点。它的非客户区包括一个可伸缩的框架、菜单条、标题栏和最小化、最大化按钮。
②弹出窗口(WS_POPUPWINDOW),具有消息框或者对话框的全部特点。它的非客户区是一个固定大小的框架。
③子窗口(WS_CHILDWINDOW),具有类似控件子窗口的全部特点。它不能作为主窗口,一般不显示非客户区,只有依赖于父窗口才能存在。(https://www.chuimin.cn)
9)在ResourceView中,单击鼠标右键,在弹出的快捷菜单中,选择“Insert”命令,添加一个菜单资源,如图11-6所示。
10)在新添加的菜单(IDR_MENU1)中,添加一些简单的菜单项,如图11-7所示。
图11-6 插入菜单资源
图11-7 编辑菜单资源
11)修改InitInstance函数代码,调用CWnd::CreateEx函数创建一个带菜单的窗口。
12)编译并运行,测试代码,如图11-8所示。
虽然菜单显示出来了,但是还是无法接收菜单和窗口消息。
13)在ClassView中,添加CWnd派生类,用于接收主窗口的消息,如图11-9所示。
图11-8 查看运行结果
图11-9 添加新类
14)类名填写“CMainWnd”,基类选择“generic CWnd”即可,如图11-10所示。
图11-10 创建通用窗口派生类
15)在类视图中建立菜单项消息的反射函数,如图11-11所示。
图11-11 添加菜单项的消息映射函数
16)修改OnAppExit消息反射函数代码。
17)在类视图中添加一个虚函数,如图11-12所示。
图11-12 添加虚函数
18)修改PostNcDestroy虚函数代码。
19)修改InitInstance函数代码,在申请堆空间时指定CMainWnd类对象。
20)编译并运行,测试代码。
总结使用自定义窗口做主窗口的特点如下。
①CWnd::CreateEx函数是非阻塞的,因此,必须在堆空间内申请窗口类对象。
②在申请堆空间时要指定派生类的对象,才能在派生类中接收并处理窗口的消息。
③申请的窗口派生类对象的地址,必须要保存在theApp.m_pMainWnd中。
④InitInstance函数如果返回FALSE,或m_pMainWnd是空值,则程序进程将被退出。
⑤MFC全局函数AfxGetMainWnd的返回值,就是theApp.m_pMainWnd的值。
⑥这类程序退出进程的方式,就是销毁m_pMainWnd关联的窗口。
例如,AfxGetMainWnd()→DestroyWindow();或AfxGetMainWnd()→PostMessage(WM_CLOSE);
相关文章
真正的排序列表控件应当是,当单击第一列标头时,按编号对所有列表项进行排序;单击第二列时,按姓名对所有列表项进行排序;以此类推单击不同列就按不同的规则对所有列表项排序。打开本章第2节的“Si”工程,本节继续演示使用CListCtrl::SortItems函数对列表项排序的方法。5)以此类推,再创建按国籍排序的回调函数并修改代码。在列表控件中若要按多种方式对列表项排序,就要在调用CListCtrl::SortItems函数时,代入不同的回调函数的地址。......
2025-09-30
打开本章第7节建立的“Tp”工程,继续演示CWinApp类的开发应用。1)修改启动函数CWinApp派生类的构造函数代码。m_pszAppName成员变量有三种途径赋值,首先在CWinApp构造函数中获得字符串。在App派生类以外,调用CWinApp类成员函数的方法有两种。CWinApp类的成员函数LoadIcon和LoadStandardIcon,实际上是封装了API函数LoadIcon的结果。和加载图标的两个函数一样,CWinApp类的成员函数LoadCursor和LoadStandardCursor,分别用于加载程序光标和系统光标资源,它们封装的也是同一个API函数LoadCursor。......
2025-09-30
标签控件,又称选项卡控件。很多软件的用户资料注册部分是采用注册向导模式,而用户资料修改则采用标签控件管理模式。打开本章第3节建立的“usd”工程,本节继续演示采用标签控件来管理多个分页。1)新插入一个对话框资源,作为使用标签控件进行分页管理的父窗口,如图9-20所示。6)添加标签控件的TCN_SELCHANGE消息反射函数OnSelchangeTab,如图9-22所示。图9-24 查看运行结果单击“修改”按钮或者双击列表选项,就会打开带标签控件的修改资料的对话框。......
2025-09-30
属性表和属性页,是MFC封装的多页管理类。属性页用于与子页面窗口关联,属性表用于关联管理子页的父窗口。使用MFC应用程序向导,创建一个工程名为“prop”的对话框程序,演示使用属性页和属性表管理多个分页子窗口。图9-25 插入分页子窗口2)子页窗口的标题栏要保留,它将在属性表窗口中显示,如图9-26所示。8)在主对话框内添加的控件与第4节中的完全一样,见表9-9。属性表默认是标签模式显示,调用SetWizardMode函数后以向导模式显示。......
2025-09-30
图2.3.2 创建实体拉伸特征图2.3.3 截面草图Step3.添加图2.3.4所示的实体拉伸特征,产生加强筋(肋)。图2.3.7 “UDF”菜单图2.3.8 “UDF选项”菜单图2.3.8所示的“UDF选项”菜单说明如下:● 选择该命令后,表明所创建的用户自定义特征是“独立的”,即相对于原始模型是独立的;如果改变原始模型,其变化不会反映到UDF中。图2.3.13 操作过程(三)图2.3.14 “提示”菜单● :为使用这个参照的所有特征指定单一提示。......
2025-09-29
CBrush类的主要成员见表7-4。表7-4 CBrush类的主要成员1)用于填充的阴影线风格主要包括以下几种。创建一个工程名为“Brush”的对话框程序,用于演示选用不同画刷进行绘画的效果。2)在资源视图中,单击鼠标右键,在弹出的快捷菜单中,选择“Import”命令导入位图,如图7-16所示。图7-19 查看运行结果CBrush类构造函数与CreateSolidBrush和CreateHatchBrush等函数的功能基本一样,都可以用于创建一个画刷。一般当使用新画刷绘画结束后,最好恢复选择回旧画刷。......
2025-09-30
将一个窗口句柄嫁接到一个CWnd类型变量中。使用MFC应用程序向导,创建一个工程名为“vs”的对话框程序,演示通过函数建立关联变量。4)修改对话框初始化函数,通过调用函数建立控件窗口和变量的关联。6)为增、删、改3个按钮建立消息映射函数并修改代码。实际上类向导建立的关联变量,内部也是调用子类化函数实现的,但是使用向导建立关联变量更加方便一些。因此,在后续章节中,主要使用类向导建立关联变量。......
2025-09-30
打开本章第1节建立的“Test”工程,本节继续演示非模式对话框的调用过程。1)通过菜单命令或者按快捷键<Ctrl+1>再插入一个对话框,用于测试非模式对话框,如图4-9所示。7)非模式对话框的特点如下。①在关闭模式对话框前,不阻挡对背景窗口的操作。②使用CDialog::Create函数创建非模式对话框,该函数是非阻塞函数。......
2025-09-30
相关推荐