C++阶段性总结(1)
1、Windows API现在windows.h头文件中申明。其函数的实现,由操作系统提供的。
Win32 Console Application只能运行命令行程序 入口点: 一个是main
Win32 Application是基于消息响应机制的,可以运行图形化的C++程序 入口点: 一个是Winmain
Win 32程序编写步骤:
(1)、WinMain函数的定义
(2)、创建一个窗口
(3)、进行消息的循环
(4)、编写窗口过程函数
2、Windows程序中,有各种各样的资源(窗口、图标、光标),系统在创建这些资源的时候会为他们分配内存,并返回标识这些资源的标识号,即句柄HANDLE(ID)。图标句柄(HICON)、光标句柄(HCURSOR)、画刷句柄(HBRUSH)。
3、DC是一个包含设备信息的结构体(物理输出设备,如显示器(画布)。及设备驱动(画笔、画刷及画法))。油画,水彩画,素描等画法,相当于计算机中图形设备及其驱动。
4、每个应用程序开始执行,系统会为该程序创建一个消息队列。当系统捕获消息,若是这应用程序的消息,就加入队列。而应用程序通过循环,从消息队列中取消息,传递给操作系统,由操作系统调用窗口过程函数执行。
进队消息:由操作系统放到应用程序消息队列中,然后由应用程序取出并发送。
不进队消息:系统调用窗口过程函数时直接发给窗口
两者 都是系统调用窗口过程函数对消息进行处理。
5、类和结构体除了使用的关键字不一样,更重要的是,成员访问控制方面不一样:结构体中:成员默认是公有的。类中:默认是私有的。即类外不能访问成员。C语言中,结构体不能包含函数。在C++中,对结构体经行了扩展,C++结构体可以包含函数。
6、引用:就是一个变量的别名,必须在申明的时候就经行的初始化
int a=5; int &b=a; //用&表示申明了一个引用 int c=9; b=c; //此处并不是将b变成c的引用,而是给b赋值,此时,b和a的值都变成了9
7、MFC中如何获取光标(CButton::GetCursor\CStatic::GetCursor)、位图(CBitmap::GetBitmap\CButton::GetBitmap\CStatic::GetBitmap)、图标(CWnd::GetIcon\CButton::GetIcon\CStatic::GetIcon \CWindow::GetIcon)的句柄。注意:CWinApp::LoadCursor 、CWinApp::LoadIcon
8、窗体的背景色,窗口重绘:先删除背景色,在重新绘制,MFC提供了三个函数用于窗口重绘:
InvalidateRect(&Rect)
Invalidate()
UpdateWindow()
等待WM_PAINT消息以便重绘,队列中无其他消息时系统会自动发送。UpdateWindow()会立即发送WM_PAINT。系统为什么不在调用Invalidate时发送WM_PAINT消息呢? 又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽 可能地推后做。不过这样也有利于提高绘制的
效率:两个WM_PAINT消息之间通过InvalidateRect和InvaliateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到 更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:
WM_ERASEBKGND: 清除背景
WM_PAINT: 在上面绘制内容
这两个过程让窗体在绘制内容时变得很简单,即:每次当收到WM_PAINT消息时,你知道已经有了一个新画布等待去绘制。然而,画窗口两次(一次是通过WM_ERASEBKGND画背景,另外一次是WM_PAINT)将会导致窗口出现比较糟糕的闪烁现象。只要看看标准的编辑框-打开Windows的写字板并改变窗口大小,就可以看到那种闪烁的效果。