Displaying a shared listbox
Jeff Moss -- jeff.moss@gtri.gatech.edu
Wednesday, December 20, 1995
I have a dialog class which contains a listbox. I want all instances and
derived-class instances of this dialog to share the listbox, so I made the
listbox a static member variable in my base class.
The variable is being shared; I verified this in the debugger by making sure
the base class and derived class listbox members were at the same address.
The problem is that I cannot display the entries in the derived class's
listbox. I've tried the Invalidate(), ShowWindow, and UpdateData() functions
on the derived class.
The data is there, because doing GetText(*,*) from the derived class returns
listbox entries.
Any ideas on what needs to be done to display the entries?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ MOSS, JEFFREY N -------------------- Research Scientist +
+ jeff.moss@gtri.gatech.edu +
+ Information Technology & Telecommunications Lab +
+ Georgia Tech Research Institute +
+ Georgia Institute of Technology, Atlanta Georgia, 30332 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
David W. Gillett -- DGILLETT@expertedge.com
Friday, December 22, 1995
> I have a dialog class which contains a listbox. I want all instances and
> derived-class instances of this dialog to share the listbox, so I made the
> listbox a static member variable in my base class.
>
> The variable is being shared; I verified this in the debugger by making sure
> the base class and derived class listbox members were at the same address.
>
> The problem is that I cannot display the entries in the derived class's
> listbox. I've tried the Invalidate(), ShowWindow, and UpdateData() functions
> on the derived class.
>
> The data is there, because doing GetText(*,*) from the derived class returns
> listbox entries.
>
> Any ideas on what needs to be done to display the entries?
Making the member static means that there is only one *C++* object
for this listbox. But the listbox control *WINDOWS* object that is a
child of derived dialog A is a different WINDOWS object from the
listbox control that is a child of derived dialog B. You're trying
to have a single C++ object correspond to an arbitrary number of
windows objects, and there's no mechanism provided for this. The C++
"static member" mechanism has no Windows analog.
There are three pieces of data that could be made static and shared
by all derived instances: the list of strings in the listbox, the
current listbox selection, and the listbox's control ID. Sharing the
latter makes setting up the dialog templates a bit tricky, but it
will allow them to all inherit the base-class handling of the listbox
with the possible exception of the DDX/DDV mechanisms.
Dave
Mike Blaszczak -- mikeblas@msn.com
Monday, December 25, 1995
I don't think you should use static on CWnd-derived members of your classes.
If you're creating instances of the base class and instances of derived
classes, you will _certainly_ run into trouble because the different dialog
boxes will try to use the same object for two different windows.
If you're creating instances only the derived class, I think you're making it
difficult for MFC to initialize and destroy the dialog box.
I'm not sure I'm positive that you have the right code behind the notion of
"sharing" the list box. Why do you want to make the list box object static?
.B ekiM
----------
From: owner-mfc-l@netcom.com on behalf of Jeff Moss
Sent: Wednesday, December 20, 1995 10:32
To: mfc-l@netcom.com
Subject: Displaying a shared listbox
I have a dialog class which contains a listbox. I want all instances and
derived-class instances of this dialog to share the listbox, so I made the
listbox a static member variable in my base class.
The variable is being shared; I verified this in the debugger by making sure
the base class and derived class listbox members were at the same address.
The problem is that I cannot display the entries in the derived class's
listbox. I've tried the Invalidate(), ShowWindow, and UpdateData() functions
on the derived class.
The data is there, because doing GetText(*,*) from the derived class returns
listbox entries.
Any ideas on what needs to be done to display the entries?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ MOSS, JEFFREY N -------------------- Research Scientist +
+ jeff.moss@gtri.gatech.edu +
+ Information Technology & Telecommunications Lab +
+ Georgia Tech Research Institute +
+ Georgia Institute of Technology, Atlanta Georgia, 30332 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Jeff Moss -- jeff.moss@gtri.gatech.edu
Tuesday, January 02, 1996
>> I have a dialog class which contains a listbox. I want all instances and
>> derived-class instances of this dialog to share the listbox, so I made the
>> listbox a static member variable in my base class.
>>
>> The variable is being shared; I verified this in the debugger by making sure
>> the base class and derived class listbox members were at the same address.
>>
>> The problem is that I cannot display the entries in the derived class's
>> listbox. I've tried the Invalidate(), ShowWindow, and UpdateData() functions
>> on the derived class.
>>
>> The data is there, because doing GetText(*,*) from the derived class returns
>> listbox entries.
>>
>> Any ideas on what needs to be done to display the entries?
>
> Making the member static means that there is only one *C++* object
>for this listbox. But the listbox control *WINDOWS* object that is a
>child of derived dialog A is a different WINDOWS object from the
>listbox control that is a child of derived dialog B. You're trying
>to have a single C++ object correspond to an arbitrary number of
>windows objects, and there's no mechanism provided for this. The C++
>"static member" mechanism has no Windows analog.
So there is no way to have multiple Dialog object instances (that can only
be displayed one at a time) reference and display the same Listbox object
(aside from managing the list entries yourself)?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ MOSS, JEFFREY N -------------------- Research Scientist +
+ jeff.moss@gtri.gatech.edu +
+ Information Technology & Telecommunications Lab +
+ Georgia Tech Research Institute +
+ Georgia Institute of Technology, Atlanta Georgia, 30332 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Kit Kauffmann -- kitk@mudshark.sunquest.com
Wednesday, January 03, 1996
>>> I have a dialog class which contains a listbox. I want all instances and
>>> derived-class instances of this dialog to share the listbox, so I made the
>>> listbox a static member variable in my base class.
>>>
>>> The variable is being shared; I verified this in the debugger by making sure
>>> the base class and derived class listbox members were at the same address.
>>>
>>> The problem is that I cannot display the entries in the derived class's
>>> listbox. I've tried the Invalidate(), ShowWindow, and UpdateData() functions
>>> on the derived class.
>>>
>>> The data is there, because doing GetText(*,*) from the derived class returns
>>> listbox entries.
>>>
>>> Any ideas on what needs to be done to display the entries?
>>
>> Making the member static means that there is only one *C++* object
>>for this listbox. But the listbox control *WINDOWS* object that is a
>>child of derived dialog A is a different WINDOWS object from the
>>listbox control that is a child of derived dialog B. You're trying
>>to have a single C++ object correspond to an arbitrary number of
>>windows objects, and there's no mechanism provided for this. The C++
>>"static member" mechanism has no Windows analog.
>
>So there is no way to have multiple Dialog object instances (that can only
>be displayed one at a time) reference and display the same Listbox object
>(aside from managing the list entries yourself)?
>
Haven't tried it, but I see no reason why not: I suspect the problem is
simply that the parent of the listbox is changing, and you haven't notified
the LB. I think simply calling SetParent on the LB in your OnInitDialog
should fix things.
BTW, it sounds to me that (s)he is not trying to "have a single C++ object
correspond to an arbitrary number of windows objects", but is trying to
reuse a single C++ object and a single Windows object in multiple windows
(but not at the same time, I hope, or else you'd need multiple objects, of
course).
If my interpretation is correct, I'm sure this can be done, and the static
member seems a fine way to express this concept (what other option is there
but a global (ugh)?).
Andreas Will -- a.will@T-Online.de
Thursday, January 04, 1996
>>> I have a dialog class which contains a listbox. I want all instances and
>>> derived-class instances of this dialog to share the listbox, so I made the
>>> listbox a static member variable in my base class.
>>>
>> Making the member static means that there is only one *C++* object
>>for this listbox. But the listbox control *WINDOWS* object that is a
>>child of derived dialog A is a different WINDOWS object from the
>>listbox control that is a child of derived dialog B. You're trying
>>to have a single C++ object correspond to an arbitrary number of
>>windows objects, and there's no mechanism provided for this. The C++
>>"static member" mechanism has no Windows analog.
>
>So there is no way to have multiple Dialog object instances (that can only
>be displayed one at a time) reference and display the same Listbox object
>(aside from managing the list entries yourself)?
Jeff,
of course there is a way to create a listbox that may be used by several dialogboxes (not necessarily derived classes).
I created the listbox (C++ object) as a member of the application (you may use any class that stays around as long as you want to access the listbox). Next I create the listbox windows object as a child of CMainFrame (listboxes may not be created as stand alone windows).
// mainfrm.cpp
CTestApp* pApp = (CTestApp*)AfxGetApp();
CRect rc(10,10,80,100); // size and position
pApp->m_AppListBox.Create(WS_CHILD|WS_TABSTOP| // not visible !
LBS_STANDARD|LBS_MULTIPLESEL,
rc, this, 0x1000);
Whenever a dialogbox is opened, which uses the listbox, the dialog becomes the parent of the listbox and makes the latter one visible.
To prevent destruction of the listbox windows object the old parent will be reset in the OnDestroy handler.
// host-dialog
BOOL CAppListDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CTestApp* pApp = (CTestApp*)AfxGetApp();
pApp->m_AppListBox.SetParent(this);
pApp->m_AppListBox.ShowWindow(SW_SHOW); // make it visible
// the tab order will be set to the last position
return TRUE; // return TRUE unless you set the focus to a control
}
void CAppListDlg::OnDestroy()
{
CTestApp* pApp = (CTestApp*)AfxGetApp();
pApp->m_AppListBox.ShowWindow(SW_HIDE);
pApp->m_AppListBox.SetParent(pApp->m_pMainWnd);
// must not become an orphan
CDialog::OnDestroy();
}
The listbox retains any selection, added strings etc. while it is transferred to different dialogs.
Best regards
Andy
/////////////////
Andreas Will
Jever, Germany
a.will@t-online.de
/////////////////
Mike Blaszczak -- mikeblas@msn.com
Saturday, January 06, 1996
> So there is no way to have multiple Dialog object instances (that can only
> be displayed one at a time) reference and display the same Listbox object
> (aside from managing the list entries yourself)?
Since there's no way to have the same child window in two different parent
windows in Microsoft Windows, there's no way to do this in MFC.
Or do you really mean that you want to use the same CListBox-derived _class_
(that is, not the same _object_) in two different windows?
.B ekiM
Dale Wilson -- dale@dra.com
Monday, January 08, 1996
>>> I have a dialog class which contains a listbox. I want all instances and
>>> derived-class instances of this dialog to share the listbox, so I made
the
>>> listbox a static member variable in my base class.
The problem here is not an MFC problem, but a Windows problem. The listbox
is a control which is a window which is a child of the dialog window. In
order to share a control between two dialogs, you would have to have a child
window with two parents. Unlike humans, windows breed asexually, so you
only get one parent per window.
Solution: Create a different data structure to hold the list items, then
stuff them into the "real" listbox at InitDialog time, or for nonmodal
dialogs, pass around "Update your List Box" messages to all of the dialogs
sharing the virtual list box.
| Вернуться в корень Архива
|