Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функции для ImageList не работают:( 
:(
    Опции темы
valdev
  Дата 16.12.2005, 15:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите пожалуйста почему не работают никакие функции для ImageList.
Вот например в коде
Код

InitCommonControls();

HWND       DesktopHWND      = FindWindowEx(FindWindowEx(FindWindow("Progman", 0), 0, 0, 0), 0, 0, 0); //Get desktop as SysListView32
HIMAGELIST DesktopImageList = ListView_GetImageList(DesktopHWND, LVSIL_NORMAL);
IMAGEINFO  ImageInfo;
int        ImageCount = ImageList_GetImageCount(DesktopImageList);
BOOL       boolResult = ImageList_GetImageInfo (DesktopImageList, 0, (IMAGEINFO FAR *)&ImageInfo);

ImageList_GetImageCount() возвращает 0 (ноль) и
ImageList_GetImageInfo() возвращает 0 (ноль),
хотя все остальное отрабатывает как надо и на десктопе иконы есть и мой DesktopImageList вроде верный (не нулевой)

??????????????
  Вверх
Fixin
Дата 16.12.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Это откуда код?
Цитата(valdev @ 16.12.2005, 16:31)
FindWindow("Progman", 0);

Эта штука еще существует? Я просто не знаю.

PM MAIL ICQ   Вверх
Aleksandor
Дата 16.12.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



А там handle требуется к listview control'у а не к окну


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Guest
Дата 21.12.2005, 08:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Aleksandor
Цитата

А там handle требуется к listview control'у а не к окну

Там - это где?
Я ж написал, что кроме ImageList-а все работает нормально, т. е. строки с ListView работают, но не работают строки с ImageList smile
  Вверх
valdev
Дата 21.12.2005, 08:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всмысле Guest - это valdev
  Вверх
Earnest
Дата 21.12.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Возможно, дело в том, что hImageList, который ты получаешь, имеет смысл только в адресном пространстве Progman? Вряд ли это глобальный идентификатор.
Если так, то добраться до иконок progman'а можно только внедрившись в его адресное пространство.


--------------------
...
PM   Вверх
Aleksandor
Дата 21.12.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



А ExtractIconEx пробовал?

Твой способ не катит потому что FindWindow находит хэндл к окну приложения, но это окно это не image list!

Image list это всего лишь список в памяти процесса и он может быть пустым. В своей проге можно лист создать, заполнить иконками и получить к нему handle или можно получить хэндл к системному image list, но системный может быть пустой или почти пустой если система его не заполнила. А она заполняет по мере надобности smile

Обычно иконки хранятся в файле ресурсов и вот оттудова бы их можно извлечь... Но кроме ExtractIconEx ничего не приходит в голову smile Может кто знает другие способы smile ?






--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Partizan
Дата 21.12.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Ну когда я файловый менеджер писал а-ля Тотал коммандер Криситиана Гислера, то юзал хэндл системного имаджлиста...проблем никаких не возникало с получением иконок...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
valdev
Дата 26.12.2005, 13:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Короче, я с этой проблемой разобрался - смотрите код ниже (Visual C++ 6.0) smile
Но у меня возник еще вопрос - так же в коде описан.
Помогите стоящим советом smile
Код

#include "stdafx.h"
#include <ShlObj.h>
#include <ShellAPI.h>
#include <CommCtrl.h>

const char cszEmptyWndClass[] = "EmptyWndClass";

LRESULT CALLBACK EmptyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch(message) {
        case WM_PAINT: {
            RECT rt;
            GetClientRect(hWnd, &rt);
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
      Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom);

//************Народ подскажите почему здесь нереальный шрифт наименований икон десктопа берется?        НАЧАЛО
//************И как взять реальный шрифт наименований икон десктопа?
      HWND    DesktopHWND = FindWindowEx(FindWindowEx(FindWindow("Progman", 0), 0, 0, 0), 0, 0, 0); //Get desktop as SysListView32
      HDC     DesktopHDC  = GetWindowDC(DesktopHWND);
      HFONT   DesktopFont = (HFONT)GetCurrentObject(DesktopHDC, OBJ_FONT);
      LOGFONT DesktopLogFont;
      int NumBytes = GetObject(DesktopFont, sizeof DesktopLogFont, &DesktopLogFont);
      HFONT hThisFont = CreateFontIndirect(&DesktopLogFont);
      HFONT hOldFont = (HFONT)SelectObject(hdc, hThisFont);
//************Народ подскажите почему здесь нереальный шрифт наименований икон десктопа берется?        КОНЕЦ

//*********************Вот здесь мы и выцепляем иконы с десктопа:)        НАЧАЛО
      IShellFolder* psfDesktop;
      IEnumIDList * pEnumIDList;
      ITEMIDLIST  * pItemIDList;
      ULONG         celtFetched;
      SHFILEINFO    ShFileInfo;
      HIMAGELIST    hImageList;
      int           cx, cy, x = 10, y = 10, i = 0, ito = 5;
      RECT          TextRect;
      InitCommonControls();
      SHGetDesktopFolder(&psfDesktop);
      psfDesktop->EnumObjects(hWnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &pEnumIDList);
      while(pEnumIDList->Next(1, &pItemIDList, &celtFetched) == NOERROR) {
        hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)pItemIDList, 0, &ShFileInfo, sizeof ShFileInfo,
                                               SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME | SHGFI_TYPENAME);
        ImageList_GetIconSize(hImageList, &cx, &cy);
        ImageList_Draw(hImageList, ShFileInfo.iIcon, hdc, x, y, ILD_TRANSPARENT);
        SetRect(&TextRect, x + cx + 5, y, x + 200, y + cy);
        DrawText(hdc, ShFileInfo.szDisplayName, -1, &TextRect, DT_WORDBREAK);
        if(++i < ito)
          x += 210;
        else {
          i = 0;
          x = 10;
          y += cy + 10;
        }
      }
      pEnumIDList->Release();
      psfDesktop->Release();
//*********************Вот здесь мы и выцепляем иконы с десктопа:)        КОНЕЦ

      SelectObject(hdc, hOldFont);

      EndPaint(hWnd, &ps);
      return 0;
    }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
  }
  return DefWindowProc(hWnd, message, wParam, lParam);
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wcex;
  memset(&wcex, 0, sizeof wcex);
    wcex.cbSize        = sizeof wcex;
    wcex.lpfnWndProc     = EmptyWndProc;
    wcex.hInstance         = hInstance;
    wcex.lpszClassName = cszEmptyWndClass;
    RegisterClassEx(&wcex);

  HWND hWnd = CreateWindow(cszEmptyWndClass, 0, WS_OVERLAPPEDWINDOW, 0, 0, 1200, 950, 0, 0, hInstance, 0);

  if(!hWnd) return 0;
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

  MSG msg;
    while(GetMessage(&msg, 0, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage (&msg);
    }
    
  return msg.wParam;
}

  Вверх
valdev
Дата 26.12.2005, 13:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Так же, всем спасибо, кто старается помочь smile
  Вверх
valdev
Дата 26.12.2005, 13:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Earnest
Цитата
Возможно, дело в том, что hImageList, который ты получаешь, имеет смысл только в адресном пространстве Progman? Вряд ли это глобальный идентификатор.
Если так, то добраться до иконок progman'а можно только внедрившись в его адресное пространство.

Я тоже так подумал. И наверное так и есть!
  Вверх
Guest
Дата 26.12.2005, 13:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Aleksandor
Цитата
А ExtractIconEx пробовал?
.
.
.
Обычно иконки хранятся в файле ресурсов и вот оттудова бы их можно извлечь... Но кроме ExtractIconEx ничего не приходит в голову  Может кто знает другие способы  ?
Спасибо конечно, но это не совсем подходит, смотри выложенный мнойю код smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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