Удаленный флажок вновь появляется в узле дерева просмотра при нажатии пробела

Я использовал принятое решение из этого вопроса удалять флажок из древовидный узел в моем WM_INITDIALOG обработчик.

После загрузки дерево имеет правильный вид. После того, как я выбираю узел и нажимаю на место, где флажок было бы, ничего не происходит ( флажок не появляется), что является правильным поведением.

Однако, если я выберу узел и нажмите пробел флажок автоматически добавляется к узлу.

Здесь WM_INITDIALOG обработчик, который иллюстрирует проблему:

case WM_INITDIALOG:
{
// get treeview handle

HWND TreeView = GetDlgItem( hDlg, IDC_TREE1 );

/************ enable checkboxes **************/

DWORD dwStyle = GetWindowLong( TreeView , GWL_STYLE);
dwStyle |= TVS_CHECKBOXES;
SetWindowLongPtr( TreeView , GWL_STYLE, dwStyle );

/************ add items and subitems **********/

// add root item

TVINSERTSTRUCT tvis = {0};

tvis.item.mask = TVIF_TEXT;
tvis.item.pszText = L"This is root item";
tvis.hInsertAfter = TVI_LAST;
tvis.hParent = TVI_ROOT;

HTREEITEM hRootItem = reinterpret_cast<HTREEITEM>( SendMessage( TreeView ,
TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

// and here is an example of removing a checkbox

TVITEM tvi;
tvi.hItem = hRootItem ;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
TreeView_SetItem( TreeView, &tvi );

// add firts subitem for the hTreeItem

memset( &tvis, 0, sizeof(TVINSERTSTRUCT) );

tvis.item.mask = TVIF_TEXT;
tvis.item.pszText = L"This is first subitem";
tvis.hInsertAfter = TVI_LAST;
tvis.hParent = hRootItem;

HTREEITEM hTreeSubItem1 = reinterpret_cast<HTREEITEM>( SendMessage( TreeView ,
TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );

// now we insert second subitem for hRootItem

memset( &tvis, 0, sizeof(TVINSERTSTRUCT) );

tvis.item.mask = TVIF_TEXT | TVIF_STATE; // added extra flag
tvis.item.pszText = L"This is second subitem";
tvis.hInsertAfter = TVI_LAST;
tvis.hParent = hRootItem;

HTREEITEM hTreeSubItem2 = reinterpret_cast<HTREEITEM>( SendMessage( TreeView ,
TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>( &tvis ) ) );
}
return (INT_PTR)TRUE;

Вот интересная цитата из MSDN:

Версия 5.80. Отображает флажок даже если ни одно изображение не связано с элементом.

Возможно, это является причиной моей проблемы?

Я пробовал обрабатывать TVN_KEYDOWN и установить состояние элементов или снова удалив флажок но не имели успеха.

РЕДАКТИРОВАТЬ № 2:

Я подклассифицировал дерево, как член Джонатан Поттер предложил, и это сработало:

LRESULT CALLBACK TreeProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam,
UINT_PTR uIdSubclass, DWORD_PTR dwRefData )
{
switch (message)
{
case WM_KEYDOWN:
{
// reject spacebar if tree node doesn't have checkbox
if( wParam == VK_SPACE )
{
HTREEITEM ht = TreeView_GetSelection( hwnd );

TVITEM tvItem;

// Prepare to receive the desired information.
tvItem.mask = TVIF_HANDLE | TVIF_STATE;
tvItem.hItem = (HTREEITEM)ht;
tvItem.stateMask = TVIS_STATEIMAGEMASK;

// Request the information.
TreeView_GetItem( hwnd, &tvItem );

// reject if it's not checked, or pass default value otherwise
switch( tvItem.state >> 12 )
{
case 0:
MessageBeep(0);
return FALSE;
break;
case 1:
case 2:
default:
return ::DefSubclassProc( hwnd, message, wParam, lParam );
break;
}
}
}
break;
case WM_NCDESTROY:
::RemoveWindowSubclass( hwnd, TreeProc, 0 );
break;
}
return ::DefSubclassProc( hwnd, message, wParam, lParam);
}

Конец редактирования

ВОПРОС:

Как я могу правильно удалить флажок из узел дерева так что больше никогда не появится ?

Спасибо.

С наилучшими пожеланиями.

0

Решение

Подкласс управления, перехватить пробел через WM_KEYDOWNи не пропускайте сообщение, если фокус находится на элементе, который вы не хотите иметь флажок.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]