唉。MDI的子窗口打开就覆盖前面打开的窗口这是因为ChildFrameBringWindowToTop()的原因。
你可以这样做:
给你的ChildFrame去掉WM_VISIBLE风格,
然后,再调SetWindowPos()放到一定的Z-ORDER就可以搞定了。
——:),不好意思,我自己没试:因为我不需要这样做,也许还有其他方法。
你可以这样做:
给你的ChildFrame去掉WM_VISIBLE风格,
然后,再调SetWindowPos()放到一定的Z-ORDER就可以搞定了。
——:),不好意思,我自己没试:因为我不需要这样做,也许还有其他方法。
不行啊,我这里没试成。poweruser:
MDIActivate()不是主窗口激活...的函数么?大家再帮我想想办法!
弹出的子窗口在所有子窗口的后面,不过这个方法不提倡。
CFrameWnd *pFrameWnd = NULL;
CMDIChildWnd *pMDIActive = MDIGetActive() ;
ASSERT ( NULL != pMDIActive );
CDocument *pDoc = pMDIActive->GetActiveDocument();
ASSERT_VALID ( pDoc ); POSITION pos = pDoc->GetFirstViewPosition();
while ( NULL != pos )
{
CView *pView = pDoc->GetNextView(pos);
if ( pView->IsKindOf ( pViewClass ) )//一个参数
{
pFrameWnd = pView->GetParentFrame();
pFrameWnd->ActivateFrame( SW_SHOWNORMAL );//这里不可见
return ;
}
} pFrameWnd = pTemplate->CreateNewFrame ( pDoc , NULL );
if ( NULL == pFrameWnd ) return;
pTemplate->InitialUpdateFrame( pFrameWnd , pDoc);
为了排除闪烁的问题,不妨先让其不可见.顺便说一句,111222兄,为何要这么干呀?如果不是特殊需要,可以绕开这样的问题(比如在建视时就处理.)哟.
一艘小船兄,目前,这样创建新窗口后选回上一个试图的方法是肯定有闪烁的。
创建视图的时候怎么处理?
问题我解决了。实在不好意思。开始的时候我自己没去试。
如下:
void OnFileNew()
{
CDocument* pDoc = NULL;
POSITION pos = GetFirstDocTemplatePosition();
ASSERT(pos != NULL);
CDocTemplate* pTemplate=NULL;
pTemplate= GetNextDocTemplate(pos); pDoc=pTemplate->OpenDocumentFile (NULL,false);
pos = pDoc->GetFirstViewPosition ();
CFrameWnd* pFrame;
CView * pView;
pView =(CView*) pDoc->GetNextView (pos);
pFrame=pView->GetParentFrame ();
pFrame->ShowWindow (SW_SHOW);
}我已经做了一个例子,如果需要的话,我有空上传到我的空间上去,现在不行,因为服务器出了问题,(怒)。http://www.erehw.com
如下:void CMyWinApp::OnFileNew()
{
CDocument* pDoc = NULL;
POSITION pos = GetFirstDocTemplatePosition();
ASSERT(pos != NULL); CDocTemplate* pTemplate=NULL; pTemplate= GetNextDocTemplate(pos); pDoc=pTemplate->OpenDocumentFile (NULL,false);
pos = pDoc->GetFirstViewPosition ();
CFrameWnd* pFrame;
CView * pView;
pView =(CView*) pDoc->GetNextView (pos);
pFrame=pView->GetParentFrame ();
pFrame->ShowWindow (SW_SHOW);
}我已经做了一个例子,如果需要的话,我有空上传到我的空间上去,现在不行,因为服务器出了问题,(怒)。http://www.erehw.com
____
呀,GetFirstDocTemplatePosition()和GetNextDocTemplate()是CWinApp的成员函数。:D
多谢例子,小弟这就加分。
不过还有一事不明,为什么用于CHtmlView导致CHtmlView无法初始化,不能加载WebBrowser控件呢?
还有就是,我发现,我的这个程序根本没法实现窗口后台打开。可能是BCG界面库的TabCtrl的问题。
因为我设置某个子窗口总在顶端
SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOSIZE|SWP_NOMOVE);
结果是,无效。
可能是TabCtrl有自动把新窗口带到顶端的属性的原因。
好,帮忙就做到底吧。虽然有点点忙。
——————————————————————————————————
多几种办法,一是自己写一个类来实现CBCGMainClientAreaWnd的功能,我有这样的类,不过,界面上比不过BCG,那是好久以前的了。
所以呢,在这里就不提了,因为BCG毕竟是功能很强大的了。
第二个办法就是修改BCG类库,就不说那么多了,反正是修改CBCGMainClientAreaWnd。
1、打开文件:BCGMainClientAreaWnd.h
给CBCGMainClientAreaWnd增加一个成员变量:
public:
bool m_bBringToTopWhenOpened;//公有成员,偷懒了,不想写成员函数
2、打开BCGMainClientAreaWnd.cpp
修改三个地方:
a、在CBCGMainClientAreaWnd::CBCGMainClientAreaWnd()中增加:
{
m_bBringToTopWhenOpened = true;
}
b、
到文件是最底处,修改UpdateTabs()
为: m_wndTab.SetActiveTab (m_wndTab.GetTabsNum () - 1);
增加一个条件,改为://文件的363行左右
if(m_bBringToTopWhenOpened)
m_wndTab.SetActiveTab (m_wndTab.GetTabsNum () - 1);
为最后几行:
GetParentFrame ()->RecalcLayout ();
同样也增加一个条件://约在文件的373左右,处于最底下。
if(m_bBringToTopWhenOpened)
GetParentFrame ()->RecalcLayout ();
要说明的是,上面这一个条件,我看不到要加的必要,不过我现在是加上了这一个条件,测试了一下,没有发现什么问题。你也许需要将这一个条件不加测试一下,(我很懒,宁愿在这里多写几句,也懒得自己去测试了,不过我认为在这里没有多大问题的。)
c、重新BUILD BCG类库3、用BCG向导建一个工程,在CMainFrame::OnCreateClient的最前面加上一条:
m_wndClientArea.m_bBringToTopWhenOpened=false;
4、如上我所说的,重装CWinApp::OnFileNew()
void CBT2App::OnFileNew()
{
CDocument* pDoc = NULL;
POSITION pos = GetFirstDocTemplatePosition();
ASSERT(pos != NULL);
CDocTemplate* pTemplate=NULL;
pTemplate= GetNextDocTemplate(pos); pDoc=pTemplate->OpenDocumentFile (NULL,false);
pos = pDoc->GetFirstViewPosition ();
CFrameWnd* pFrame;
CView * pView;
pView =(CView*) pDoc->GetNextView (pos);
pFrame=pView->GetParentFrame ();
pFrame->ShowWindow (SW_SHOW);
}5、OK。现在Build 工程。
——————————————————————————
我做了一个小试验,你可以到我主页首页去下载。http://www.erehw.com
地址也许是:http://www.erehw.com/tojoyue/bt2.rar
(不过服务器经常坏。)
在我的例子中,如果找不到cscommon.h请将这一句注释掉。
同时可能还需要定义宏:
#define chASSERT(x) ASSERT(x)
#define chVERIFY(x) VERIFY(x)6、GOOD LUCK。
我想改BCG,却不知道从何下手......
无以言谢了,再来领分