|
Hi,
I am wondering what the correct way is to properly end a modeless dialog during the OnInitDialog. I currently have 2 (lets call them A and B) dialogs, B is called during the OnInitDialog handling of A. If the return from B is false, then I don't want to display A. When the dialog was modal, I just used an EndDialog(IDABORT) call without any problems. Now that I moved to modeless, I'm wondering if this is still correct. I can't seem to find anywhere that this topic is discussed. Thanks for the help.
Doug
|
|
|
|
|
|
Mike,
This doesn't seem correct since the dialog hasn't been created yet. I agree that typically you use the DestroyWindow() function to close the dialog, but I have created the dialog yet through the OnInitDialog().
Thanks,
Doug
|
|
|
|
|
Inside OnInitDialog the dialog has been created - It's just not visible yet.
Steve
|
|
|
|
|
Ok - I get some assertion errors if I use the destroywindow() call (line 207 of winocc.cpp and line 105 of afxwin2.inl). If I use the EndDialog(IDABORT), even though this is a modeless dialog, I don't get these assertion errors. Are you sure that the above statements are true?
|
|
|
|
|
Verify it for yourself (I would). Put a breakpoint in OnInitDialog and when hit look at the this->m_hWnd class member. You can use Spy (or code is a call to ::IsWindow ) to verify the HWND exists. But yes, I'm sure.
Steve
|
|
|
|
|
Ok, that seems to be true that the handle is there. However, when you call destroy window, the handle gets removed (which I believe is what is causing the assertion errors). It would seem that we don't want to Destroy the window yet. Does this make sense?
Thanks,
Doug
|
|
|
|
|
Sounds possible - But I don't know off hand. The lines numbers in my MFC don't line up with yours (I use MSVC6) so I can't have a look and see what the problem is. Can you post some details of the ASSERTS?
Steve
|
|
|
|
|
Steve,
Both assertion errors are related to the handle being null (line 207 of winocc.cpp - ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); and line 105 of afxwin2.inl - { ASSERT(::IsWindow(m_hWnd)); ::GetWindowRect(m_hWnd, lpRect); }). This means the handle shouldn't be null - caused by the destroywindow(). So, what is the correct call for the closing modeless during OnInitDIalog()?
Thanks,
Doug
|
|
|
|
|
Try this:
PostMessage(WM_CLOSE);
Steve
|
|
|
|
|
|
Ok try this:
::PostMessage(m_hWnd, WM_CLOSE, 0, 0);
Steve
|
|
|
|
|
|
I tested this last one on a wizard generated MFC application and it worked. Are you handling the WM_CLOSE message or something?
Steve
|
|
|
|
|
Steve,
Yes I am using WM_CLOSE message handling. After I disabled the WM_CLOSE message handler, I get a better result, but still not what I wanted. When I use the statement you provided without the WM_CLOSE, I still can see the dialog open and then close (although briefly). If I use the EndDialog(IDABORT) call, I never see this quick display of the window (desired effect).
Thanks,
Doug
|
|
|
|
|
Doug Allen wrote: I get some assertion errors if I use the destroywindow()
Are the assertion errors appearing during the DestroyWindow call or after it?
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ryan,
From the earlier posts, you cn see that the assertion errors are caused after the DestroyWindow() is called due to m_HWnd being null. It doesn't seem right that you would call DestroyWindow() before the dialog is shown.
Thanks,
Doug
|
|
|
|
|
No, I didn't think it was clear where the assertions were. You can step into and out of DestroyWindow() without getting any assertions? Are you calling any other methods on the window after the call to DestroyWindow() ?
In any case, calling EndDialog() on a modeless dialog is a perfectly valid way of closing it.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ryan,
EndDialog is shown in MSDN as "Call this member function to terminate a modal dialog box". Another place directly quoted from MS "Do not call EndDialog to destroy a modeless dialog box. Call DestroyWindow instead." The EndDialog seems to be working just fine here without any problems, but I've all these referances where it states that EndDialog should not be used had me wondering.
|
|
|
|
|
Hi. I'm writing a report for a university honours project that must document the code for a piece of software I wrote. I was wondering if anyone knew the proper way of referring to a function of a specific class in a report. I don't want to keep saying "the function myFunc() in class MyClass"... are you supposed to use MyClass::myFunc() ?? ie. "the code to copy the array can be found in MyClass::myFunc()..." In code, the double colon is used to refer to static members, and these functions are not static... although it's also used for all function definitions outside the class definition...
btw it's important that I mention the class I'm referring to since I re-use function names in different classes.
Thanks in advance.
|
|
|
|
|
J-Dogg306 wrote: I was wondering if anyone knew the proper way of referring to a function of a specific class...
Functions within a class are referred to as a method.
J-Dogg306 wrote: are you supposed to use MyClass::myFunc() ??
That's acceptable.
J-Dogg306 wrote: In code, the double colon is used to refer to static members, and these functions are not static... although it's also used for all function definitions outside the class definition...
Technically it's called the scope-resolution operator.
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
DavidCrow wrote: Functions within a class are referred to as a method.
Technically, yes... and I know this is important to Java people... but don't a lot of C++ programmers still like the term function?
Would I be correct in saying that function refers to C++ routines in general, of which method is one type? The fact that you said "Functions within a class are referred to as a method"... and the fact that people use the term "member function", seems to imply that this is the case...
The reason I ask is because I'm writing a section of the report that discusses routines that the program registers with an API that it uses, to be automatically called on certain events. Some are static functions, some are members of classes, and I'd like a generic term to refer to either. It's a section too early in the report to burden the reader with what belongs to a class and what doesn't... the reader doesn't even know the names of classes yet... the section is just meant to point out where to look to find the code responsible for certain things, so the reader can follow along in subsequent sections, when I actually do delve into details... at this point in the report it's important for the flow of things that I use a consistent term.
Oh and I'd rather not use "routine"... sounds too general.
Cheers.
|
|
|
|
|
J-Dogg306 wrote: ...but don't a lot of C++ programmers still like the term function?
Yes, I use both interchangeably all the time.
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|
|
hi all,
how can i recognize a shortcut or a hypertext on file?
thanks.
MK.
|
|
|
|
|
Your question is a bit unclear. What file?
"Let us be thankful for the fools. But for them the rest of us could not succeed." - Mark Twain
"There is no death, only a change of worlds." - Native American Proverb
|
|
|
|