怎样实现:关闭某个程序后,重新打开,所有的设置和状态都保持最后一次关闭时候的样子。

解决方案 »

  1.   

    mfc对此功能用内置的支持。自己实现的话,可以在关闭时把设置保存在注册表中或.ini文件中,在此打开时用这些信息设置你的程序的状态。
      

  2.   

    vc技术内幕有个例子可以记下窗口的特征,不过是单文档的
    // Persist.h#ifndef _INSIDE_VISUAL_CPP_PERSISTENT_FRAME
    #define _INSIDE_VISUAL_CPP_PERSISTENT_FRAMEclass CPersistentFrame : public CFrameWnd
    { // remembers where it was on the desktop
    DECLARE_DYNAMIC(CPersistentFrame)
    private:
    static const CRect s_rectDefault;
    static const char s_profileHeading[];
    static const char s_profileRect[];
    static const char s_profileIcon[];
    static const char s_profileMax[];
    static const char s_profileTool[];
    static const char s_profileStatus[];
    BOOL m_bFirstTime;
    protected: // Create from serialization only
    CPersistentFrame();
    ~CPersistentFrame(); //{{AFX_VIRTUAL(CPersistentFrame)
    public:
    virtual void ActivateFrame(int nCmdShow = -1);
    protected:
    //}}AFX_VIRTUAL //{{AFX_MSG(CPersistentFrame)
    afx_msg void OnDestroy();
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };#endif // _INSIDE_VISUAL_CPP_PERSISTENT_FRAME
      

  3.   

    // Persist.cpp Persistent frame class for SDI apps#include "stdafx.h"
    #include "persist.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char BASED_CODE THIS_FILE[] = __FILE__;
    #endif
    ///////////////////////////////////////////////////////////////
    // CPersistentFrameconst CRect CPersistentFrame::s_rectDefault(10,  10,
                                                500, 400);  // static
    const char CPersistentFrame::s_profileHeading[] = "Window size";
    const char CPersistentFrame::s_profileRect[] = "Rect";
    const char CPersistentFrame::s_profileIcon[] = "icon";
    const char CPersistentFrame::s_profileMax[] = "max";
    const char CPersistentFrame::s_profileTool[] = "tool";
    const char CPersistentFrame::s_profileStatus[] = "status";
    IMPLEMENT_DYNAMIC(CPersistentFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CPersistentFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CPersistentFrame)
    ON_WM_DESTROY()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()///////////////////////////////////////////////////////////////
    CPersistentFrame::CPersistentFrame()
    {
    m_bFirstTime = TRUE;
    }///////////////////////////////////////////////////////////////
    CPersistentFrame::~CPersistentFrame()
    {
    }///////////////////////////////////////////////////////////////
    void CPersistentFrame::OnDestroy()
    {
    CString strText;
    BOOL bIconic, bMaximized; WINDOWPLACEMENT wndpl;
    wndpl.length = sizeof(WINDOWPLACEMENT);
    // gets current window position and
    //  iconized/maximized status
    BOOL bRet = GetWindowPlacement(&wndpl);
    if (wndpl.showCmd == SW_SHOWNORMAL) {
    bIconic = FALSE;
    bMaximized = FALSE;
    }
    else if (wndpl.showCmd == SW_SHOWMAXIMIZED) {
    bIconic = FALSE;
    bMaximized = TRUE;

    else if (wndpl.showCmd == SW_SHOWMINIMIZED) {
    bIconic = TRUE;
    if (wndpl.flags) {
    bMaximized = TRUE;
    }
    else {
    bMaximized = FALSE;
    }
    }
    strText.Format("%04d %04d %04d %04d",
                   wndpl.rcNormalPosition.left,
                   wndpl.rcNormalPosition.top,
                   wndpl.rcNormalPosition.right,
                   wndpl.rcNormalPosition.bottom);
    AfxGetApp()->WriteProfileString(s_profileHeading,
                                    s_profileRect, strText);
    AfxGetApp()->WriteProfileInt(s_profileHeading,
                                 s_profileIcon, bIconic);
    AfxGetApp()->WriteProfileInt(s_profileHeading,
                                 s_profileMax, bMaximized);
    SaveBarState(AfxGetApp()->m_pszProfileName);
    CFrameWnd::OnDestroy();
    }///////////////////////////////////////////////////////////////
    void CPersistentFrame::ActivateFrame(int nCmdShow)
    {
    CString strText;
    BOOL bIconic, bMaximized;
    UINT flags;
    WINDOWPLACEMENT wndpl;
    CRect rect; if (m_bFirstTime) {
    m_bFirstTime = FALSE;
    strText = AfxGetApp()->GetProfileString(s_profileHeading,
                                            s_profileRect);
    if (!strText.IsEmpty()) {
    rect.left = atoi((const char*) strText);
    rect.top = atoi((const char*) strText + 5);
    rect.right = atoi((const char*) strText + 10);
    rect.bottom = atoi((const char*) strText + 15);
    }
    else {
    rect = s_rectDefault;
    } bIconic = AfxGetApp()->GetProfileInt(s_profileHeading,
                                         s_profileIcon, 0);
    bMaximized = AfxGetApp()->GetProfileInt(s_profileHeading,
                                            s_profileMax, 0);   
    if (bIconic) {
    nCmdShow = SW_SHOWMINNOACTIVE;
    if (bMaximized) {
    flags = WPF_RESTORETOMAXIMIZED;
    }
    else {
    flags = WPF_SETMINPOSITION;
    }
    }
    else {
    if (bMaximized) {
    nCmdShow = SW_SHOWMAXIMIZED;
    flags = WPF_RESTORETOMAXIMIZED;
    }
    else {
    nCmdShow = SW_NORMAL;
    flags = WPF_SETMINPOSITION;
    }
    }
    wndpl.length = sizeof(WINDOWPLACEMENT);
    wndpl.showCmd = nCmdShow;
    wndpl.flags = flags;
    wndpl.ptMinPosition = CPoint(0, 0);
    wndpl.ptMaxPosition =
    CPoint(-::GetSystemMetrics(SM_CXBORDER),
           -::GetSystemMetrics(SM_CYBORDER));
    wndpl.rcNormalPosition = rect;
    LoadBarState(AfxGetApp()->m_pszProfileName);
    // sets window's position and minimized/maximized status
    BOOL bRet = SetWindowPlacement(&wndpl);
    }
    CFrameWnd::ActivateFrame(nCmdShow);
    }