1、HWND 为窗口的句柄(可以认为是指针);message 通常以WM_ 为开头定义的宏; WPARAM和LPARAM都是消息的附加参数;
#typedef UINT WPARAM;
#typedef UINT LPARAM;
2、DWORD 表示一个32位的整数,
3、HINSTANCE 实例的标识(句柄),在MFC中运行程序中,弹出一个对话框,这就是一个实例;HICON为图标的句柄;HCURSOR为光标的句柄;IDC_、IDM_、IDI_等为开头ID,其中ID为identifier;HRBRUSH为画刷句柄;HMENU为菜单的句柄;HDC表示设备描述表或者设备上下文(Device Context)2014-10-02
4、创建一个完整的窗口需要经过下面四个操作步奏:设计一个窗口类;注册窗口类(向操作系统注册,函数RegisterClass());创建窗口(CreateWindow());显示(ShowWindow())及更新(UpdateWindow(),将窗口刷新)窗口。
5、如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反(~)之后再进行与&)运算,就能够实现,如在刚才的style=CS_VERDRAW|CS_HREDRAW|CS_NOCLOSE的基础上去掉CS_NOCLOSE特征,可以用style&~CS_NOCLOSE实现。
6、回调函数:当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。
7、强制类型错误转化在编译的时候不会报错,但是在运行得时候会发生错误。
8、在创建窗口的时候要基于已经设计的参数,否则将导致窗口创建失败。
9、消息循环的机制:
MSG msg;
while(GetMessage(&msg,NULL,0,0)) //GetMessage将消息队列中取出一条消息
{
TranslateMessage(&msg); //如果键盘按下某个键,它将系统发送keydown和keyup的两个消息转化为WM_CHAR消息,将转化后的消息投递到消息队列中,这个转化过程 中不会影响原来的消息,只会产生新的消息。
DispatchMessage(&msg); //将上面的新的消息传回操作系统,操作系统将调用设计窗口时候创建的回调函数
}
10、在程序中我们获取一个DC后(GetDC()),用完后,要记得释放该DC(ReleaseDC()),这是因为GetDC是有系统创建,占据一定的内存,如果不删掉它,会造成内存泄露。
11、当窗口重绘的时候,就会产生WM_PAINT消息;窗口从无到有过程,就会产生WM_PAINT的消息;BeginPaint()和EndPaint()只能够放在响应WM_PAINT消息过程中使用;
12、在if做判断中,通常将常量放在等号之前;
13、通常在判断程序是否要退出的时候,要在WM_CLOSE消息响应中做,而不要在WM_DESTROY中做,这是因为WM_DESTROY中,窗口已经销毁,但是程序还没有退出。
14、