Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > dll CTreeCtrl || TreeView_InsertItem


Автор: MaksSh 12.12.2010, 21:14
Всем привет
собираю dll в ней сперва использовал функции MFC
Код

void FillTree(HWND hTree)
{
    HIMAGELIST hIml;
    HBITMAP hBmp;
    HBITMAP hBmpMask;
    TVITEM tvi;
    TVINSERTSTRUCT tvins;
    //TVINSERTSTRUCT

    HTREEITEM hTreeItem;

    hIml = ImageList_Create(16, 16, ILC_MASK, 2, 0);  //создаём сами догадаемся что(есть описание в MSDN)

    if(hIml == NULL) MessageBox(GetParent(hTree), TEXT("Can't Create image list"), TEXT("hIml Error"), MB_OK);  // ну это так для отладки
    // IDB_... - битмапы размером 16*16. (я такие использую)
    hBmp = LoadBitmap(GetWindowInstance(GetParent(hTree)), MAKEINTRESOURCE(IDB_BITMAP2));  // в MSDN можно посмотреть
    hBmpMask = LoadBitmap(GetWindowInstance(GetParent(hTree)), MAKEINTRESOURCE(IDB_BITMAP6));  // тож самое
    ImageList_Add(hIml, hBmp, hBmpMask);     // см MSDN

    hBmp = LoadBitmap(GetWindowInstance(GetParent(hTree)), MAKEINTRESOURCE(IDB_BITMAP3));  // в MSDN можно посмотреть
    ImageList_Add(hIml, hBmp, hBmpMask);     // см MSDN


    TreeView_SetImageList(hTree, hIml, TVSIL_NORMAL);  // и так всё понятно. Если у тебя используется в TREE картинки, то тебе это нужно

    tvi.mask = TVIF_IMAGE | TVIF_TEXT | TVIF_SELECTEDIMAGE;    //описание структуры смотри в MSDN
    tvi.iImage = 0;
    tvi.iSelectedImage = 1;

    //если выполнишь этот код и посмотришь как это работает, то всё станет ясно.

    tvi.pszText = TEXT("Vehicle");
    tvins.item = tvi;                         //см в MSDN
    tvins.hInsertAfter = TVI_LAST;
    tvins.hParent = TVI_ROOT;
    hTreeItem = TreeView_InsertItem(hTree, &tvins);

    tvi.pszText = TEXT("Kuzov");
    //tvins.itemex
    tvins.item = tvi;
    tvins.hParent = hTreeItem;
    HTREEITEM hTreeKuzovItem = TreeView_InsertItem(hTree, &tvins);
.....

всё работает, по ряду причин решил использовать WINAPI
тоесть тот же код но с использованием WINAPI
Код

void FillTree2(HWND hWnd, HWND hTree)
{
    HICON hIcon[3];
    int n;
    CImageList m_imageList;
    m_imageList.Create(16, 16, 0, 3, 0); // 32, 32 for large icons
    hIcon[0] = AfxGetApp()->LoadIcon(IDI_ICON1);
    hIcon[1] = AfxGetApp()->LoadIcon(IDI_ICON2);
    hIcon[2] = AfxGetApp()->LoadIcon(IDI_ICON3);
    
    for (n = 0; n < 3; n++) {
        m_imageList.Add(hIcon[n]);
    }
    if( NULL == GetDlgItem(hWnd, IDC_TREE1))
    {
        MessageBox(NULL, "ooooo", "Error", MB_OK | MB_ICONQUESTION);
    }
    else
    {
        CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(hWnd, IDC_TREE1);
        pTree->SetImageList(&m_imageList, TVSIL_NORMAL);
        // tree structure common values
        TVINSERTSTRUCT tvinsert;
        tvinsert.hParent = NULL;
        tvinsert.hInsertAfter = TVI_LAST;
......

и началось. При отладке приложение 
валится на строке 
Код

hIcon[0] = AfxGetApp()->LoadIcon(IDI_ICON1);

когда закоментировал создание массива hIcon и загрузку иконок
то при дебаге dll падает на строке
Код

pTree->SetImageList(&m_imageList, TVSIL_NORMAL);


тоесть как я понимаю проблема с предыдущей строкой
Код

CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(hWnd, IDC_TREE1);


не пойму в чём проблема, помогите разобраться

Автор: MaksSh 12.12.2010, 22:06
посмотрел в дебаге содержание объеста pTree
Код

CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(hWnd, IDC_TREE1);

 там сплошные: "невозможно вычислить значение" не пойму в чём проблема вроде всё правильно делаю  smile 

Автор: Earnest 13.12.2010, 09:38
CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(hWnd, IDC_TREE1);
- это круто. GetDlgItem возвращает вообще-то HWND. Потом ты его преобразовываешь к указателю на объект, грубой силой, и хочешь, чтобы объект был валиден? А ты его создавал, или вообще кто-нибудь?
И что-то я не увидела в коде отказа от MFC-функций. Объект ты пытаешься достать через АПИ, а потом доступаться к ним через MFC? Это чушь-какая-то.
Кстати, AfxGetApp - это тоже MFC. Если у тебе там валится, скорее всего, объект-приложение не валиден. 


Автор: MaksSh 13.12.2010, 21:37
Earnest
я примерчик с кодом преобразования
 
Код

CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(hWnd, IDC_TREE1);

взял с книги programming Visual C++ правда там под visual studio 6
во 
Код

CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(IDC_TREEVIEW1);

Автор: Earnest 14.12.2010, 08:59
По-твоему, это одно и то же? У тебя - глобальная ф-я АПИ, возвращающая хандл, в примере - MFC-функция-член окна.
Тебе надо бы ликбез пройти для начала, а то у тебя сплошные мухи с котлетами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)