CheckBox'ы в TreeView...
От: SubZero2000 Украина  
Дата: 22.03.04 12:10
Оценка:
Hi All !!!
У CheckBox'a есть propertie CheckState, которое может быть равным Indeterminate (the check box displays a check mark and is shaded).
Задача: необходимо в контролe TreeView, c включённым propertie CheckBoxes, отобразить оные со статусом Indeterminate.
У меня загвоздка — не могу добраться до этих CheckBox'ов, более того, есть подозрение, что кому-то было лень их туда вставлять и в дереве отображаются вообще имиджи (до которых кстати тоже пока не получилось добраться).
Может у кого-то есть неплохие идеи?



22.03.04 15:26: Перенесено модератором из '.NET' — TK
(с)(_SZ_)
Re: CheckBox'ы в TreeView...
От: SubZero2000 Украина  
Дата: 22.03.04 18:15
Оценка:
Гм... Странно, неужели всё так печально.
(с)(_SZ_)
Re: CheckBox'ы в TreeView...
От: Smarty Россия  
Дата: 22.03.04 18:36
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>У меня загвоздка — не могу добраться до этих CheckBox'ов, более того, есть подозрение, что кому-то было лень их туда вставлять и в дереве


Именно так. Это — не реальный контрол System.Windows.Forms.CheckBox а всего лишь картинка из ресурсного файла виндов. Эти псевдо-чек-боксы можно всего лишь проверить на факт выбора/не выбора их пользователем — TreeNode.Checked.
Re[2]: CheckBox'ы в TreeView...
От: SubZero2000 Украина  
Дата: 23.03.04 08:46
Оценка:
Здравствуйте, Smarty, Вы писали:

S>Именно так. Это — не реальный контрол System.Windows.Forms.CheckBox а всего лишь картинка из ресурсного файла виндов. Эти псевдо-чек-боксы можно всего лишь проверить на факт выбора/не выбора их пользователем — TreeNode.Checked.



Thanks. Да я как бы догадался...
Но меня, если честно, больше интересуют способы решения поставленной задачи.
Может есть хоть какие-нибудь идеи?
(с)(_SZ_)
Re: CheckBox'ы в TreeView...
От: orangy Россия
Дата: 23.03.04 09:06
Оценка:
Здравствуйте, SubZero2000, Вы писали:

SZ>Может у кого-то есть неплохие идеи?

WinAPI + интероп в зубы и вперед. Надо послать (SendMessage) в окно treeview сообщение TVM_SETITEM. Копай туда.
... << RSDN@Home 1.1.3 beta 2 >>
"Develop with pleasure!"
Re[2]: CheckBox'ы в TreeView...
От: SubZero2000 Украина  
Дата: 23.03.04 12:16
Оценка:
Здравствуйте, orangy, Вы писали:

O>WinAPI + интероп в зубы и вперед. Надо послать (SendMessage) в окно treeview сообщение TVM_SETITEM. Копай туда.


Сам пробывал или только думаешь, что может получиться?
А то связка из первых двух слов меня не очень радует .
(с)(_SZ_)
Re[3]: CheckBox'ы в TreeView...
От: orangy Россия
Дата: 23.03.04 12:28
Оценка:
Здравствуйте, SubZero2000, Вы писали:

O>>WinAPI + интероп в зубы и вперед. Надо послать (SendMessage) в окно treeview сообщение TVM_SETITEM. Копай туда.


SZ>Сам пробывал или только думаешь, что может получиться?

Не пробовал, а делал. Там и пробовать-то нечего.

SZ>А то связка из первых двух слов меня не очень радует .

Это довольно просто, если не лезть сильно глубоко. Заодно и разберешься, если не знаешь.
... << RSDN@Home 1.1.3 beta 2 >>
"Develop with pleasure!"
Re[4]: CheckBox'ы в TreeView...
От: SubZero2000 Украина  
Дата: 24.03.04 15:45
Оценка:
Здравствуйте, orangy, Вы писали:

O>Здравствуйте, SubZero2000, Вы писали:


O>>>WinAPI + интероп в зубы и вперед. Надо послать (SendMessage) в окно treeview сообщение TVM_SETITEM. Копай туда.


SZ>>Сам пробывал или только думаешь, что может получиться?

O>Не пробовал, а делал. Там и пробовать-то нечего.

SZ>>А то связка из первых двух слов меня не очень радует .

O>Это довольно просто, если не лезть сильно глубоко. Заодно и разберешься, если не знаешь.


Получилось, правда пока немного коряво: загрузить картинку удалось только с помощью
LoadImage(...), да и то только с атрибутом LR_LOADFROMFILE, а хотелось бы из ресурсов. Но это для
другого форума. А в остальном — песня.
Спасибо.
(с)(_SZ_)
Re: CheckBox'ы в TreeView...
От: SubZero2000 Украина  
Дата: 25.03.04 09:00
Оценка:
Вообще-то нехороший осадок остался после решения этой проблемы.
Можно было бы посмотреть сколько статусов у чекбоксов
и реализовать их все, как для TreeView, так и для ListView.
То ли это невнимание, то ли просто лень, меня честно говоря не интересует — просто неприятно.

Да, выложу код Win32 dll может кому-нибудь понадобится:

#include "stdafx.h"
#include "resource2.h"

HANDLE _Module;

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    _Module = hModule;
    return TRUE;
}


extern "C" __declspec(dllexport) HICON SetIcon(HWND hwndTV, int* outIndex) {
    
    (*outIndex) = -1;
    
    HIMAGELIST hImageList = TreeView_GetImageList(hwndTV, TVSIL_STATE);
    
    HANDLE hIcon = LoadImage(
        (HINSTANCE)_Module,        // handle to instance
        MAKEINTRESOURCE(IDI_SHADOWICON),// image to load
        IMAGE_ICON,            // image type
        16,                // desired width
        16,                // desired height
        LR_VGACOLOR            // load options
    );
    
    if(hIcon == NULL) {
        return NULL;
    }
    
    int theIndex = ImageList_AddIcon(hImageList, (HICON)hIcon);
    
    if(theIndex == -1) {
        DestroyIcon((HICON)hIcon);
        return NULL;
    }
    
    TreeView_SetImageList(hwndTV, hImageList, TVSIL_STATE);
    (*outIndex) = theIndex;
    return (HICON)hIcon;
}


extern "C" __declspec(dllexport) bool SetShadowState(HWND hwndTV, HTREEITEM hItem, int inImageIndex) {
    
    LPTVITEM theItem = new TVITEM();
    theItem->hItem = hItem;
    if(!TreeView_GetItem(hwndTV, theItem)) {
        delete(theItem);
        return false;
    }
    theItem->mask |= TVIF_STATE;
    theItem->stateMask |= TVIS_STATEIMAGEMASK;
    theItem->state = INDEXTOSTATEIMAGEMASK(inImageIndex);
    if(!TreeView_SetItem(hwndTV, theItem)) {
        delete(theItem);
        return false;
    }
    delete(theItem);
    return true;
}


extern "C" __declspec(dllexport) bool DestroyImage(HICON* hIcon) {
    bool theResult = false;
    if((*hIcon) != NULL) {
        theResult = (bool)DestroyIcon(*hIcon);
        (*hIcon) = NULL;
    }
    return theResult;
}
(с)(_SZ_)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.