15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Problems with Subclassing a CListView

Menny Hamburger -- Mennyh@imagenet.co.il
Tuesday, January 28, 1997

Environment: NT 4.0, VC++ 4.1

I am using a CListView-derived class.  
I have my own CListCtrl and I want to use it instead of implementing all
my logic in the CListView derivative.
I use SubclassWindow in my OnInitialUpdate but it fails when trying to
attach the CListCtrl window handle to my CListCtrl derived class.
I looked at the MFC code and it fails because the Attach function
assumes
that the window handle being attached is not already in the permanent
map,
which is impossible because we have the CListCtrl object inside the
CListView.

Does anyone know how to perform this subclassing.




Mike Marshall -- marshall@milner.com
Wednesday, January 29, 1997

[Mini-digest: 2 responses]

 There was a thread on this a few months ago and what you are trying to do is
non-trivial to say the least, and I don't believe anyone came up with a workable
solution.

The problem is this:  There are NOT separate view and list ctrl windows when
a CListView is displayed.  The list view and the list ctrl are the SAME window.
(They have the same m_hWnd!).  When you call GetListCtrl(), you just get
a cast, dereferenced pointer to the CListView.  Look at CListView::GetListCtrl
below:

_AFXCVIEW_INLINE CListCtrl& CListView::GetListCtrl() const
	{ return *(CListCtrl*)this; }

The CListView is really just returning a dereferenced pointer to himself,
and it's "faked" by casting it to a reference to a CListCtrl.

This leaves you with a catch 22:  If you detach the window from your CListView
derived class, and attach it to you custom list control class object, you lose all
the default CView behavior, but if you don't , you need to re-implement all your
custom behavior in the CListView derived class, which is what you are trying
to avoid in the first place.

I've yet to see a clean solution to this problem.

Mike



----------
From:  Menny  Hamburger[SMTP:Mennyh@imagenet.co.il]
Sent:  Tuesday, January 28, 1997 1:05 AM
To:  'Microsoft Pro'
Subject:  Problems with Subclassing a CListView

Environment: NT 4.0, VC++ 4.1

I am using a CListView-derived class.  
I have my own CListCtrl and I want to use it instead of implementing all
my logic in the CListView derivative.
I use SubclassWindow in my OnInitialUpdate but it fails when trying to
attach the CListCtrl window handle to my CListCtrl derived class.
I looked at the MFC code and it fails because the Attach function
assumes
that the window handle being attached is not already in the permanent
map,
which is impossible because we have the CListCtrl object inside the
CListView.

Does anyone know how to perform this subclassing.


-----From: Doncho Angelov 

I can suggest you to implement this CListView as a CFormView with =
CListCtrl inside. Then you'll be able to subclass the control of a form =
without a problem. Of cource, there are some differences and =
difficulties this way:
a) you have to add you own handlers OnMove, which are going to resize =
you CListCtrl to the new CFormView size.
b) you'll not have the function GetListCtrl() (but it's easy to =
implement it)
	I use this way very frequently and I find it more useful rather than =
using the ready CListView class.

Doncho

----------
From: 	Menny  Hamburger[SMTP:Mennyh@imagenet.co.il]
Sent: 	Tuesday, January 28, 1997 9:05 AM
To: 	'Microsoft Pro'
Subject: 	Problems with Subclassing a CListView

Environment: NT 4.0, VC++ 4.1

I am using a CListView-derived class. =20
I have my own CListCtrl and I want to use it instead of implementing all
my logic in the CListView derivative.
I use SubclassWindow in my OnInitialUpdate but it fails when trying to
attach the CListCtrl window handle to my CListCtrl derived class.
I looked at the MFC code and it fails because the Attach function
assumes
that the window handle being attached is not already in the permanent
map,
which is impossible because we have the CListCtrl object inside the
CListView.

Does anyone know how to perform this subclassing.



James.Durie@ubs.com
Friday, January 31, 1997

One possibilty might be to make a copy of the CListView class, call it 
CListViewEx or something, and then replace all references to CListCtrl to your 
own CListCtrl derived class.

This way you will in effect be creating a new view type derived from CCtrlView.

There is also an example showing how to do something similar with CAnimateCtrl. 
Sorry i don't remember what this is called.

