VCpp程序关闭程序的办法总结

⌚Time: 2022-12-28 10:58:06

👨‍💻Author: Jack Ge

源自AI回答:

以下是 VC++ 中关闭程序的常用方法及其区别:

1. 正常关闭的推荐方式

PostQuitMessage(nExitCode)

// 发送 WM_QUIT 到消息队列
PostQuitMessage(0);  // 0 是退出代码

// 通常在主窗口的 WM_DESTROY 中调用
case WM_DESTROY:
    PostQuitMessage(0);
    break;

SendMessage/PostMessage WM_CLOSE

// 向窗口发送关闭消息
SendMessage(hWnd, WM_CLOSE, 0, 0);  // 同步发送
PostMessage(hWnd, WM_CLOSE, 0, 0);  // 异步发送

DestroyWindow

// 直接销毁窗口
DestroyWindow(hWnd);

// MFC 中
CWnd::DestroyWindow();

2. MFC 框架中的关闭方法

OnClose() 和 OnCancel()

// 在对话框或窗口中重写
void CMyDialog::OnClose()
{
    // 保存数据、清理资源
    CDialog::OnClose();  // 调用基类
}

void CMyDialog::OnCancel()
{
    // 针对取消按钮的处理
    CDialog::OnCancel();  // 调用 EndDialog(IDCANCEL)
}

// 直接关闭
EndDialog(IDOK);      // 模态对话框
DestroyWindow();      // 非模态对话框或窗口

AfxPostQuitMessage (MFC 专用)

AfxPostQuitMessage(nExitCode);  // MFC 封装的 PostQuitMessage

3. 强制终止方法(不推荐)

TerminateProcess

#include <windows.h>

// 强制终止进程
TerminateProcess(GetCurrentProcess(), exitCode);

// 终止其他进程
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
TerminateProcess(hProcess, 1);
CloseHandle(hProcess);

exit() 和 _exit()

#include <stdlib.h>

exit(0);      // 执行清理后退出(调用 atexit 注册的函数)
_exit(0);     // 立即退出,不执行任何清理
quick_exit(0); // C11,有限清理

abort()

abort();  // 异常终止,产生 abort 信号

4. 进程相关函数

ExitProcess

ExitProcess(exitCode);  // Windows API

5. 完整关闭流程示例

Win32 标准流程

// 1. 用户点击关闭按钮或选择关闭菜单
// 2. 系统发送 WM_CLOSE
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_CLOSE:
        // 询问用户是否保存
        if (MessageBox(hWnd, L"保存更改吗?", L"提示", 
                       MB_YESNOCANCEL) == IDCANCEL)
            return 0;  // 取消关闭
        
        // 继续关闭流程
        DestroyWindow(hWnd);
        return 0;
        
    case WM_DESTROY:
        // 清理资源
        CleanupResources();
        
        // 退出消息循环
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

MFC 标准流程

// 1. 用户操作触发关闭
// 2. 框架调用 OnClose()
void CMainFrame::OnClose()
{
    if (!SaveModified())  // 检查是否需要保存
        return;           // 用户取消
    
    // 保存设置等
    SaveSettings();
    
    CFrameWnd::OnClose();  // 调用基类,继续关闭
}

// 3. 框架调用 OnDestroy()
void CMainFrame::OnDestroy()
{
    // 清理资源
    Cleanup();
    
    CFrameWnd::OnDestroy();  // 调用基类
}

6. 最佳实践总结

方法 使用场景 清理流程 推荐度
PostQuitMessage 主消息循环退出 完整 ★★★★★
WM_CLOSE 用户关闭窗口 完整 ★★★★★
DestroyWindow 程序控制关闭 完整 ★★★★☆
EndDialog 模态对话框关闭 完整 ★★★★☆
exit() 控制台程序 部分 ★★☆☆☆
TerminateProcess 强制终止 ★☆☆☆☆
abort() 严重错误 ★☆☆☆☆

7. 推荐做法

// 标准 Win32 程序
void CloseApplication(HWND hMainWnd)
{
    // 1. 发送关闭消息(允许用户取消)
    SendMessage(hMainWnd, WM_CLOSE, 0, 0);
    
    // 或者直接销毁(如果不需要用户确认)
    // DestroyWindow(hMainWnd);
}

// MFC 程序
void CMyApp::ExitInstance()
{
    // 应用程序退出前的最后清理
    CleanupAppResources();
    return CWinApp::ExitInstance();
}

记住:在 GUI 程序中,尽量使用消息驱动的关闭方式,确保资源正确释放和清理代码被执行。强制终止方法只应在极端情况下使用。