Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How can i set the style of a CTreeCtrl within a CTreeView ?

707 views
Skip to first unread message

PRMARJORAM

unread,
May 14, 2008, 11:01:02 AM5/14/08
to
Im using a MFC CTreeView which fits nicely with what im trying to do. I need
to change the style of the nested CTreeCtrl.

There is no easy way to do this, the documentation points to using
SetWindowLong.

void CMyTreeView::OnInitialUpdate()

{

CTreeView::OnInitialUpdate();

CTreeCtrl& tree = GetTreeCtrl();

HTREEITEM root_item = tree.InsertItem(CString("MyProject"));
HTREEITEM init_request = tree.InsertItem(CString("Item 1"), root_item);
HTREEITEM doc_package = tree.InsertItem(CString("Item 2"), root_item);

ASSERT(tree.GetSafeHwnd() != NULL );

::SetWindowLong(tree.GetSafeHwnd(),GWL_STYLE,TVS_HASLINES |TVS_LINESATROOT);
}

Iv tried using this to set the styles as in the above code, but the program
gets corrupted.

How can i set the style of a CTreeCtrl nested in a CTreeView?

M. Shoaib Surya

unread,
May 14, 2008, 11:10:54 AM5/14/08
to
You should call ModifyStyle() member function of CTreeCtrl to set the style.
The following line of code should achieve your purpose.

tree.ModifyStyle(NULL, TVS_HASLINES |TVS_LINESATROOT);

Regards,
Shoaib.

"PRMARJORAM" <PRMAR...@discussions.microsoft.com> wrote in message
news:7A2A351F-F074-48AA...@microsoft.com...

M. Shoaib Surya

unread,
May 14, 2008, 11:18:25 AM5/14/08
to
Also, the call to the OnInitialUpdate() of the base class, that is, the
following line of code,
CTreeView::OnInitialUpdate();
should be the last line of the overridden CMyTreeView::OnInitialUpdate()
instead of the first line

- Shoaib

"M. Shoaib Surya" <shoai...@hotmail.com> wrote in message
news:OYueoWdt...@TK2MSFTNGP03.phx.gbl...

PRMARJORAM

unread,
May 14, 2008, 12:03:00 PM5/14/08
to
Thanks ill look into that modify style, looks alot better...

I have cracked it though now, needed to do the following
LONG style = ::GetWindowLong(tree.GetSafeHwnd(),GWL_STYLE);

::SetWindowLong(tree.GetSafeHwnd(),GWL_STYLE, style |
TVS_HASLINES |TVS_LINESATROOT);

So needed to combine the current style with the additions.

Joseph M. Newcomer

unread,
May 14, 2008, 12:42:27 PM5/14/08
to
See below...
On Wed, 14 May 2008 08:01:02 -0700, PRMARJORAM <PRMAR...@discussions.microsoft.com>
wrote:

>Im using a MFC CTreeView which fits nicely with what im trying to do. I need
>to change the style of the nested CTreeCtrl.
>
>There is no easy way to do this, the documentation points to using
>SetWindowLong.
>
>void CMyTreeView::OnInitialUpdate()
>
>{
>
>CTreeView::OnInitialUpdate();
>
>CTreeCtrl& tree = GetTreeCtrl();
>
>HTREEITEM root_item = tree.InsertItem(CString("MyProject"));
>HTREEITEM init_request = tree.InsertItem(CString("Item 1"), root_item);
>HTREEITEM doc_package = tree.InsertItem(CString("Item 2"), root_item);
>
>ASSERT(tree.GetSafeHwnd() != NULL );
>
>::SetWindowLong(tree.GetSafeHwnd(),GWL_STYLE,TVS_HASLINES |TVS_LINESATROOT);

****
(a) this is not good style for setting styles. You have cleared ALL the style bits,
EXCEPT the two you set. At the VERY MINIMUM this code should say

DWORD style = tree.GetStyle();
style |= TVS_HASLINES | TVS_LINESATROOT;
::SetWindowLong(tree.GetSafeHwnd(), GWL_STYLE, style);

but why go through all that work? Instead, just call

tree.ModifyStyle(0, TVS_HASLINES | TVS_LINESATROOT);

which should be sufficient (no need to get the old style, etc.)
joe
****


>}
>
>Iv tried using this to set the styles as in the above code, but the program
>gets corrupted.
>
>How can i set the style of a CTreeCtrl nested in a CTreeView?
>
>
>
>

Joseph M. Newcomer [MVP]
email: newc...@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm

PRMARJORAM

unread,
May 14, 2008, 1:40:01 PM5/14/08
to
Exactly,

i was looking for a method something like SetStyle, then looking at the msdn
documentation for using CTreeCtrl, stated had to use SetWindowLong

I could not believe they had left something so fundamental out of the class
interface, they had not...

David Connet

unread,
May 14, 2008, 7:52:29 PM5/14/08
to
=?Utf-8?B?UFJNQVJKT1JBTQ==?= <PRMAR...@discussions.microsoft.com>
wrote in news:7A2A351F-F074-48AA...@microsoft.com:

> Im using a MFC CTreeView which fits nicely with what im trying to do.
> I need to change the style of the nested CTreeCtrl.

The easiest way is to override PreCreateWindow:

BOOL CMyTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASLINES | TVS_LINESATROOT;
return __super::PreCreateWindow(cs);
}

Some styles need to be done in OnInitialUpdate (or OnCreate)
[I just copied some listview code for an example]
GetListCtrl().SetExtendedStyle(GetListCtrl().GetExtendedStyle() |
LVS_EX_FULLROWSELECT);

Dave Connet

Joseph M. Newcomer

unread,
May 14, 2008, 11:39:04 PM5/14/08
to
They didn't. This is a documentation error, and I will add it to my list of documentation
errors.
joe

