我做了一个MDI程序,每次在资源管理器里面双击一个文件都会打开一个新的窗口,有没有办法让它都在一个窗口里面打开呢?
解决方案 »
- CFileDialog 怎么限制文件名的个数?
- 用什么控件能按行显示内容,并根据收到的消息动态的加亮某行?
- 用WM_SETTEXT,EN_UPDATE,EN_CHANGE,WM_KILLFOCUS不能解决之问题
- 关于访问注册表确定office版本号的问题
- 请教一下关于FAR类型的指针!
- ##########关于模糊查找的种种##############
- 关于系统资源问题?UP有分!
- 高精度定时器
- 如何下载large-scale C++ software design
- 请高手帮我找到问题所在!0xc0000005和0xc00000fd
- __int64的问题
- 一个小问题, 怎么样把VISUAL C++ 6。0 设置成需要多线程的版本阿。
比方说,我装了VC6,点击dsw文件时,每点一次VC都只开一个进程打开该工程
我又安装了VC.NET,将dsw默认打开程序设回VC6后,每次点击都重新开一个进程打开工程了
你可以查阅相关资料..我一时忘了的
#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()