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

CTreeCtrl and Checkboxes

396 views
Skip to first unread message

Nick Schultz

unread,
Aug 4, 2008, 5:42:53 PM8/4/08
to
I have a tree structure with multiple DSPs as parent nodes and their
reporting errors as the child node

for example:

|-DSP1
| |-error1
| |-error2
|
|-DSP2
|-error1
|-error2

I want to be able to have checkmarks to select DSPs only. However, if I
enable checkboxes, all items get a checkbox.

is there a way to just have the DSP items to have checkboxes?

Nick


Joseph M. Newcomer

unread,
Aug 4, 2008, 9:02:08 PM8/4/08
to
Short of doing it owner-draw, no idea.
joe

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

David Connet

unread,
Aug 5, 2008, 10:31:04 AM8/5/08
to
"Nick Schultz" <nick.s...@flir.com> wrote in news:eACaNsn9IHA.4492
@TK2MSFTNGP03.phx.gbl:

Yes. Enable the checkbox option and then manage all the setting of
checkboxes directly (do not use SetCheck). Checkmarks are managed using the
state attribute. So setting that to 0 will turn off the checkbox. (If I
remember, 1 == unchecked and 2 == checked - I'd have to look at the code to
verify)

Dave Connet

Nick Schultz

unread,
Aug 5, 2008, 7:23:23 PM8/5/08
to


"David Connet" <st...@agilityrecordbook.com> wrote in message
news:IuZlk.17431$mh5....@nlpi067.nbdc.sbc.com...

it looks like there are only 7 states, none that deal with checkbox state:

TVIS_BOLD

TVIS_CUT

TVIS_DROPHILITED

TVIS_EXPANDED

TVIS_EXPANDEDONCE

TVIS_EXPANDPARTIAL

TVIS_SELECTED


Volker Enderlein

unread,
Aug 6, 2008, 2:47:45 AM8/6/08
to
Nick Schultz schrieb:
I did have exactly the same problem yesterday and this is what I came up
with from the MSDN documentation:

To set the checkbox state:

TVITEM tvi = {0};
tvi.mask = TVIF_HANDLE | TVIF_STATE;
tvi.hItem = hParentItem;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = INDEXTOSTATEIMAGEMASK(index);
m_wndTree.SetItem(&tvi);

where and index of 0 means not to show a check box, 1 means unchecked, 2
means checked.

To get the check box state:

TVITEM tvi = {0};

// Prepare to receive the desired information.
tvi.mask = TVIF_HANDLE | TVIF_STATE;
tvi.hItem = hItem;
tvi.stateMask = TVIS_STATEIMAGEMASK;

// Request the information.
m_wndTree.GetItem(&tvi);

// Return zero if it's not checked, or nonzero otherwise.
return ((BOOL)(tvi.state >> 12) -1);

BTW you have to construct the TreeCtrl with the TVS_CHECKBOXES style.

Hope that helps, Cheers Volker

--
Volker Enderlein
Tel: +49 (0)371 53119651 Institut für Mechatronik
Fax: +49 (0)371 53119699 Reichenhainer Strasse 88
email: vol...@ifm.tu-chemnitz.de D-09126 Chemnitz

Nick Schultz

unread,
Aug 6, 2008, 12:02:47 PM8/6/08
to
thanks that worked!

How do I know when a box has been checked?

I tried using TVN_ITEMCHANGED, but that handler doesn't get called when I
check the checkbox.

I suppose I could check the states of all DSP checkboxes after a NM_CLICK
message, but thats pretty troublesome and won't handle the case if the user
uses a keyboard to select the checkbox

Nick

"Volker Enderlein" <vol...@ifm.tu-chemnitz.de> wrote in message
news:eeWEUB59...@TK2MSFTNGP02.phx.gbl...

Victor

unread,
Aug 6, 2008, 5:12:27 PM8/6/08
to
KB261289: http://support.microsoft.com/kb/261289

Victor

"Nick Schultz" <nick.s...@flir.com> wrote in message
news:%23UWIg39...@TK2MSFTNGP04.phx.gbl...

Volker Enderlein

unread,
Aug 7, 2008, 2:53:29 AM8/7/08
to
Nick Schultz schrieb:

Hi Nick,

a word of warning after rereading the doc. If you create your TreeCtrl
with the TVS_CHECKBOXES style you may facing a wrong appearance the
first time you call your program.

The docs clearly say not to use this style when creating the TreeCtrl
but to add it later with a SetWindowLong call.

// Create tree windows.
const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES |
TVS_LINESATROOT | TVS_HASBUTTONS;

if (!m_wndTree.Create (dwViewStyle, rectDummy, this, IDC_TREECTRL))
{
TRACE0("Failed to create tree ctrl\n");
return -1; // fail to create
}

SetWindowLong(m_wndTree, GWL_STYLE, dwViewStyle | TVS_CHECKBOXES);

Victor

unread,
Aug 7, 2008, 12:46:01 PM8/7/08
to
Well, MFC CWnd::ModifyStyle method will also work pretty good:

if (!m_wndTree.Create (dwViewStyle, rectDummy, this, IDC_TREECTRL))
{
TRACE0("Failed to create tree ctrl\n");
return -1; // fail to create
}

m_wndTree.ModifyStyle(0, TVS_CHECKBOXES);

Victor

0 new messages