在无模式对话框还没关闭的时候,点了关闭程序按扭,接下来MFC框架发生了哪些事?俺主要想弄清楚在关闭MFC程序的时候,MFC框架是如何执行清除及关闭命令的。
请大侠解答一下。

解决方案 »

  1.   

    跟踪调试下不就行了,VS的话F11
      

  2.   

    用SPY++监视一下窗口的消息,或者在程序中重载WindowProc把收到的消息输出。
    主要是WM_SYSCOMMAND产生WM_CLOSE,自己要调用DestroyWindow函数,然后才产生WM_DESTROY,最后是调用PostNcDestroy虚函数。
      

  3.   

    用SPY++监视一下窗口的消息,或者在程序中重载WindowProc把收到的消息输出。 
    主要是WM_SYSCOMMAND产生WM_CLOSE,自己要调用DestroyWindow函数,然后才产生WM_DESTROY,最后是调用PostNcDestroy虚函数。
      

  4.   

    这个SPY工具真是太强大了,截取了点关闭按扭时的消息,如下:
    大框架窗体发送的消息有:
    <00719> 005E0A68 S WM_NCHITTEST xPos:821 yPos:18
    <00720> 005E0A68 R WM_NCHITTEST nHittest:HTCLOSE
    <00721> 005E0A68 S WM_SETCURSOR hwnd:005E0A68 nHittest:HTCLOSE wMouseMsg:WM_LBUTTONDOWN
    <00722> 005E0A68 R WM_SETCURSOR fHaltProcessing:False
    <00723> 005E0A68 P WM_NCLBUTTONDOWN nHittest:HTCLOSE xPos:821 yPos:18
    <00724> 005E0A68 P WM_LBUTTONUP fwKeys:0000 xPos:747 yPos:-34
    <00725> 005E0A68 S WM_CAPTURECHANGED hwndNewCapture:00000000
    <00726> 005E0A68 R WM_CAPTURECHANGED
    <00727> 005E0A68 S WM_SYSCOMMAND uCmdType:SC_CLOSE xPos:821 yPos:18
    <00728> 005E0A68 S WM_CLOSE
    <00729> 005E0A68 S WM_SHOWWINDOW fShow:False fuStatus:0 (ShowWindow 被调用)
    <00730> 005E0A68 R WM_SHOWWINDOW
    <00731> 005E0A68 S WM_WINDOWPOSCHANGING lpwp:0012F3B4
    <00732> 005E0A68 R WM_WINDOWPOSCHANGING
    <00733> 005E0A68 S WM_WINDOWPOSCHANGED lpwp:0012F3B4
    <00734> 005E0A68 R WM_WINDOWPOSCHANGED
    <00735> 005E0A68 S WM_NCACTIVATE fActive:False
    <00736> 005E0A68 R WM_NCACTIVATE fDeactivateOK:True
    <00737> 005E0A68 S WM_ACTIVATE fActive:WA_INACTIVE fMinimized:False hwndPrevious:(空)
    <00738> 005E0A68 S WM_ACTIVATETOPLEVEL fActive:False dwThreadID:0012F17C
    <00739> 005E0A68 R WM_ACTIVATETOPLEVEL
    <00740> 005E0A68 S WM_NCACTIVATE fActive:False
    <00741> 005E0A68 R WM_NCACTIVATE fDeactivateOK:True
    <00742> 005E0A68 S WM_FLOATSTATUS wFloatState:FS_DEACTIVATE
    <00743> 005E0A68 R WM_FLOATSTATUS
    <00744> 005E0A68 R WM_ACTIVATE
    <00745> 005E0A68 S WM_ACTIVATEAPP fActive:False dwThreadID:00000F88
    <00746> 005E0A68 R WM_ACTIVATEAPP
    <00747> 005E0A68 S WM_WINDOWPOSCHANGING lpwp:0012F388
    <00748> 005E0A68 R WM_WINDOWPOSCHANGING
    <00749> 005E0A68 S WM_WINDOWPOSCHANGED lpwp:0012F388
    <00750> 005E0A68 R WM_WINDOWPOSCHANGED
    <00751> 005E0A68 S message:0x0501 [用户定义:WM_USER+257] wParam:00000000 lParam:00000000
    <00752> 005E0A68 R message:0x0501 [用户定义:WM_USER+257] lResult:00000000
    <00753> 005E0A68 S WM_DESTROY
    <00754> 005E0A68 R WM_DESTROY
    <00755> 005E0A68 S WM_NCDESTROY
    <00756> 005E0A68 R WM_NCDESTROY
    <00757> 005E0A68 R WM_CLOSE
    <00758> 005E0A68 R WM_SYSCOMMAND
    ================================================================================
    小窗体的消息有:
    <00036> 007F0968 S WM_WINDOWPOSCHANGING lpwp:0012F3B4
    <00037> 007F0968 R WM_WINDOWPOSCHANGING
    <00038> 007F0968 S WM_FLOATSTATUS wFloatState:FS_DEACTIVATE
    <00039> 007F0968 R WM_FLOATSTATUS
    <00040> 007F0968 S WM_ACTIVATEAPP fActive:False dwThreadID:00000F88
    <00041> 007F0968 R WM_ACTIVATEAPP
    <00042> 007F0968 S WM_SHOWWINDOW fShow:False fuStatus:SW_PARENTCLOSING
    <00043> 007F0968 S WM_SHOWWINDOW fShow:False fuStatus:0 (ShowWindow 被调用)
    <00044> 007F0968 R WM_SHOWWINDOW
    <00045> 007F0968 S WM_WINDOWPOSCHANGING lpwp:0012EFB0
    <00046> 007F0968 R WM_WINDOWPOSCHANGING
    <00047> 007F0968 S WM_WINDOWPOSCHANGED lpwp:0012EFB0
    <00048> 007F0968 S WM_GETICON fType:True
    <00049> 007F0968 R WM_GETICON hicon:00000000
    <00050> 007F0968 S WM_GETICON fType:False
    <00051> 007F0968 R WM_GETICON hicon:00000000
    <00052> 007F0968 S WM_GETICON fType:True
    <00053> 007F0968 R WM_GETICON hicon:00000000
    <00054> 007F0968 R WM_WINDOWPOSCHANGED
    <00055> 007F0968 R WM_SHOWWINDOW
    <00056> 007F0968 S WM_WINDOWPOSCHANGING lpwp:0012F388
    <00057> 007F0968 R WM_WINDOWPOSCHANGING
    <00058> 007F0968 S WM_WINDOWPOSCHANGED lpwp:0012F388
    <00059> 007F0968 S WM_GETICON fType:True
    <00060> 007F0968 R WM_GETICON hicon:00000000
    <00061> 007F0968 S WM_GETICON fType:False
    <00062> 007F0968 R WM_GETICON hicon:00000000
    <00063> 007F0968 S WM_GETICON fType:True
    <00064> 007F0968 R WM_GETICON hicon:00000000
    <00065> 007F0968 R WM_WINDOWPOSCHANGED
    <00066> 007F0968 S WM_DESTROY
    <00067> 007F0968 R WM_DESTROY
    <00068> 007F0968 S WM_NCDESTROY
    <00069> 007F0968 R WM_NCDESTROY
      

  5.   

    用一个简单的调试方法:
    1.如果你的程序是对话框的,那么先用classwizard添加一个WM_DESTROY消息相应
    2.在你的主程序任意位置 F9 添加一个断点,在OnDestroy里边某行也添加一个
    3.按F5调试 打开对话框,再关闭,主要观察左下角的窗口context 内,它就是退出的时候程序要调用的函数
    4.按shift+F11 依次调试直至程序调试退出。