真正的排序列表控件应当是,当单击第一列标头时,按编号对所有列表项进行排序;单击第二列时,按姓名对所有列表项进行排序;以此类推单击不同列就按不同的规则对所有列表项排序。打开本章第2节的“Si”工程,本节继续演示使用CListCtrl::SortItems函数对列表项排序的方法。5)以此类推,再创建按国籍排序的回调函数并修改代码。在列表控件中若要按多种方式对列表项排序,就要在调用CListCtrl::SortItems函数时,代入不同的回调函数的地址。......
2025-09-30
凡是包含DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE两个宏的MFC类或派生类,都是支持动态创建的类,例如,框架类、视图类还有文档类等。
创建一个工程名为“dyn”的SDI程序,用于了解动态创建的原理和使用方法,如图13-18所示。
图13-18 创建文档视图架构的程序
1)打开CMainFrame类的头文件查看,首先看到的就是用于支持动态创建的宏,如图13-19所示。
2)选中DECLARE_DYNCREATE,再查看宏定义原型,如图13-20所示。
图13-19 查看宏定义
图13-20 创建浏览信息文件
3)在需要重建浏览信息的对话框中,单击“Yes”按钮后进入宏定义的头文件。
4)根据宏定义原型,翻译CMainFrame类声明动态创建宏的结果如下。
5)对DECLARE_DYNAMIC宏再次翻译的结果如下。
6)再打开CMainFrame的源文件查看,在开头部分可以看到执行动态创建的宏,如图13-21所示。
图13-21 查看宏定义
7)选中IMPLEMENT_DYNCREATE宏名称,通过菜单命令或者快捷键<F12>查看宏定义原型。
8)根据宏定义原型,翻译CMainFrame类执行动态创建宏的结果如下。
9)对IMPLEMENT_RUNTIMECLASS宏再次翻译的结果如下。
(https://www.chuimin.cn)
10)查看RUNTIME_CLASS宏定义原型,并去除无用代码AFX_COMDAT和AFX_DATADEF。
define RUNTIME_CLASS(class_name)((CRuntimeClass)(&class_name::classclass_name))
11)再次翻译CMainFrame类执行动态创建宏的结果如下。
12)所有MFC类的动态创建宏内,都隐藏了两个成员函数和一个静态成员变量,如图13-22所示。
图13-22 翻译后的动态创建宏定义代码
13)在资源视图中添加工具栏按钮,用于测试动态创建,如图13-23所示。
图13-23 编辑工具栏资源
14)在App类中添加测试按钮的消息映射函数,如图13-24所示。
图13-24 添加工具栏按钮消息映射函数
15)编写代码,测试动态创建函数CRuntimeClass::CreateObject。
16)编译并运行,测试代码。
在以上的翻译过程,有两个不常见的宏定义方式。在C语言标准中定义了和两种操作,用来把参数转换成字符串,则用来把前后两个参数连接在一起。例如,definex表示"x",defineabc表示"abc";define xy表示xy,define abcxyz表示abcxyz。
17)分析CRuntimeClass结构体成员构成并对应赋值。
18)查看基于文档模板架构的InitInstance主体代码。
19)分析以上代码。
CSingleDocTemplate类的构造函数中,除指定资源标志IDR_MAINFRAME外,主要代入三个运行时类型名用于系统在内部创建这三个类的对象。在执行ProcessShellCommand函数时,系统内部动态创建了主框架类的对象,并将其存储于theApp.m_pMainWnd成员变量中。
相关文章
真正的排序列表控件应当是,当单击第一列标头时,按编号对所有列表项进行排序;单击第二列时,按姓名对所有列表项进行排序;以此类推单击不同列就按不同的规则对所有列表项排序。打开本章第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
1)核心本地类图2-22核心本地类图图2-22中LocalFilterComponentBase,LocalInputComponentBase,LocalOutputComponent Base均与LocalComponentBase是泛化关系;LocalInputComponent,LocalOutputComponent,LocalFilterComponent与LocalComponen......
2025-09-29
将一个窗口句柄嫁接到一个CWnd类型变量中。使用MFC应用程序向导,创建一个工程名为“vs”的对话框程序,演示通过函数建立关联变量。4)修改对话框初始化函数,通过调用函数建立控件窗口和变量的关联。6)为增、删、改3个按钮建立消息映射函数并修改代码。实际上类向导建立的关联变量,内部也是调用子类化函数实现的,但是使用向导建立关联变量更加方便一些。因此,在后续章节中,主要使用类向导建立关联变量。......
2025-09-30
自定义窗口不但可以用于作为主窗口开发框架软件或者全屏软件,也常用于作为子窗口开发自定义控件。创建一个工程名为“bt”的对话框程序,演示通过创建自定义子窗口来开发一个按钮的过程。图11-13 创建通用窗口派生类2)在建立好的自定义按钮类头文件中,添加一些成员变量和函数。5)在类视图中添加一些窗口显示和与鼠标操作相关的消息映射函数,如图11-14所示。9)在源文件中,简单编写两个按钮的消息反射函数。......
2025-09-30
当用户单击对话框标题栏上的关闭按钮后,可能顺次发生的回调包括WM_SYSCOMMAND消息、WM_CLOSE消息、CDialog::OnCancel虚函数和WM_DESTROY消息等。打开第1节建立的“Test”工程,本节继续演示对话框关闭过程的回调函数。当单击系统关闭菜单或按钮,或者按<Alt+F4>组合键都不能关闭对话框,对话框不是真正地关闭而只是最小化了。所有以上其他回调函数都发生在对话框消失之前,并且可以取消继续关闭对话框窗口。图4-26 关闭对话框消息的流程......
2025-09-30
CBrush类的主要成员见表7-4。表7-4 CBrush类的主要成员1)用于填充的阴影线风格主要包括以下几种。创建一个工程名为“Brush”的对话框程序,用于演示选用不同画刷进行绘画的效果。2)在资源视图中,单击鼠标右键,在弹出的快捷菜单中,选择“Import”命令导入位图,如图7-16所示。图7-19 查看运行结果CBrush类构造函数与CreateSolidBrush和CreateHatchBrush等函数的功能基本一样,都可以用于创建一个画刷。一般当使用新画刷绘画结束后,最好恢复选择回旧画刷。......
2025-09-30
相关推荐