我做了一个MDI程序,每次在资源管理器里面双击一个文件都会打开一个新的窗口,有没有办法让它都在一个窗口里面打开呢?

解决方案 »

  1.   

    这跟程序运行的参数有关
    比方说,我装了VC6,点击dsw文件时,每点一次VC都只开一个进程打开该工程
    我又安装了VC.NET,将dsw默认打开程序设回VC6后,每次点击都重新开一个进程打开工程了
    你可以查阅相关资料..我一时忘了的
      

  2.   

    我的解决办法很简单,在程序中创建一个共享段:
    #pragma data_seg("Shared")     
    HWND volatile g_wndMainFrame = 0;
    #pragma data_seg()
    #pragma comment(linker,"/section:Shared,RWS")在程序初始化时(在App的InitInstance函数里)添加这一段(记住放到主窗口创建完之后,ProcessShellCommand函数调用之前),初始化该变量为主窗口的句柄:
    //...
    if(g_wndMainFrame == 0){
    g_wndMainFrame = m_pMainWnd->m_hWnd;
    }else{
    if(cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen){
    COPYDATASTRUCT data;
    data.dwData = 0;
    data.cbData = cmdInfo.m_strFileName.GetLength();
    data.lpData = (LPVOID)(LPCSTR)cmdInfo.m_strFileName;
    ::SendMessage(g_wndMainFrame, WM_COPYDATA, 
    (WPARAM)m_pMainWnd->m_hWnd, (LPARAM)&data);
    return FALSE;
    }
    }
    //...
    然后再CMainFrame类里添加消息处理函数,处理WM_COPYDATA消息:
    HRESULT CMainFrame::OnCopyData(WPARAM wParam, LPARAM lParam)
    {
    COPYDATASTRUCT *p = (COPYDATASTRUCT*)lParam;
    CString szFile((LPCSTR)p->lpData, p->cbData);
    AfxGetApp()->OpenDocumentFile(szFile);
    AfxGetMainWnd()->SetForegroundWindow();
    return 0;
    }
    记住还要添加消息处理宏:
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //    DO NOT EDIT what you see in these blocks of generated code !
    //...
    ON_MESSAGE(WM_COPYDATA, OnCopyData) // 加入这一句
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
      

  3.   

    楼主~~~~~::SendMessage(g_wndMainFrame, WM_COPYDATA, (WPARAM)m_pMainWnd->m_hWnd, (LPARAM)&data);这个好象有点问题啊,似乎消息是接受到了,不过处理时发觉居然地址是空的,怎么回事啊?我看了下,发送前data.lpdata里是文件名,不过&data就是空,怎么会这样啊?
      

  4.   

    data.cbData填文件名长度了没有?没填长度是不行的,详见MSDN中WM_COPYDATA消息的帮助