《深入浅出MFC》读书笔记(一,二)(3) 2)设定窗口的相关属性,如 wc.style=...; wc.hIcon=...; wc.lpfnWndPorc=...;//关键!指定窗口类的窗口函数 ...... wc.lpszClassName=...//关键!指定所生成的窗口类的类名 3)向windows注册该窗口类,以后就可以直接根据该窗口类来生成一个个具体的窗口: RegisterClass(&wc); 创建一个窗口 根据上面生成的窗口类创建具体的窗口,并返回窗口的句柄。 HWND hwnd=CreatWindow(......) 该函数第一个参数是窗口类名,而不是上面的wc,这个地方容易出错,我开始就以为是把wc作为第一个参数。 显示windows 上一步只创建而不显示,必须用showWindow()来显示。UpdateWindow来传递一个WM_PAINT给窗口。 为了便于理解和使用,上面的RegisterClass()被封装到InitApplication函数中;而CreateWindow被封装至InitInstance函数中。这种安排很普遍。不清楚vc里是不是这样做的,但记得jbuilder好像是这样的,虽然函数不一定一样。 消息循环 完成上述初始化以后,winmain()进入消息循环: while (GetMessage(&msg,...)){ //若不是WM_QUIT消息,则进入循环 //否则退出循环; TranslateMessage(&msg); //转换键盘消息 DispatchMessage(&msg); } DispatchMessage(&msg)会把消息发给相应的窗口函数。之所以能做到这点,因为: 消息上带有操作系统标上的所属窗口,而窗口所属的窗口类以及指明了相应的窗口函数。