|
Nish,
Please help.
After EndDialog() is called, the DoModal() is released. I have walked through the MFC source code of the CDialog::DoModal(), I found DestroyWindow() is called in CDialog::DoModal() function, which in turn call PostNcDestroy() which will delete *this* pointer. And then, the code listed below will also be executed:
PostModal();
// unlock/free resources as necessary
if (m_lpszTemplateName != NULL || m_hDialogTemplate != NULL)
UnlockResource(hDialogTemplate);
if (m_lpszTemplateName != NULL)
FreeResource(hDialogTemplate);
return m_nModalResult;
Since *this* is already freed, all member variable, function method and the memory allocated for the above code is supposed to be freed already, I am not sure whether or not it safe. Any hint?
Thanks.
|
|
|
|
|
lauch2 wrote:
I am not sure whether or not it safe.
It's safe, don't worry. When you do your delete you are deleting your dialog object, here they are basically freeing the dialog resource.
Anyway just in case you are still worried, you can move the delete from the PostNCDestroy to just after the DoModal :-
CDlg* a = new CDlg();
a->DoModal();
delete a;
This way you ensure that you delete it only after the call to PostModal from within DoModal.
But seriously I do not think there is any problem right now.
Regards,
Nish
"I'm a bit bored at the moment so I'm thinking about writing a new programming language" - Colin Davies
My book :- Summer Love and Some more Cricket [New Win]
Review by Shog9 Click here for review[NW]
|
|
|
|
|
On second thoughts I suggest that you do this :-
CDlg* a = new CDlg();
a->DoModal();
delete a;
Because if PostModal gets called after you delete the object then it is actually trying to access members of an object that does not exist anymore. This might cause problems as you can guess.
Nish
"I'm a bit bored at the moment so I'm thinking about writing a new programming language" - Colin Davies
My book :- Summer Love and Some more Cricket [New Win]
Review by Shog9 Click here for review[NW]
|
|
|
|
|
Nish,
Another question:
Do you know any messages will send to a dialog subsequently after calling the EndDialog() to triggle the dailog to close itself?
lauch
|
|
|
|
|
If anybody knows how to implement automation function in Visual C++ to copy bitmap that resides on the clipboard to a MS Word documetn. Sounds so simple but I am clueless. Please HELP!!!
|
|
|
|
|
I have a single document interface application. Its base class is CFormView. I've added a CTreeCtrl to it just like I would in a dialog based application. I've given the tree control an Id and I've created a variable of type CTreeCtrl. However, when I try to use it my application crashes. Its seems that my tree control has not been initialized...
this->m_ctrlSetupTree {CTreeCtrl hWnd=0x00000000}
|
|
|
|
|
The the code that creates the CTreeCtrl object, i.e. Create().
Kuphryn
|
|
|
|
|
How do I get the parent CWnd* pParentWnd?
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
|
|
|
|
|
Call GetParent().
Kuphryn
|
|
|
|
|
isn't it your view? this (or similar)
t!
|
|
|
|
|
|
I would bet you are trying to use it before the tree control has been created. Are you trying to access the tree control in a WM_SIZE handler? If so, it won't be created the first couple times the WM_SIZE handler gets called. Usually, the fix for this is something like this:
if( !IsWindow( m_YourTreeCtrl ) )
return;
However, if you are trying to access the tree in a function that's only called once (say, for initialization), then you'll have to put the initialization code in some other function that's called later on.
Chris Richardson Terrain Software
|
|
|
|
|
I'm calling the following code. But it seems that my hWnd is still null.
CRect treeRect;
treeRect.NormalizeRect();
CImageList *pImageList=new CImageList;
if(this->m_ctrlSetupTree.Create(WS_VISIBLE,treeRect,this,IDC_SETUP_TREE))
{
Beep(999,99);
int i, icons=0;
for (icons=0; RCanalTree::m_icons[icons]; icons++) {}
pImageList->Create(16, 16, TRUE, icons,6);
for (i=0; RCanalTree::m_icons[i]; i++)
{
pImageList->Add(AfxGetApp()->LoadIcon(RCanalTree::m_icons[i]));
}
m_ctrlSetupTree.SetImageList(pImageList,TVSIL_NORMAL);
if(this->m_oCanalManager.CreateNewDataStructures())
{
}
}
}
|
|
|
|
|
Your control is failing to be created because you haven't specified the WS_CHILD style. Here's the correct line of code:
if(this->m_ctrlSetupTree.Create(WS_CHILD|WS_VISIBLE,treeRect,this,IDC_SETUP_TREE))
{
..... snip .....
}
Chris Richardson Terrain Software
|
|
|
|
|
Hmmmm...Create still returned zero..
CTreeCtrl::Create returned 0
if(this->m_ctrlSetupTree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES,treeRect,this,IDC_SETUP_TREE))
|
|
|
|
|
Has the window referred to by "this" been created at the point you are calling Create? That's my only guess as to why it would still be failing.
Chris Richardson Terrain Software
|
|
|
|
|
Hmmm.... good point. Exactly when in the "window" created in an SDI application with formView as the base class???
|
|
|
|
|
Well I'm not sure of the exact message sequence. Why don't you post the relevant code for the formview derived class, and then I'll tell you if the window has been created. Or at least, tell which function you have put the tree creation code in.
Chris Richardson Terrain Software
|
|
|
|
|
Actually, all I needed to do was move my code into the OnInitialUpdate function. I didn't need to call create!
void CSacmanSetupApplicationView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CRect treeRect;
CImageList *pImageList=new CImageList;
My object is fine at this point
if(this->m_ctrlSetupTree)
{
Beep(999,99);
int i, icons=0;
for (icons=0; RCanalTree::m_icons[icons]; icons++) {}
pImageList->Create(16, 16, TRUE, icons,6);
for (i=0; RCanalTree::m_icons[i]; i++)
{
pImageList->Add(AfxGetApp()->LoadIcon(RCanalTree::m_icons[i]));
}
m_ctrlSetupTree.SetImageList(pImageList,TVSIL_NORMAL);
Had to make sure it was displaying an object with data in it..
m_ctrlSetupTree.SetCanalManagerPointer(this->m_oCanalManager.GetCanalManager());
Thanks for the help!
|
|
|
|
|
hello
i have a problem with "glutInit (&argc, argv)" it's an API of "glut" lib ,and
my problem are with the 2 parameter of glutInit ;i have made an MFC application and
i use glutInit ,like this :
void initializeGraphics (int argc, char **argv)
{
// initialize GLUT state based on command line arguments
glutInit (&argc, argv);
.....
.....
.....
}
but when i compile it said me that the 2 parameter are undeclared.
how i can resolve this problem,or modified the code ?
|
|
|
|
|
Non-console apps (like MFC ones) are not provided these parameters. Fortunately for you, MSVC features the global variables __argc and __argv which you can use instead.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
thank you
but how i can use this globale variable __argc and __argv,because i am new in vc++ and programation.
|
|
|
|
|
It'd be something like
void initializeGraphics (int argc, char **argv)
{
...
glutInit (&argc, argv);
...
}
...
initializeGraphics(__argc,__argv);
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
i try but it don't run,i have the some mistake.
can u help me,please.
|
|
|
|
|
I have an SDI app (and it has to stay an SDI app). I need to be able to show different views, each with their own doc, but eachg view is required to maintain an open doc, even if the view isn't currently being displayed.
Is that possible? If so, how?
------- signature starts
"...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
Please review the Legal Disclaimer in my bio.
------- signature ends
|
|
|
|