怎样在应用程序的任何位置得到CChildFrame? 在多文档窗口中,我通过AfxGetMainWnd()获得了主框架窗口CMainFrame,我怎么才能获得CChildFrame呢?用AfxGetMainWnd()->GetActiveWindow()的时候出错了.或者有没有其他方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 msdn中有一片统计child wnd 的文章 还有你可以设一个全局 我当前就一个CChildFrame.那篇文章怎么找到? Knowledge Base Articles HOWTO: How to Use MFC to Step Through Child Windows of the MDIClientQ131994--------------------------------------------------------------------------------The information in this article applies to:The Microsoft Foundation Classes (MFC), used with:Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52 Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0--------------------------------------------------------------------------------SUMMARYYou can iterate through all the MDI child windows in an MDI application without specifically activating them in turn. These CMDIChildWnd objects are managed by the MDIClient window, which covers the client area of the main frame window in an MDI application. Although this window does not have a corresponding MFC object, you can attach it to a CWnd object and use the features of the CWnd class to access each of the MDI child windows. MORE INFORMATIONIn MFC, each CMDIChildWnd created by the framework is managed as a child window of the MDIClient window. This MDIClient window is a child of the mainframe window and fills its client area. For MDI applications, the mainframe window is encapsulated by the CMDIFrameWnd class. This class has a public embedded HWND member (m_hWndMDIClient), which is the handle to the MDIClient window. For MDI applications, AppWizard derives the CMainFrame class from CMDIFrameWnd.The MDIClient maintains an internal list of child windows. In an MFC application, these child windows are either a CMDIChildWnd object or an internal window used to display the title of an iconized window. Note that this is an internal list controlled by Windows; don't make assumptions about the ordering of children in the list after an API function is called.How to Step Through the MDIClient's Child Window ListTo access the MDIClient window in MFC, attach a CWnd derived class to m_hWndMDIClient as shown in the sample code. Another option is to subclass the MDIClient discussed in the following article in the Microsoft Knowledge Base:Q103786 Changing Window Background Color with Foundation Classes Implement the GetNextMDIChildWnd() function as defined below. This custom member of the CMDIFrameWnd-derived object uses another custom member, m_pWndCurrentChild, to store the current child window between calls.Implement the GetCountCMDIChildWnds() function as defined below. Another custom member of the CMDIFrameWnd-derived object, this function calls GetNextMDIChildWnd() to get the count of CMDIChildWnd objects maintained by the MDIClient.NOTE: You can derive a class from CMDIChildWnd to customize the behavior of the MDI child windows in your application. For example, you can add information to further differentiate between the CMDIChildWnd derived classes.Sample Code//**mainfrm.h***************************************************class CMainFrame : public CMDIFrameWnd{...public: CWnd m_wndMDIClient; CWnd* m_pWndCurrentChild; CMDIChildWnd* GetNextMDIChildWnd(); int GetCountCMDIChildWnds();...}//**mainfrm.cpp**************************************************CMainFrame::CMainFrame():m_pWndCurrentChild(NULL){ //.................}CMainFrame::~CMainFrame(){ m_wndMDIClient.Detach(); //.................}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (m_wndMDIClient.Attach(m_hWndMDIClient) == 0) { TRACE0("Failed to attach MDIClient.\n"); return -1; // fail to create } //.................}//----------------------------------------------------------------// This function finds the CMDIChildWnd in the list of windows// maintained by the application's MDIClient window following the// one pointed to by the member variable m_pWndCurrentChild. If no// further CMDIChildWnds are in the list, NULL is returned.//----------------------------------------------------------------CMDIChildWnd* CMainFrame::GetNextMDIChildWnd(){ if (!m_pWndCurrentChild) { // Get the first child window. m_pWndCurrentChild = m_wndMDIClient.GetWindow(GW_CHILD); } else { // Get the next child window in the list. m_pWndCurrentChild= (CMDIChildWnd*)m_pWndCurrentChild->GetWindow(GW_HWNDNEXT); } if (!m_pWndCurrentChild) { // No child windows exist in the MDIClient, // or you are at the end of the list. This check // will terminate any recursion. return NULL; } // Check the kind of window if (!m_pWndCurrentChild->GetWindow(GW_OWNER)) { if (m_pWndCurrentChild-> IsKindOf(RUNTIME_CLASS(CMDIChildWnd))) { // CMDIChildWnd or a derived class. return (CMDIChildWnd*)m_pWndCurrentChild; } else { // Window is foreign to the MFC framework. // Check the next window in the list recursively. return GetNextMDIChildWnd(); } } else { // Title window associated with an iconized child window. // Recurse over the window manager's list of windows. return GetNextMDIChildWnd(); }}//-----------------------------------------------------------------// This function counts the number of CMDIChildWnd objects// currently maintained by the MDIClient.//-----------------------------------------------------------------int CMainFrame::GetCountCMDIChildWnds(){ int count = 0; CMDIChildWnd* pChild = GetNextMDIChildWnd(); while (pChild) { count++; pChild = GetNextMDIChildWnd(); } return count;} Additional query words: kbinf 1.00 1.50 1.10 2.00 2.10 2.50 2.51 2.52 3.10 4.00 Keywords : kbDocView kbMDI kbMFC kbVC kbGrpDSMFCATL Issue type : kbhowto Technology : kbAudDeveloper kbMFC Last Reviewed: July 29, 2001--------------------------------------------------------------------------------Send feedback to Microsoft© 2002 Microsoft Corporation. All rights reserved. 我是要在程序的任何地方都要能得到CChildFrame. 比如说在我自定义的一个View类里.我这样写不对CChildFrame *pChildFrame = (CChildFrame*)(AfxGetMainWnd()->GetACctiveWindow()); CMainFrame::GetCountCMDIChildWnds(){ int count = 0; CMDIChildWnd* pChild = GetNextMDIChildWnd(); while (pChild) { count++; pChild = GetNextMDIChildWnd(); } return count;} 参考这段程序 CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd 我得到了,用的是 CChildFrame *pChildFrame = (CChildFrame*)( ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveFrame() );谢谢各位了:-) 这是怎么回事呀???debug assertion failed!File:winsplit.cpp Line:349 如图 程序员30以后干吗???? 紧急求助!如何创建子窗口,用openGl 显示三维图形 请教窗口显示相关问题? 请问如何取得EditBox中的值?? ◆如果一张含有汽车的照片,你如何用代码识别出汽车来?◆ 关于开发图像处理软件包的问题请教! 帮忙看一下(在线等待)! 我的hello world程序怎么通不过啊? 谁能给我一个最简单的链表的定义过程?第一个回答的给50分! 在CHtmlView里如何隐藏ScrollBar? 关于CPropertySheet的回车问题
还有你可以设一个全局
那篇文章怎么找到?
Q131994
--------------------------------------------------------------------------------
The information in this article applies to:The Microsoft Foundation Classes (MFC), used with:
Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52
Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0--------------------------------------------------------------------------------
SUMMARY
You can iterate through all the MDI child windows in an MDI application without specifically activating them in turn. These CMDIChildWnd objects are managed by the MDIClient window, which covers the client area of the main frame window in an MDI application. Although this window does not have a corresponding MFC object, you can attach it to a CWnd object and use the features of the CWnd class to access each of the MDI child windows. MORE INFORMATION
In MFC, each CMDIChildWnd created by the framework is managed as a child window of the MDIClient window. This MDIClient window is a child of the mainframe window and fills its client area. For MDI applications, the mainframe window is encapsulated by the CMDIFrameWnd class. This class has a public embedded HWND member (m_hWndMDIClient), which is the handle to the MDIClient window. For MDI applications, AppWizard derives the CMainFrame class from CMDIFrameWnd.The MDIClient maintains an internal list of child windows. In an MFC application, these child windows are either a CMDIChildWnd object or an internal window used to display the title of an iconized window. Note that this is an internal list controlled by Windows; don't make assumptions about the ordering of children in the list after an API function is called.How to Step Through the MDIClient's Child Window List
To access the MDIClient window in MFC, attach a CWnd derived class to m_hWndMDIClient as shown in the sample code. Another option is to subclass the MDIClient discussed in the following article in the Microsoft Knowledge Base:
Q103786 Changing Window Background Color with Foundation Classes
Implement the GetNextMDIChildWnd() function as defined below. This custom member of the CMDIFrameWnd-derived object uses another custom member, m_pWndCurrentChild, to store the current child window between calls.
Implement the GetCountCMDIChildWnds() function as defined below. Another custom member of the CMDIFrameWnd-derived object, this function calls GetNextMDIChildWnd() to get the count of CMDIChildWnd objects maintained by the MDIClient.
NOTE: You can derive a class from CMDIChildWnd to customize the behavior of the MDI child windows in your application. For example, you can add information to further differentiate between the CMDIChildWnd derived classes.
Sample Code//**mainfrm.h***************************************************
class CMainFrame : public CMDIFrameWnd
{
...
public:
CWnd m_wndMDIClient;
CWnd* m_pWndCurrentChild;
CMDIChildWnd* GetNextMDIChildWnd();
int GetCountCMDIChildWnds();
...
}//**mainfrm.cpp**************************************************
CMainFrame::CMainFrame():m_pWndCurrentChild(NULL)
{
//.................
}CMainFrame::~CMainFrame()
{
m_wndMDIClient.Detach();
//.................
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1; if (m_wndMDIClient.Attach(m_hWndMDIClient) == 0)
{
TRACE0("Failed to attach MDIClient.\n");
return -1; // fail to create
}
//.................
}//----------------------------------------------------------------
// This function finds the CMDIChildWnd in the list of windows
// maintained by the application's MDIClient window following the
// one pointed to by the member variable m_pWndCurrentChild. If no
// further CMDIChildWnds are in the list, NULL is returned.
//----------------------------------------------------------------CMDIChildWnd* CMainFrame::GetNextMDIChildWnd()
{
if (!m_pWndCurrentChild)
{
// Get the first child window.
m_pWndCurrentChild = m_wndMDIClient.GetWindow(GW_CHILD);
}
else
{
// Get the next child window in the list.
m_pWndCurrentChild=
(CMDIChildWnd*)m_pWndCurrentChild->GetWindow(GW_HWNDNEXT);
} if (!m_pWndCurrentChild)
{
// No child windows exist in the MDIClient,
// or you are at the end of the list. This check
// will terminate any recursion.
return NULL;
} // Check the kind of window
if (!m_pWndCurrentChild->GetWindow(GW_OWNER))
{
if (m_pWndCurrentChild->
IsKindOf(RUNTIME_CLASS(CMDIChildWnd)))
{
// CMDIChildWnd or a derived class.
return (CMDIChildWnd*)m_pWndCurrentChild;
}
else
{
// Window is foreign to the MFC framework.
// Check the next window in the list recursively.
return GetNextMDIChildWnd();
}
}
else
{
// Title window associated with an iconized child window.
// Recurse over the window manager's list of windows.
return GetNextMDIChildWnd();
}
}//-----------------------------------------------------------------
// This function counts the number of CMDIChildWnd objects
// currently maintained by the MDIClient.
//-----------------------------------------------------------------int CMainFrame::GetCountCMDIChildWnds()
{
int count = 0; CMDIChildWnd* pChild = GetNextMDIChildWnd();
while (pChild)
{
count++;
pChild = GetNextMDIChildWnd();
}
return count;
} Additional query words: kbinf 1.00 1.50 1.10 2.00 2.10 2.50 2.51 2.52 3.10 4.00 Keywords : kbDocView kbMDI kbMFC kbVC kbGrpDSMFCATL
Issue type : kbhowto
Technology : kbAudDeveloper kbMFC
Last Reviewed: July 29, 2001--------------------------------------------------------------------------------Send feedback to Microsoft© 2002 Microsoft Corporation. All rights reserved.
比如说在我自定义的一个View类里.我这样写不对
CChildFrame *pChildFrame = (CChildFrame*)(AfxGetMainWnd()->GetACctiveWindow());
{
int count = 0; CMDIChildWnd* pChild = GetNextMDIChildWnd();
while (pChild)
{
count++;
pChild = GetNextMDIChildWnd();
}
return count;
} 参考这段程序
(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd
CChildFrame *pChildFrame = (CChildFrame*)( ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveFrame() );谢谢各位了:-)