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

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


Owner-draw headers for a CListCtrl-derived class?

Peter Drayton -- peter@ten.net
Wednesday, October 16, 1996

Environment: VC++4.2, Win 95

I want to create an owner-draw multi-column list control. I have created a
CListCtrl-derived class (CListCtrlEx) that allows me to easily override the
text color, background color, etc. I have two problems/issues that I have
not yet resolved and would really appreciate some pointers:

1) How do I override the header control to make it also owner-draw? I want
to alter the font and background color and (optionally) add icons to the
headers.

2) I want to make it as brain-dead as possible to use my new class. My
original approach was to have the user add a ListView control to the dialog
resource and then add a member variable of type CListCtrl to the dialog
using ClassWizard. The member definition in the dialog header file is then
changed from declaring a CListCtrl to a CListCtrlEx variable. The downside
of this is that when the Windows control is first dynamically subclassed by
the MFC call to DDX_Control in DoDataExchange() the Windows control is
already created. What I really wanted to do is override something like
PreCreateWindow to make sure that the correct style flags are set for the
control (force it to Report mode and Owner-draw). I know that this works
for a CListView-derived class as PreCreateWindow is called for
CView-derived classes. How can I do this with a CListCtrl-derived class?

TIA

Regards,
Peter Drayton



Jim Barry -- Jim.Barry@ilp.com
Friday, October 18, 1996

[Mini-digest: 4 responses]


On 16 October 1996 23:26, Peter Drayton[SMTP:peter@ten.net] wrote:
> Environment: VC++4.2, Win 95
>
> I want to create an owner-draw multi-column list control. I have   
created a
> CListCtrl-derived class (CListCtrlEx) that allows me to easily override   
the
> text color, background color, etc. I have two problems/issues that I   
have
> not yet resolved and would really appreciate some pointers:
>
> 1) How do I override the header control to make it also owner-draw? I   
want
> to alter the font and background color and (optionally) add icons to   
the
> headers.
>
> 2) I want to make it as brain-dead as possible to use my new class. My
> original approach was to have the user add a ListView control to the   
dialog
> resource and then add a member variable of type CListCtrl to the dialog
> using ClassWizard. The member definition in the dialog header file is   
then
> changed from declaring a CListCtrl to a CListCtrlEx variable. The   
downside
> of this is that when the Windows control is first dynamically   
subclassed by
> the MFC call to DDX_Control in DoDataExchange() the Windows control is
> already created. What I really wanted to do is override something like
> PreCreateWindow to make sure that the correct style flags are set for   
the
> control (force it to Report mode and Owner-draw). I know that this   
works
> for a CListView-derived class as PreCreateWindow is called for
> CView-derived classes. How can I do this with a CListCtrl-derived   
class?

Don't know about number one, but I just had a similar problem with number   
two. There is a virtual function called PreSubclassWindow which gets   
called just before the control is subclassed by DDX_Control. Voila!

Cheers,

 - Jim  
-----From: Si Cruse 

>From the method you describe here PreCreateWindow will not be called as you are 
effectively subclassing the window. You need to use PreSubclassWindow!

-- 

...A closed mouth gathers no foot...
_____________________________________________________________
Si Cruse
Front Office IT Development, Credit Suisse Financial Products
1 Cabot Square, London E14 4QJ
Phone: +44 171 516 2948			Fax: +44 171 516 2688
mailto:scruse@csfp.co.uk	 http://www.cruse.demon.co.uk
-----From: cugr1@gd.swissptt.ch (Cunningham Graham, IT34)


You could do a couple of things to modify the style of the list control.   =
=
In your OnInitDialog you could use ModifyStyle() ModifyStyleEx() on the   =
list control. Or the other way is to override the Create for the control.

To get the pointer to the header control I would simply use   =
GetNextWindow(). Note I havent actually done this so it might not be the   =
right way to go.

-----From: "Randy Taylor" 

Environment VC4.2, MFC 4.2

> From: Peter Drayton 

> 1) How do I override the header control to make it also owner-draw? I
want
> to alter the font and background color and (optionally) add icons to the
> headers.

Derive a class from CHeaderCtrl.
Add a hander for the WM_DRAWITEM message your CHeaderCtrl derivative.
The ID of the Header when the list is in LVS_REPORT mode is zero,
so use MyListCtrl::GetDlgItem(0) to get the header window.
Call MyHeader.SubclassWindow() from a function called
MyListCtrl::RegisterHeader()
when you know that the listview is in LVS_REPORT mode.

 
> 2) I want to make it as brain-dead as possible to use my new class. My
> original approach was to have the user add a ListView control to the
dialog
> resource and then add a member variable of type CListCtrl to the dialog
> using ClassWizard. The member definition in the dialog header file is
then
> changed from declaring a CListCtrl to a CListCtrlEx variable. The
downside
> of this is that when the Windows control is first dynamically subclassed
by
> the MFC call to DDX_Control in DoDataExchange() the Windows control is
> already created. What I really wanted to do is override something like
> PreCreateWindow to make sure that the correct style flags are set for the
> control (force it to Report mode and Owner-draw). I know that this works
> for a CListView-derived class as PreCreateWindow is called for
> CView-derived classes. How can I do this with a CListCtrl-derived class?

Use PreCreateWindow, just like before.

randy_taylor@ebt.com





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