MFC知识点使用记录

DECLARE_DYNAMIC/DEClARE_DYNAMIC宏

  • IMPLEMENT_DYNAMIC是实现“运行时类型识别”宏
  • 在.H文件中必定有DECLARE_DYNAMIC(声明“运行时类型识别”宏)的声明。
  • 作用:
    • 为了确定运行时对象属于哪一个类而定义的宏
    • 为了“动态创建"类的实例而定义的宏。new可以用来创建对象,但不是动态的。比如说,你要在程序中实现根据用户输入的类名来创建类的实例。

BeginWaitCursor() \ EndWaitCursor()

显示沙漏光标,告诉用户 系统正在运行,繁忙。

绘图

Invalidate()

void Invalidate( BOOL bErase = TRUE) 使整个窗口客户区无效,需要重绘。Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。

调用Invalidate等函数后窗口不会立即重绘,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部(WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理)。Invalidate是在消息队列中加入一条WM_PAINT消息,只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT。

如果希望在调用Invalidate之后想马上更新屏幕,那就请加上UpdateWindow()这条语句。

InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效。

Invalidate()之后…OnPaint()->OnPrepareDC()->OnDraw(),所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。

UpdateWindow()

UpdateWindow()窗口立即重绘。在执行的过程中需要先判断客户区是否为空。不为空,UpdateWindow不会执行,只有为空才执行重画。

调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,绕过消息队列,从而导致窗口立即重绘。UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT

MFC 中Invalidate的使用

DWORD 类型:unsigned long

无符号32位整型

链表操作

GetHeadPosition():返回的是链表头元素的位置

遍历迭代:

POSITION pos =  pSnapshotList->GetHeadPosition();
int nCount = pSnapshotList->GetCount();
for (int i=0; i<nCount; i++)
{
	pos = pSnapshotList->FindIndex(i);
	USnapshot *ptmpSnapshot =  pSnapshotList->GetAt(pos);
}

GetNext(pos) :返回链表中pos所指的元素,并将pos指向下一个元素

MFC输出

MFC输出信息

弹窗

CString str;
str.Format( "peak=%g\ndias=%g\nmeam=%g",fPeak,fDIAS,fMean );
AfxMessageBox( str );

打印输出

int a=123;
TRACE("%d+++++++++++++++++++++++++++++++++++++++++++\n",a);

mainCRTStartup 程序入口点

操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。

程序的默认入口点由连接程序设置,不同的连接器选择的入口函数也不尽相同。在VC++下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用main 函数;对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的 WinMain 函数。

具体设置哪个入口点是由连接器的“/subsystem:”选项确定的,它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式:CONSOLE|WINDOWS|NATIVE|POSIX。如果这个选项参数的值为 WINDOWS,则表示该应用程序运行时不需要控制台。

mainCRTStartup

AfxEnableControlContainer() 允许应用程序作为控件容器来使用

CreateSemaphore() 信号量

HANDLE CreateSemaphore(
  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,  // SD
  LONG lInitialCount,                          // initial count
  LONG lMaximumCount,                   // maximum count
  LPCTSTR lpName                           // object name
)

此函数可用来创建或打开一个信号量

消息

SendMessage:执行后系统会一直等待, 直到要发送的消息被处理掉。
PostMessage:将消息放置在与创建指定窗口的线程相关联的消息队列中,并不等待线程处理消息的情况下返回消息。

PostMessage(WM_COMMAND, MAKEWPARAM(ID_BTN_OK, BN_CLICKED), NULL); WM_COMMAND是要发送的消息,MAKEWPARAM宏是为了组成一个WPARAM,WM_COMMAND消息的WPARAM的低字为控件ID,高字为识别码, 最后一个参数LPARAM可为NULL。

wParam VS lParam

在32位版本的Windows中,WPARAM被定义为UINT,而LPARAM被定义为LONG
(1)字参数(wParam)
(2)长参数(lParam):字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。

WPARAM和LPARAM的含义

发送点击消息

模拟按钮控件BN_CLICKED消息事件

查找控件

FindWindow(
lpClassName, {窗口的类名}
lpWindowName: PChar {窗口的标题}
): HWND; {返回窗口的句柄; 失败返回 0}

//FindWindowEx 比 FindWindow 多出两个句柄参数:
FindWindowEx(
Parent: HWND; {要查找子窗口的父窗口句柄}
Child: HWND; {子窗口句柄}
ClassName: PChar; {}
WindowName: PChar {}
): HWND;

FindWindow和FindWindowEx函数使用

BM_CLICK VS BN_CLICKED

