15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


How to make a modeless dialog box NOT always on top

Marty Wagner -- marty@concentra.com
Thursday, February 15, 1996

     This sounds like a question which should be in a FAQ, but I couldn't 
     find it in either the FAQ or the MSDN. 
     
     I have a non-modal dialog box which always sits on top of my other 
     windows. I would like it to behave like every other window, that is, 
     it should be obscured by active windows.
     
     I tried setting the WS_EX_TOPMOST style off using ModifyStyleEx, but 
     it seems that that style is not actually on. Something else is causing 
     the dialog box to always sit on top. I can't figure out what it is, so 
     HELP please.  
     
     Here is the code that creates the dialog and tries to make it 
     non-topmost:
     
     
       m_pDlgErrorTrace = new CuiErrorTraceDlg ();
       m_pDlgErrorTrace->InitErrorTraceDlg (pDoc);
     
       m_pDlgErrorTrace->Create(IDD_ERROR_TRACE);
     
     // Make it a "non-topmost" window so that it doesn't always sit on top
        BOOL bSuccess = m_pDlgErrorTrace->ModifyStyleEx (WS_EX_TOPMOST, 0);
     
     
     Thanks!
     
     Marty Wagner
     marty@concentra.com




Aravind Balakrishnan -- abalakri@us.oracle.com
Friday, February 16, 1996


--Boundary-16991269-0-0

I think all popup windows have this behavior of not being obscured by parent 
windows.  Since a dialog is a popup window, it is exhibiting this behavior.   
 
If this is true, the workaround could be creating a window derived from 
CFrameWnd, and floating the modeless dialog within it.  Since the mainframe is 
an overlapped window, it will hide when other windows of your application are 
active. 
 
If I am not right here, I am bound to be corrected by others! :-)  
 
Cheers,   
Aravind.   
===   
 
Aravind Balakrishnan  
Systems Management Products, Oracle Corp. 
(415)506-0432 



Marty Fried -- mfried@linex.com
Sunday, February 18, 1996

At 11:04 AM 2/15/96 EST, marty@concentra.com wrote:
>     I have a non-modal dialog box which always sits on top of my other 
>     windows. I would like it to behave like every other window, that is, 
>     it should be obscured by active windows.

I had a similar situation, and came up with a solution, but I'm not sure
whether it has any bad side effects or not.  I created the dialog with
the desktop window as the parent ( GetDesktopWindow() ).  I know it requires
a little more attention to what happens when you close the app, since the
dialog doesn't get a close message when the main window closes, but that isn't
really a problem.

Anyone know if this is OK?
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 Marty Fried (mfried@linex.com)
 Marin County, California





Mike Blaszczak -- mikeblas@msn.com
Monday, February 26, 1996

It's just fine... as long as you're careful during cleanup.

.B ekiM
TCHAR sz[] = _T("Ask me how you can get a job at Microsoft.");

----------
From: 	owner-mfc-l@netcom.com on behalf of Marty Fried
Sent: 	Sunday, February 18, 1996 12:07
To: 	mfc-l@netcom.com
Cc: 	mfc-l@netcom.com; marty@concentra.com
Subject: 	Re: How to make a modeless dialog box NOT always on top

At 11:04 AM 2/15/96 EST, marty@concentra.com wrote:
>     I have a non-modal dialog box which always sits on top of my other 
>     windows. I would like it to behave like every other window, that is, 
>     it should be obscured by active windows.

I had a similar situation, and came up with a solution, but I'm not sure
whether it has any bad side effects or not.  I created the dialog with
the desktop window as the parent ( GetDesktopWindow() ).  I know it requires
a little more attention to what happens when you close the app, since the
dialog doesn't get a close message when the main window closes, but that isn't
really a problem.

Anyone know if this is OK?
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 Marty Fried (mfried@linex.com)
 Marin County, California






Bruce Rainwater -- rainwatr@intertex.net
Thursday, November 14, 1996

Environment: VC++ 4.1, Win 95

I have another solution to this question (This is written for a dialog based app) :

Create a modeless dialog class and add it as a member of the main dialog window:  
     #include "mydialog.h"

     class CMainDialog : public CDialog
     {
        .......
        CMyDialog *m_pMyDialog;
        .......
     }

In the main dialog window OnInitDialog() invoke the modless dialog:

       void CMainDlg::OnInitDialog()
       {
        ......
	m_pMyDialog = new CMyDialog;
        ......
       }

add "delete this" to PostNcDestroy to the modeless dialog to delete it when the 
application is closed:

      void CMyDialog::PostNcDestroy() 
      {
	// TODO: Add your specialized code here and/or call the base class
	CDialog::PostNcDestroy();
	delete this;
      }

When creating modless dialogs it is suggested that DestroyWindow() be added to the OnOK 
and OnCancel functions since the default implimentations of these handlers do not 
destroy the dialog.  My idea is to add a new public function to the dialog to handle the 
destruction this way when the user clicks OK or Cancel the dialog simply hides, to close
the modeless dialog call this function from the applications OnClose() handler : 

       void CMyDlg::Close() 
       {
           CDialog::OnOK();
           DestroyWindow()
       }

to make the modless dialog visible when needed call m_pMyDialog->ShowWindow(SW_SHOW);

to make the modless dialog hide when needed call m_pMyDialog->ShowWindow(SW_HIDE);

If it is desired that the dialog disappear when the mouse is clicked outside the dialog 
add a OnLButtonDown handler to the main window and call  
m_pMyDialog->ShowWindow(SW_HIDE). 

When the application closes add a call to the modeless dialog's Close() function 
from the main dialog window's OnClose() handler: 

      void CMainDlg::OnClose() 
      {
        .....
        m_pMyDialog->Close();
	CDialog::OnClose();
      }

This should insure that everything is cleaned up properly.  This sounds a little 
complicated, but it is easier to do than to describe.

Bruce Rainwater






| Вернуться в корень Архива |