Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll CTreeCtrl || TreeView_InsertItem 
:(
    Опции темы
MaksSh
Дата 12.12.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Всем привет
собираю 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);


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

PM MAIL WWW ICQ Skype   Вверх
MaksSh
Дата 12.12.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



посмотрел в дебаге содержание объеста pTree
Код

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

 там сплошные: "невозможно вычислить значение" не пойму в чём проблема вроде всё правильно делаю  smile 
PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 13.12.2010, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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




--------------------
...
PM   Вверх
MaksSh
Дата 13.12.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Earnest
я примерчик с кодом преобразования
 
Код

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

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

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

PM MAIL WWW ICQ Skype   Вверх
Earnest
Дата 14.12.2010, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1151 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.