Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужно напромтив каждого Нода TreeView создать checkbox??? [D6, Win2k]


Relaxxx ©   (2004-09-01 22:25:00) 

Веренее как создать я знаю:

SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $0100);


а вот как узнать свойства чекбокса у нода, например есть галочка или нет, как самому поставить галочку програмно или сделать чекбокс неактивным????


xmrz   (2004-09-14 15:15:00) [1]

Самое простое решение - отрисовывать Bitmap из ресурсов на канве. Событие OnChange и свойство Checked написать через обработчик OnMouseDown OnMouseUp, OnKeyDown и OnKeyUp


Dmitry   (2004-09-14 15:07:00) [2]

Лучше взять библиотеку Raize2. В ней есть компонент TRzCheckTree. Это как раз то, что надо.


Mim1   (2004-09-12 13:08:00) [3]


> [2] Biga   (12.09.04 12:57)

А не удалось ли вам сделать чекбокс неактиынм? или отловить момент изменения состояни галочки?


Biga   (2004-09-12 12:57:00) [4]

Чекбоксы в TTreeView.

Понадобилось мне как-то дерево с чекбоксами. Само по себе это не сложно - Яндекс дал мне ну

жную ссылку на второй странице:

 SetWindowLong(TreeView1.Handle, GWL_STYLE,GetWindowLong(TreeView1.Handle, GWL_STYLE) or
TVS_CHECKBOXES);


TreeView1- это дерево, с которым я работал.
Этой строчкой мы задаём дереву стиль TVS_CHECKBOXES. Все константы берутся из модуля CommCtrl. (Не забудьте uses CommCtrls!)

Далее мне, естественно, захотелось узнать/установить состояние определённого чекбокса. Причём узнать

его в тот момент для меня было важнее. Сколько я не бился, Яндекс отправлял меня на одну и туже фун

кцию TreeView_GetCheckState. А такой функции в CommCtrlне было. Ну и не беда, правда? ;)
Берем где-нибудь файл "CommCtrl.H". Ну и что, что всё на Си? Ищем функцию TreeView_GetCheckState. Вот она:


#define TreeView_GetCheckState(hwndTV, hti) \
  ((((UINT)(SNDMSG((hwndTV), TVM_GETITEMSTATE, (WPARAM)(hti), TVIS_STATEIMAGEMASK))) >> 12) -1)


Осталось только узнать типы параметров функции, тех которые hwndTVи hti. В этом нам поможет сайт Микрософта: ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/treeview/macros/treeview_getcheckstate.asp)


Syntax:
UINT TreeView_GetCheckState(
   HWND hwndTV,
   HTREEITEM hItem
);

Parameters:
hwndTV  Handle to the tree-view control.
hItem   Handle to the item.

Returns:
Checked    1
Unchecked  0
No Check Box Image -1


Всё, больше нам ничего и не надо. Переводим это дело на "русский" язык.


function TreeView_GetCheckState(hwndTV:HWND; hItem:HTREEITEM):UINT;
const TVM_GETITEMSTATE = (TV_FIRST + 39); // Этой константы не было в модуле CommCtrl.
     // TVIS_STATEIMAGEMASK = $F000;  // А эти были, я их тут просто так написал
     // TV_FIRST = $1100;             //
begin
 Result:=((UINT(SendMessage(hwndTV, TVM_GETITEMSTATE, WPARAM(hItem), TVIS_STATEIMAGEMASK))) shr 12) -1;
end;


Параметры функции следующие:
hwndTV- Хэндл дерева. У меня TreeView1.Handle;
hItem- Идентификатор узла. Например, у текущего узла это TreeView1.Selected.ItemId. У первого узла TreeView1.Items[0].ItemId;

Возвращает 1 или 0 - выключено или включено, соответственно. Еще может вернуть -1, если что-то не в порядке.

С установкой чуток посложнее. Всё делается через функцию TreeView_SetItemState.


// Эта функция вспомогательная.
function TreeView_SetItemState(hwndTV:HWND;hItem:HTREEITEM;state,stateMask:UINT):UINT;
var _ms_TVi:TTVITEM;
begin
 _ms_TVi.mask := TVIF_STATE;
 _ms_TVi.hItem := hItem;
 _ms_TVi.stateMask := stateMask;
 _ms_TVi.state := state;
 SendMessage(hwndTV, TVM_SETITEM, 0, LPARAM(@_ms_TVi));
end;

//
function TreeView_SetCheckState(hwndTV:HWND;hItem:HTREEITEM;fCheck:Boolean):UINT;
var FCheckW:Word;
begin
 if fCheck then fCheckW:=2 shl 12 else fCheckW:=1 shl 12;
 TreeView_SetItemState(hwndTV, hItem, fCheckW, TVIS_STATEIMAGEMASK)
end;


Использование функции SetCheckStateтакое:
Как и у первой функции
hwndTV- Хэндл дерева. У меня TreeView1.Handle;
hItem- Идентификатор узла. Например, у текущего узла это TreeView1.Selected.ItemId. У первого узла TreeView1.Items[0].ItemId;
fCheck- в какое состояние надо установить чекбокс. True - включено, False - выключено, соответственно.

Biga.
У меня всё работало, но если что мыльте: BigaSoft@yandex.ru


Mim1   (2004-09-02 01:05:00) [5]


> сделать чекбокс неактивным????

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо