mfc怎样通过双击listctrl的不同行来创建不同的窗口
时间: 2023-12-02 13:02:10 浏览: 30
您可以按照以下步骤实现:
1. 在您的 MFC 应用程序中,创建一个派生自 CFrameWnd 的窗口类。
2. 在您的 CMainFrame 类中,添加一个成员变量 m_wndSplitter,用于分割窗口。
3. 在您的 CMainFrame::OnCreate() 函数中,创建一个 CSplitterWnd 对象,并使用它来创建两个视图。
4. 在您的 CMainFrame 类中,添加一个成员函数 CreateNewView(),用于创建新的视图。
5. 在您的 CMainFrame 类中,处理 WM_NOTIFY 消息,以便在列表控件中双击某一行时调用 CreateNewView() 函数。
具体的实现细节可以参考以下代码示例:
```cpp
// MySplitterWnd.h
class MySplitterWnd : public CSplitterWnd
{
public:
MySplitterWnd();
virtual ~MySplitterWnd();
protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
};
// MySplitterWnd.cpp
MySplitterWnd::MySplitterWnd()
{
}
MySplitterWnd::~MySplitterWnd()
{
}
BOOL MySplitterWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (HIWORD(wParam) == 0 && LOWORD(wParam) == ID_NEW_VIEW)
{
CreateNewView();
return TRUE;
}
return CSplitterWnd::OnCommand(wParam, lParam);
}
// CMainFrame.cpp
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyListView), CSize(0, 0), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyDetailView), CSize(0, 0), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
return TRUE;
}
void CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->code == NM_DBLCLK && pNMHDR->idFrom == IDC_LIST_CTRL)
{
m_wndSplitter.SendMessage(WM_COMMAND, ID_NEW_VIEW);
}
*pResult = 0;
}
void CMainFrame::CreateNewView()
{
CCreateContext context;
context.m_pCurrentDoc = GetActiveDocument();
context.m_pNewViewClass = RUNTIME_CLASS(CMyDetailView);
context.m_pNewDocTemplate = NULL;
context.m_pLastView = GetActiveView();
context.m_pCurrentFrame = this;
CMDIChildWnd* pChildWnd = (CMDIChildWnd*)CreateNewChild(&context);
if (pChildWnd != NULL)
{
pChildWnd->SendMessage(WM_INITIALUPDATE);
}
}
```
在上述代码中,MySplitterWnd 类继承自 CSplitterWnd,用于处理 WM_NOTIFY 消息。当列表控件中的某一行被双击时,会发送 NM_DBLCLK 消息,此时可以调用 CreateNewView() 函数创建一个新的视图。CreateNewView() 函数使用 CCreateContext 类来指定新视图的创建上下文,然后调用 CreateNewChild() 函数创建一个新的 MDI 子窗口,并将新视图添加到其中。