On Wed, 14 May 2008 10:40:01 -0700, PRMARJORAM <PRMAR...@discussions.microsoft.com>
wrote:

Ali BEN MAHMOUD

unread,
Nov 21, 2011, 6:29:56 AM11/21/11
to
Thank Shoaib.
Your response is exactly what I am seeking for :)

> On Wednesday, May 14, 2008 11:01 AM PRMARJORA wrote:

> Im using a MFC CTreeView which fits nicely with what im trying to do. I need
> to change the style of the nested CTreeCtrl.
>
> There is no easy way to do this, the documentation points to using
> SetWindowLong.
>
> void CMyTreeView::OnInitialUpdate()
>
> {
>
> CTreeView::OnInitialUpdate();
>
> CTreeCtrl& tree = GetTreeCtrl();
>
> HTREEITEM root_item = tree.InsertItem(CString("MyProject"));
> HTREEITEM init_request = tree.InsertItem(CString("Item 1"), root_item);
> HTREEITEM doc_package = tree.InsertItem(CString("Item 2"), root_item);
>
> ASSERT(tree.GetSafeHwnd() != NULL );
>
> }
>
> Iv tried using this to set the styles as in the above code, but the program
> gets corrupted.
>
> How can i set the style of a CTreeCtrl nested in a CTreeView?


>> On Wednesday, May 14, 2008 11:10 AM M. Shoaib Surya wrote:

>> You should call ModifyStyle() member function of CTreeCtrl to set the style.
>> The following line of code should achieve your purpose.
>>
>> tree.ModifyStyle(NULL, TVS_HASLINES |TVS_LINESATROOT);
>>
>> Regards,
>> Shoaib.
>>
>> "PRMARJORAM" <PRMAR...@discussions.microsoft.com> wrote in message
>> news:7A2A351F-F074-48AA...@microsoft.com...


>>> On Wednesday, May 14, 2008 11:18 AM M. Shoaib Surya wrote:

>>> Also, the call to the OnInitialUpdate() of the base class, that is, the
>>> following line of code,
>>> CTreeView::OnInitialUpdate();
>>> should be the last line of the overridden CMyTreeView::OnInitialUpdate()
>>> instead of the first line
>>>
>>> - Shoaib
>>>
>>> "M. Shoaib Surya" <shoai...@hotmail.com> wrote in message
>>> news:OYueoWdt...@TK2MSFTNGP03.phx.gbl...


>>>> On Wednesday, May 14, 2008 12:03 PM PRMARJORA wrote:

>>>> Thanks ill look into that modify style, looks alot better...
>>>>
>>>> I have cracked it though now, needed to do the following
>>>> LONG style = ::GetWindowLong(tree.GetSafeHwnd(),GWL_STYLE);
>>>>
>>>> TVS_HASLINES |TVS_LINESATROOT);
>>>>
>>>> So needed to combine the current style with the additions.
>>>>
>>>>
>>>> "M. Shoaib Surya" wrote:


>>>>> On Wednesday, May 14, 2008 12:42 PM Joseph M. Newcomer wrote:

>>>>> See below...
>>>>> On Wed, 14 May 2008 08:01:02 -0700, PRMARJORAM <PRMAR...@discussions.microsoft.com>
>>>>> wrote:
>>>>>
>>>>> ****
>>>>> (a) this is not good style for setting styles. You have cleared ALL the style bits,
>>>>> EXCEPT the two you set. At the VERY MINIMUM this code should say
>>>>>
>>>>> DWORD style = tree.GetStyle();
>>>>> style |= TVS_HASLINES | TVS_LINESATROOT;
>>>>>
>>>>> but why go through all that work? Instead, just call
>>>>>
>>>>> tree.ModifyStyle(0, TVS_HASLINES | TVS_LINESATROOT);
>>>>>
>>>>> which should be sufficient (no need to get the old style, etc.)
>>>>> joe
>>>>> ****
>>>>> Joseph M. Newcomer [MVP]
>>>>> email: newc...@flounder.com
>>>>> Web: http://www.flounder.com
>>>>> MVP Tips: http://www.flounder.com/mvp_tips.htm


>>>>>> On Wednesday, May 14, 2008 1:40 PM PRMARJORA wrote:

>>>>>> Exactly,
>>>>>>
>>>>>> i was looking for a method something like SetStyle, then looking at the msdn
>>>>>> documentation for using CTreeCtrl, stated had to use SetWindowLong
>>>>>>
>>>>>> I could not believe they had left something so fundamental out of the class
>>>>>> interface, they had not...
>>>>>>
>>>>>>
>>>>>> "Joseph M. Newcomer" wrote:


>>>>>>> On Wednesday, May 14, 2008 7:52 PM David Connet wrote:

>>>>>>> =?Utf-8?B?UFJNQVJKT1JBTQ==?= <PRMAR...@discussions.microsoft.com>
>>>>>>> wrote in news:7A2A351F-F074-48AA...@microsoft.com:
>>>>>>>
>>>>>>>
>>>>>>> The easiest way is to override PreCreateWindow:
>>>>>>>
>>>>>>> BOOL CMyTreeView::PreCreateWindow(CREATESTRUCT& cs)
>>>>>>> {
>>>>>>> cs.style |= TVS_HASLINES | TVS_LINESATROOT;
>>>>>>> return __super::PreCreateWindow(cs);
>>>>>>> }
>>>>>>>
>>>>>>> Some styles need to be done in OnInitialUpdate (or OnCreate)
>>>>>>> [I just copied some listview code for an example]
>>>>>>> GetListCtrl().SetExtendedStyle(GetListCtrl().GetExtendedStyle() |
>>>>>>> LVS_EX_FULLROWSELECT);
>>>>>>>
>>>>>>> Dave Connet


0 new messages