Re: Newbi MFC Dialog question
Hi,
Scott and Tom are correct.
The controls are not initialized. /* I forgot about that, being I never =
use DoModal anymore */
You could do Create() instead.
That way, the controls would be initialized.
There is no need to deal with string arrays and other complications.
Plus, you get a Non-Modal Dialog which IMHO is way better.
CView::LaunchDialog()
{
if(GetDlgTest() != NULL) return;
SetDlgTest(new CDlgTest(this));
GetDlgTest()>Create(CDlgTest::IDD, this);
GetDlgTest()->SetOwner(this);
GetDlgTest()->EnableWindow();
((CDlgTest*)GetDlgTest())->GetComboBox()->AddString("This"); /* Cast =
to your Dlg Type */
((CDlgTest*)GetDlgTest())->GetComboBox()->AddString("is");
((CDlgTest*)GetDlgTest())->GetComboBox()->AddString("a");
((CDlgTest*)GetDlgTest())->GetComboBox()->AddString("Test");
GetDlgTest()->ShowWindow(SW_SHOW);
}
In your dlg's OnClose()
GetOwner()->PostMessage(UWM_DIALOG_CLOSING, (WPARAM)this);
In your View in Message map
ON_REGISTERED_MESSAGE(UWM_DIALOG_CLOSING, OnMsgDlgClose)
In the header
static const UINT UWM_DIALOG_CLOSING = =
::RegisterWindowMessage(_T("UWM_DIALOG_CLOSING-{76E2AC0A-0371-4fe3-A2AB-5=
8B06BE1B5EC}"));
Define the Method in your View
LRESULT CView::OnMsgDlgClose(WPARAM wParam, LPARAM lParam)
{
if(GetDlgTest() == (CDlgTest*)wParam)
{
delete GetDlgTest();
SetDlgTest(NULL);
}
put
afx_msg LRESULT OnMsgDlgClose(WPARAM wParam, LPARAM lParam);
in the header under the message map heading.
and
CDlgTest* m_pDlgTest;
Somewhere in the header.
Also, initialize m_pDlgTest to null in the constructor. i.e. =
SetDlgTest(NULL);
It's a little tricky at first, but no more need for DoModal and stopping =
the application.
Plus, you can initialize things like your combobox.
There should be something in here to show you how to do NonModal =
Dialogs.
They are way better than Modal Dialgogs.
http://www.flounder.com/mvp_tips.htm#Dialog%20Box%20Series
My internet is sporadic, so if it stays up, I will answer any more =
questions.
Either that, or just post questions about Non-Modal Dialogs.
*note from my code that I stay away from directly accessing member =
variables
and use Get() and Set(). It is a very good habit to get into.
HTH,
"Tom Serface" <tom.nospam@camaswood.com> wrote in message =
news:eXMo3PK3HHA.600@TK2MSFTNGP05.phx.gbl...
I typically store the strings for the combo box in a CStringArray and =
pass a
reference to it to the pop-up dialog and then, as Scott suggested, =
initilize
the control in the OnInitDialog() function in dialog B. You can =
retrieve
the result the same way using a variable that gets set when the combo =
box
selection changes. The variable will persist even after the dialog =
(B) is
closed so you can retrieve it after.
Tom
"Scott Kraemer" <skraemer8@cox.net> wrote in message
news:u8HFd0J3HHA.5164@TK2MSFTNGP05.phx.gbl...
Okay, I can set other controls just fine...its this darn combo box =
giving
me a problem.
"Nobody" <Nobody@yahoo.com> wrote in message
news:u%23zz2DJ3HHA.6128@TK2MSFTNGP02.phx.gbl...
Hi,
First, your probably not familiar with Control variables.
http://www.flounder.com/getdlgitem.htm
I have not used GetDlgItem(IDC_TESTBOX) in years.
So, it behooves you to learn to use control variables instead.
Then, this is what you do.
Dlg.m_Combo.SetItem()
I don't like doing it that way,
instead, I have a private member variable
private:
CCombobox m_Combo;
public:
CComboBox* GetComboBox() { return & m_Comb; }
Then, I do this instead.
Dlg.GetCombo()->SetItem()
HTH,
"Scott Kraemer" <skraemer8@cox.net> wrote in message
news:emOLYwI3HHA.600@TK2MSFTNGP05.phx.gbl...
Lets say I have dialog A. On dialog A, I have a button that opens =
Dialog
B.
I want to be able
to set the control values of a combo box of values from Dialog A.
I tried setting them before the doModal(), but I keep getting =
assertion
errors.
emailDLG dlg;
CComboBox* test = (CComboBox*)dlg.GetDlgItem(IDC_TESTBOX);
test->AddString("test1"):
test->AddString("test2"):
if (dlg.DoModal() !=IDCANCEL) {
.
...
.....
Thanks in advance!
Scott