James

______________________________ Reply Separator _________________________________


From:   Menny  Hamburger[SMTP:Mennyh@imagenet.co.il] 
Sent:   Tuesday, January 28, 1997 9:05 AM
To:     'Microsoft Pro'
Subject:        Problems with Subclassing a CListView
     
Environment: NT 4.0, VC++ 4.1
     
I am using a CListView-derived class. =20
I have my own CListCtrl and I want to use it instead of implementing all 
my logic in the CListView derivative.
I use SubclassWindow in my OnInitialUpdate but it fails when trying to 
attach the CListCtrl window handle to my CListCtrl derived class.
I looked at the MFC code and it fails because the Attach function 
assumes
that the window handle being attached is not already in the permanent 
map,
which is impossible because we have the CListCtrl object inside the 
CListView.
     
Does anyone know how to perform this subclassing.




Serge Wautier -- serge.wautier@ontonet.be
Monday, February 03, 1997

[Mini-digest: 2 responses]

> From: James.Durie@ubs.com
> 
> One possibilty might be to make a copy of the CListView class, call it 
> CListViewEx or something, and then replace all references to CListCtrl to
your 
> own CListCtrl derived class.
> 
> This way you will in effect be creating a new view type derived from
CCtrlView.

I doubt it is that  simple. Unfortunately.

As said earlier in this thread, CListView creates a window of class
WC_LISTVIEW. It does it by setting this class name in its PreCreateWindow.

CListView.GetListCtrl() simply casts the pointer. It works because
CListCtrl is nothing more than a wrapper around a window (i.e. a window of
class WC_LISTVIEW. CListCtrl doesnot have any data or virtual methods. So
its binary image is the same as Cwnd, which is a base class of CListView).

In this case, one wants to replace CListCtrl by CMyListCtrl which is most
probably more than wrapper around the control (i.e.: It has data members ).

--> Casting the view (a control and not more) to CMyListCtrl( a control +
class data ) will not work since creating an instance of CListViewEx will
not imply creation of CMyListCtrl and CMyListCtrl is not a base class of
CListViewEx.

The only solution i found so far to this problem is, as written earlier in
this thread, to create a basic CView and put a child member CMyListCtrl in
it. In CView::OnSize(), resize the MyListCtrl. In CView::OnDestroy, destroy
and delete the MyListCtrl, etc...

Hope this helps.

Serge Wautier,
Techno Trade s.a.
Belgium
serge.wautier@ontonet.be
http://www.tbox.fr

----------
> From: James.Durie@ubs.com
> To: 
> Subject: Re: RE: Problems with Subclassing a CListView
> Date: vendredi 31 janvier 1997 17:32
> 
> One possibilty might be to make a copy of the CListView class, call it 
> CListViewEx or something, and then replace all references to CListCtrl to
your 
> own CListCtrl derived class.
> 
> This way you will in effect be creating a new view type derived from
CCtrlView.
> 
> There is also an example showing how to do something similar with
CAnimateCtrl. 
> Sorry i don't remember what this is called.
> 
> James
> 
> ______________________________ Reply Separator
_________________________________
> 
> 
> From:   Menny  Hamburger[SMTP:Mennyh@imagenet.co.il] 
> Sent:   Tuesday, January 28, 1997 9:05 AM
> To:     'Microsoft Pro'
> Subject:        Problems with Subclassing a CListView
>      
> Environment: NT 4.0, VC++ 4.1
>      
> I am using a CListView-derived class. =20
> I have my own CListCtrl and I want to use it instead of implementing all 
> my logic in the CListView derivative.
> I use SubclassWindow in my OnInitialUpdate but it fails when trying to 
> attach the CListCtrl window handle to my CListCtrl derived class.
> I looked at the MFC code and it fails because the Attach function 
> assumes
> that the window handle being attached is not already in the permanent 
> map,
> which is impossible because we have the CListCtrl object inside the 
> CListView.
>      
> Does anyone know how to perform this subclassing.
-----From: Lance Lovette 

