I'm using mfc, is there any way to create a dialog that doesn't block the main app without using threads?
if yes, how can i do it?
thanks in advance
You need to create a modeless dialog. Click the link for more details.
There is a good tutorial about it here.
Example to display:
CModeLess *m_pmodeless = new CModeLess(this);
m_pmodeless->Create(CModeLess::IDD);
m_pmodeless->ShowWindow(SW_SHOW);
I won't repeat the tutorial but it explains how you using messages to relay to the parent what the dialog result is.
Related
I seem to have the original problem from Embedded Modeless Child Dialog not getting messages. I have managed to add rows to my property page using tips form What is the best way to manage data for rows of similar controls in MFC? but now when I click on the controls in the embedded dialog, nothing happens. I assume there's some message routing I need to do in the parent dialog but I don't know what it is.
The properties of the row dialog resource included Disabled = True. I have no idea how that happened.
I am maintaining I big and mature application, without background on MFC paradigm and layout. I have experience with Qt, OO designs and UI frameworks (I'm aware of each thread responsibility, event loops, event handling hierarchies, etc.
I'm stuck with a settings CDialog window losing focus constantly, while I'm trying to configure my application. I also have a file explorer dialog that behaves exactly the same way. Both are activated by DoModal calls.
I've read that this is probably because I have two modal dialogs competing for focus. How can I debug that? What function could I break on to get a helpful callstack, so I can find the offending code? Is there an MFC::focusWindow(WHND window) or something that I could intercept?
The problem according to your description is that you 'have two modal dialogs competing for focus'. This should normally not be possible because by definition a modal dialog takes over the application and does not return control to its launch point until the dialog is closed. Without knowing the architecture of the application, the simplest solution would be to make the settings dialog modeless (create it then call ShowWindow(SW_SHOW) instead of DoModal. This will allow the message loop to run for the other modal dialog but not take focus from your settings dialog unless it is doing it explicitly in its own methods.
Use Spy++ to spy the messages/events that occurring in the dialog.
You can use SetFocus function, please refer to
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646312%28v=vs.85%29.aspx
I am working on MFC dll Using MFC in a Shared DLL.Can any one help me how i can achive ??
I am creating tooptip in OnInitDialog using create and AddTool
PreTranslateMessage is also called but It is not working for me. I see no tooltips and get no errors/assertions/exceptions anywhere
Thanks in Advance
I am practice on splitter window, I reference to this web site,
Creating a Splitter Window in a Dialog Box in Three Easy Steps
when I build it, some thing error I cant solve it, like follow code...
Out of memory creating a splitter pane.
Error: Trying to create object which is not DECLARE_DYNCREATE
or DECLARE_SERIAL: CDialogEx.
Out of memory creating a splitter pane.
Error: Trying to create object which is not DECLARE_DYNCREATE
or DECLARE_SERIAL: CDialogEx.
the link for download this example, please rewrite the example,
splitter dialog example
the other feature, I want to create a two panel with button and static
and listcontrol item.
thanks guy.
Don't use a dialog base application. Just use the wizard. Create a SDI sample with a CFormView... integrate the splitter window later.
It doesn't make sense to me to create a dialog and to integrate all the CFrameWnd features into a CDialog...
I replaced the CDialog1 with CWnd then solved this problem.
ccc.m_pNewViewClass = RUNTIME_CLASS(CWnd);
m_cSplitter.CreateView(0,0, RUNTIME_CLASS(CWnd),
CSize(100,100), &ccc);
m_cSplitter.CreateView(0,1, RUNTIME_CLASS(CWnd),
CSize(100,100), &ccc);
I create class with base class of CPropertySheet, show this dialog using
d.DoModal()
and it freezes my application. Can I execute my dialog asynchronously?
d.ShowWindow(SW_NORMAL)
doesn't work.
You need to use CPropertySheet::Create to use the dialog asynchronously. There's also some hints at http://support.microsoft.com/kb/146916 .