BM_CLICK是发给按钮控件的消息,通过该消息控制实现按钮点击。
BN_CLICKED是控件发给其父窗口的通知(通过WM_COMMAND消息),告诉其父窗口自己被点击了。

常用文件头

#define new DEBUG_NEW

在debug的模式下所有的new都会被替换成DEBUG_NEW。在程序的“Debug”版本中,DEBUG_NEW 将为所分配的每个对象跟踪文件名和行号,帮助定位内存泄漏。

#ifdef _DEBUG  // 判断是否定义_DEBUG
#undef THIS_FILE  // 取消THIS_FILE的定义
static char THIS_FILE[]=__FILE__;  // 定义THIS_FILE指向文件名 
#define new DEBUG_NEW
#endif

关于#define new DEBUG_NEW

计算机知识

DPI

96DPI:1英寸由96个像素绘成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学上机实习自己做的 功能齐全 附有实习报告!实习报告写得很详细! 编辑器 做一个单文档的程序,能够进行读取两个文本文件的内容,并将其内容用图形的方式显示出来。 两个文本文件内容:在Point1.txt文件中,记录了点的坐标信息,如下如所示: 图 31 point文件内容 第一列是点的行号,没有什么特别意义,就是累加的顺序; 第二列是一个点的ID,具有唯一性。即没有ID相同的两个点。 第三列是点的类型,不同的类型表示不同的点。比如10可能是一个小黑点,26是一个空心圆表示的点,20是一个小三角形等。 第四列是点的名字,是一个字符串。 最后两列是点的坐标,注意是浮点型的笛卡尔坐标(方向是上、右),并非vc中的缺省的坐标系(方向是下、右)。 Lin1.txt文件中,记录了线的连接关系(没有曲线,只有折线段),如下图所示: 图 32 lin文件中的内容 第一列是线的序号,没有实际意义,一行表示一条线。 第二列是线的ID,有唯一性,即每个线的ID不同 第三列和第四列是这个线的两个端点的ID(ID对应point.txt中的ID0) 基本要求:   用程序读取两个文本文件,将数据读入内存,用相应的数据结构保存到内存。   将所有数据都在一个视图显示出来。    建议: 注意点的坐标为浮点类型,需要进行坐标的变换 这一阶段,不用考虑图形参数,不用考虑图形的操作,只需要显示出来即可 建议自己做两个简单的文件,手工录入几条整数型的坐标,用缺省坐标系先实现,然后再考虑本题浮点和笛卡尔坐标的问题 本题主要考察视图显示、坐标、更新窗口知识点 高阶要求: 图形参数可以选择后变化(包括点的形状、大小;线的颜色,粗细、线型等)。   支持视图的放大、缩小、复位(即一屏显示所有的数据)等 可选要求:   可以鼠标选中点,对点进行移动,移动后,点上连着的线要能够联动。 移动点的过程中(即还没有确定最终移动的位置的时候),要有虚线显示点和线移动的效果,移动到最终位置的时候,虚线消失,老的实线根据新坐标重绘。
说明:本书稿为张孝祥、袁龙友两位老师在2000 年依据张孝祥的vc 讲课记录整理,由于时间关系,仅仅是写成了草稿,欢迎大家使用! 第1 章 掌握C 1.1 类的定义与应用 1.1.1 结构的定义 1.1.2 类的定义 1.1.2.1 类与结构 1.1.2.2 类的使用 (例子代码EX01-00) 1.2 函数的重载 1.2.1 重载参数个数不同的函数 (例子代码EX01-01) 1.2.2 重载参数数据类型不同的函数 (例子代码EX01-02) 1.3 构造函数与析构函数 1.3.1 构造函数 1.3.2 析构函数 (图1,没有)(图2,没有) 1.4 this 指针的引用 1.5 类的继承与protected 访问修饰符 1.5.1 单一继承 (例子代码EX01-03) (图x,没有) 1.5.2 多重继承 1.6 虚函数与多态性 1.7 类的书写规范 1.8 小结 第2 章 Windows 程序内部运行原理 2.1 Windows 应用程序,操作系统,计算机硬件之间的相互关系 2.1.1 关于API (图1,没有) 2.1.2 关于消息及消息队列 (图1、图2 没有) 2.2 什么是句柄 2.3 谈谈WinMain 函数 (例子代码EX02-00) 2.3.1 WinMain 函数的定义及功能 2.3.2 窗口及其生成 2.3.2.1 如何设计一个窗口类——步骤1 2.3.2.2 注册设计好的窗口类——步骤2 2.3.2.3 创建窗口——步骤3 2.3.2.4 显示创建的窗口——步骤4 2.3.3 消息循环 2.3.4 完成回调函数 2.4 程序编写操作步骤与实验 2.5 小结 第3 章 VC 集成开发环境介绍 3.1 Visual C 开发环境 3.1.1 工作区窗格 3.1.2 输出窗格 3.1.3 编辑区 3.1.4 菜单栏、工具栏、状态栏 3.2 系统菜单功能介绍 3.2.1 File 菜单 3.2.2 Edit 菜单 3.2.3 View 菜单 3.2.4 Insert 菜单 3.2.5 Project 菜单 3.2.6 Build 菜单 3.2.6 Tools 菜单 3.2.7 Window 菜单 3.2.8 Help 菜单 3.3 Visual C 重要工具介绍 3.3.1 C/C 编译器 3.3.2 资源编辑器 3.3.3 资源编译器 3.3.4 链接器和调试器 3.3.5 AppWizard 和ClassWizard 3.3.6 资源浏览器 3.3.7 Microsoft 活动模板库、仓库 3.4 小结 第4 章 MFC 应用程序框架剖析 4.1 什么是MFC 以及MFC 的特点 (例子代码EX04-00) 4.2 MFC 应用程序框架 (例子代码EX04-01) 4.3 应用程序框架说明 4.4 文档-视图体系结构 4.4.1 文档-视图相互作用的函数 4.4.2 单文档-视图应用程序结构 4.4.2 多文档-视图应用程序结构 4.5 MFC 消息映射机制 4.5.1 消息的种类 4.5.2 应用程序的Run 函数 4.5.3 消息映射表 4.5.4 如何添加消息映射 4.6 ClssWizard 的使用 4.6.1 ClssWizard 概貌 4.6.2 如何添加消息处理函数 4.6.3 如何添加成员变量 4.6.4 如何添加一个新类 第5 章 图形与文本 5.1 理解图形设备接口 5.2 设备描述表 5.2.1 什么是设备描述表 5.2.2 MFC 中的设备描述表类 5.2.3 获取设备描述表 5.3 Windows 的GDI 对象 5.4 GDI 对象的创建 5.4.1 自定义画刷(CBrush) 5.4.2 自定义画笔(CPen) 5.4.3 自定义字体(CFont) 5.5 GDI 对象的使用及示例 5.5.1 画笔的使用 5.5.1.1 在MFC 程序中画线 5.5.1.2 在Windows Application 程序中画线 5.5.1.3 实现橡皮筋功能 5.5.2 画刷的使用 5.5.2.1 带颜色的画刷的使用 5.5.2.2 带位图的画刷的使用 5.5.3 字体的使用 5.5.3.1 一个简单的文字处理程序 5.5.3.2 模拟卡拉OK 程序 5.5.3.3 剪切区和路径层 第六章 菜单、工具栏和状态栏 6.1 菜单 6.1.1 菜单介绍 6.1.2 创建一个菜单 6.1.2.1 添加一个菜单资源 6.1.2.2 利用菜单编辑器编辑菜单资源 6.1.2.3 将菜单加入到应用程序中 6.1.2.4 给菜单项添加COMMAND 消息处理 6.1.2.5 给菜单项添加UPDATE_COMMAND_UI 消息处理 6.1.2.6 一个简单的绘图程序 6.1.3 在应用程序中控制菜单 6.1.3.1 在应用程序中取得菜单 6.1.3.2 在应用程序中修改菜单的状态 6.1.3.3 在应用程序中添加、删除、插入菜单或菜单项 6.1.3.4 一个简易的电话本程序 6.1.4 创建快捷方式菜单 6.2 工具栏 6.2.1 工具栏介绍 6.2.1.1 熟悉CToolBar 类 6.2.1.2 AppWizard 是如何创建工具栏 6.2.1.3 利用工具栏编辑器设计工具栏按钮 6.2.2 新建一个工具栏 6.2.3 显示/隐藏工具栏 6.3 状态栏 6.3.1 状态栏介绍 6.3.1.1 熟悉CStatusBar 类 6.3.1.2 AppWizard 是如何创建状态栏 6.3.2 修改状态栏 6.3.2.1 指示器数组 6.3.2.2 修改状态栏窗格 6.3.3 在状态栏上显示鼠标坐标、时钟和进度条 6.3.3.1 在状态栏上显示鼠标坐标 6.3.3.2 在状态栏上显示时钟 6.3.3.3 在状态栏上显示进度条 第七章 对话框和控件 7.1 对话框及控件的介绍 7.1.1 常用控件介绍 7.1.2 对话框介绍 7.1.2.1 对话框的组成 7.1.2.2 对话框的种类 7.1.2.3 使用对话框编辑器设计对话框 7.1.3 创建一个对话框 7.1.3.2 创建非模态对话框 7.1.3.3 对话框的数据交换机制 7.1.3.4 创建模态对话框 7.1.4 模态对话框和非模态对话框的区别 7.1.5 按钮逃跑小程序 7.2 属性页和向导对话框 7.2.1 创建属性页对话框 7.2.1 创建向导对话框 7.3 公用对话框 7.3.1 增加设置对话框来完善绘图程序 7.3.2 颜色对话框的使用 7.3.3 字体对话框的使用 7.3.4 控制控件颜色做漂亮界面 第8 章 文档序列化 8.1 序列化 8.1.1 CArchive 类和Serialize 函数 8.1.2 使自己的类支持序列化 8.1.3 实例:保存和显示图形 8.2 CFile 类 8.2.1 CFile 类的构造函数 8.2.2 打开文件 8.2.3 读写数据 8.2.4 关闭文件 8.3 文件I/O 处理 8.3.1 利用MFC 类来实现 8.3.2 利用C 函数来实现 8.3.3 利用C 函数来实现 8.3.4 利用API 函数来实现 8.3.5 创建保存、打开对话框 8.4 注册表操作 8.4.1 什么是注册表 8.4.2 注册表结构 8.4.3 修改注册表 第9 章 修改框架程序的显示效果 9.1 修改Windows 应用程序外观样式 9.1.1 在框架类中修改程序外观 9.1.2 在视图类中修改程序外观 9.2 制作动画图标 9.3 将图片作为窗口显示的背景 第10 章 网络编程 10.1 计算机网络的基本概念 10.1.1 计算机网络的分类 10.1.2 网络拓扑结构 10.2 网络体系结构和网络协议 10.2.1 ISO/OSI 参考模型 10.2.2 TCP/IP 参考模型 10.2.3 TCP/IP 协议 10.2.3.1 协议概述 10.2.3.2 TCP/IP 协议层次结构及各种协议介绍 10.2.3.3 IP 地址 10.2.3.4 端口号 10.2.4 专业术语解释 10.3 Socket 套接字 10.3.1 Socket 介绍 10.3.2 关于协议族和地址族 10.3.3 使用Socket 10.3.3.1 创建Socket 10.3.3.2 指定本地地址及端口号 10.3.3.3 建立连接 10.3.3.4 监听连接 10.3.3.5 发送数据 10.3.3.6 接收数据 10.3.3.7 关闭套接字 10.3.4 套接字一般调用过程 10.4 WinSock 编程机制 10.4.1 认识Windows Socket 10.4.2 Windows Sockets 库函数介绍 10.4.2.1 Berkeley socket 函数 10.4.2.2 数据库函数 10.4.2.3 Windows 专有扩展函数 10.5 WinSock 编程实例 10.5.1 实例一:面向连接服务的socket 调用 10.5.2 实例二:面向非连接服务的socket 调用 10.5.3 实例三:基于字符界面的聊天程序 第11 章 线程间的同步 11.1 进程和线程的概念 11.2 Win32 的线程 11.2.1 线程的创建 11.2.2 线程的终止 11.2.3 实例:通过创建多线程来编写网络聊天程序 11.3 MFC 的线程处理 11.3.1 创建工作者线程 11.3.2 创建用户界面线程 11.4 线程同步 11.4.1 为什么要同步 11.4.2 等待函数 11.4.3 同步对象 11.4.3.1 关键代码段 11.4.3.2 互斥对象 11.4.3.3 信标对象 11.4.3.4 事件对象 11.4.4 如何选择同步对象 第12 章 进程间的通讯 12.1 进程控制 12.1.1 进程的创建 12.1.2 进程的终止 12.2 进程间通讯 12.2.1 剪贴板通讯方式 12.2.2 邮槽通讯方式 12.2.3 管道通讯方式 12.2.3.1 命名管道通讯 12.2.3.2 匿名管道通讯 第14 章 ActiveX 技术 14.1 ActiveX 简介 14.2 ActiveX 控件和普通Windows 控件 14.2.1 ActiveX 控件和普通Windows 控件的相同点 14.2.2 ActiveX 控件和普通Windows 控件的相同点 14.3 ActiveX 控件的属性、方法和事件 14.3.1 ActiveX 控件的属性 14.3.2 ActiveX 控件的方法 14.3.3 ActiveX 控件的事件 14.4 创建ActiveX 控件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值