I had the same problem. My solution was turn my new CListCtrl derived
class into a template that the TEMPLDEF tool could take and produce two
classes. Depending on the template arguments it can generate a
CMyListView class that is derived from CListView and a CMyListCtrl class
derived from CListCtrl. After TEMPLDEF is done, there are a set of
sources for each class that look just as if I had typed them in myself.
It is kind of a headache to maintain, but it is an automated way to
generate the two classes from a single code base.

Lance
lovette@iftech.com

+-------------------------------------------------------------------+
Interface Technologies, Inc.

For a collection of free tutorials covering a variety of programming
and computer-related topics such as Visual C++, MFC, and Windows NT
check out the ITI On-line Training Center at http://www.iftech.com.

>----------
>From: 	Mike Marshall[SMTP:marshall@milner.com]
>Sent: 	Wednesday, January 29, 1997 11:50 AM
>To: 	'MFC Listserv'
>Subject: 	RE: Problems with Subclassing a CListView
>
>[Mini-digest: 2 responses]
>
> There was a thread on this a few months ago and what you are trying to do is
>non-trivial to say the least, and I don't believe anyone came up with a
>workable
>solution.
>
>The problem is this:  There are NOT separate view and list ctrl windows when
>a CListView is displayed.  The list view and the list ctrl are the SAME
>window.
>(They have the same m_hWnd!).  When you call GetListCtrl(), you just get
>a cast, dereferenced pointer to the CListView.  Look at
>CListView::GetListCtrl
>below:
>
>_AFXCVIEW_INLINE CListCtrl& CListView::GetListCtrl() const
>	{ return *(CListCtrl*)this; }
>
>The CListView is really just returning a dereferenced pointer to himself,
>and it's "faked" by casting it to a reference to a CListCtrl.
>
>This leaves you with a catch 22:  If you detach the window from your
>CListView
>derived class, and attach it to you custom list control class object, you
>lose all
>the default CView behavior, but if you don't , you need to re-implement all
>your
>custom behavior in the CListView derived class, which is what you are trying
>to avoid in the first place.
>
>I've yet to see a clean solution to this problem.
>
>Mike
>
>
>
>----------
>From:  Menny  Hamburger[SMTP:Mennyh@imagenet.co.il]
>Sent:  Tuesday, January 28, 1997 1:05 AM
>To:  'Microsoft Pro'
>Subject:  Problems with Subclassing a CListView
>
>Environment: NT 4.0, VC++ 4.1
>
>I am using a CListView-derived class.  
>I have my own CListCtrl and I want to use it instead of implementing all
>my logic in the CListView derivative.
>I use SubclassWindow in my OnInitialUpdate but it fails when trying to
>attach the CListCtrl window handle to my CListCtrl derived class.
>I looked at the MFC code and it fails because the Attach function
>assumes
>that the window handle being attached is not already in the permanent
>map,
>which is impossible because we have the CListCtrl object inside the
>CListView.
>
>Does anyone know how to perform this subclassing.
>
>
>-----From: Doncho Angelov 
>
>I can suggest you to implement this CListView as a CFormView with =
>CListCtrl inside. Then you'll be able to subclass the control of a form =
>without a problem. Of cource, there are some differences and =
>difficulties this way:
>a) you have to add you own handlers OnMove, which are going to resize =
>you CListCtrl to the new CFormView size.
>b) you'll not have the function GetListCtrl() (but it's easy to =
>implement it)
>	I use this way very frequently and I find it more useful rather than =
>using the ready CListView class.
>
>Doncho
>
>----------
>From: 	Menny  Hamburger[SMTP:Mennyh@imagenet.co.il]
>Sent: 	Tuesday, January 28, 1997 9:05 AM
>To: 	'Microsoft Pro'
>Subject: 	Problems with Subclassing a CListView
>
>Environment: NT 4.0, VC++ 4.1
>
>I am using a CListView-derived class. =20
>I have my own CListCtrl and I want to use it instead of implementing all
>my logic in the CListView derivative.
>I use SubclassWindow in my OnInitialUpdate but it fails when trying to
>attach the CListCtrl window handle to my CListCtrl derived class.
>I looked at the MFC code and it fails because the Attach function
>assumes
>that the window handle being attached is not already in the permanent
>map,
>which is impossible because we have the CListCtrl object inside the
>CListView.
>
>Does anyone know how to perform this subclassing.
>




| Вернуться в корень Архива |