Solved

mfc modal / modeless dialog and minimize / restore problem

Posted on 2008-10-28
6
1,485 Views
Last Modified: 2013-12-14
Hi,
so here's my problem in short:
i use AfxGetMainWnd->EnableWindow(FALSE) from within a modeless dialog, which makes it actually look modal (and that is really appreciated and good working)

I like the minimize feature, because it is comfortable to the user having the application working in background.

problem: In minimized state, the system menu is unavailable, because i used "EnableWindow(FALSE)"

I'm searching for a solution to make the modeless dialog have its modal behaviour again, and also the ability to get minimized and restored.

Anyone has an idea ? Thanks
0
Comment
Question by:stev75
  • 2
  • 2
6 Comments
 
LVL 19

Accepted Solution

by:
alb66 earned 399 total points
ID: 22823969
I think you can use a GUI element of the main window and then call a method on the modeless dialog than perform the minimiza action.
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 22829300
The main window must be enabled in order to get taskbar commands such as Close and Restore.  When you decide whether or not to disable, you can use:
   AfxGetMainWnd()->GetWindowPlacement()
   http://msdn.microsoft.com/en-us/library/w69bxfc4.aspx
...to see if the main windiw is currently minimized.
0
 

Author Closing Comment

by:stev75
ID: 31510753
I like the very simple idea by alb66, both comments have been helpful. Now I use IsIconic() to see if the window is minimized. Thanks!
0
 

Author Comment

by:stev75
ID: 22848245
Hi Dan,
the modeless dialog is a temporary dialog. It shows a progress bar and lasts as long as a database access is active.
You should act only on the modeless dialog, that's why it disables the main. When you minimize it, it enables the main again, to have the system menu.

I use the idea of the accepted solution:
Not by controlling the modeless dialog by an UI element of the main, but by pushing a flag from the modeless dialog to the main, with the aim of resuming initial behaviour.

That's not actually the solution posted here but I had this idea reading the solution!
So here's little explanation:

Actually there's a modal dialog, that is between the modeless and the main(!)

When main is restored / maximized from the taskbar again, it checks the flag and resumes the modal state of the dialog, by disabling itself!

If I didn't do that, both main and dialog are user-responsive, which is not wanted.

// this funcion is called by the modeless dialog, to let the main resume its

// behaviour when modal dialog should become active again

void SetContinueModalDialogWhenRestored(CDialog* pModalDlg, bool state)

	{

		m_pModalDlg = pModalDlg;

		m_bContModalWhenRestored = state;

	};
 
 

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)

{

	if(	(nID & 0xFFF0) == SC_RESTORE	||

		(nID & 0xFFF0) == SC_MAXIMIZE	)

	{

		if(m_bContModalWhenRestored && m_pModalDlg)

		{

			// process base class first

			CMDIFrameWnd::OnSysCommand(nID, lParam);

			

			EnableWindow(FALSE);
 

			// for child windows: call AFTER CMainFrame::EnableWindow(FALSE), 

			// EnableWindow(FALSE) disables also all child windows.

			m_pModalDlg->EnableWindow(TRUE);
 

			m_bContModalWhenRestored = FALSE;

			return;

		}

	}
 

	CMDIFrameWnd::OnSysCommand(nID, lParam);

}

Open in new window

0
 
LVL 49

Expert Comment

by:DanRollins
ID: 22848655
Thanks.  Having a detailed description of the solution will help the next person who reads this.
-- Dan
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In our object-oriented world the class is a minimal unit, a brick for constructing our applications. It is an abstraction and we know well how to use it. In well-designed software we are not usually interested in knowing how objects look in memory. …
Programmer's Notepad is, one of the best free text editing tools available, simply because the developers appear to have second-guessed every weird problem or issue a programmer is likely to run into. One of these problems is selecting and deleti…
THe viewer will learn how to use NetBeans IDE 8.0 for Windows to perform CRUD operations on a MySql database.
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now