Значки к SysListView32

 


Продолжение мук с предыдущей разработкой. Я хотел добавить опцию выбора значка. Выяснилось, что для Win95 есть такая функция WinAPI, но в наследство досталось 16битный остаток PICKICON в 16-битной функцией shell.dll. Вызвать функцию не удалось, получил невнятное сообщение. А сама функция PickIconDlg есть у других версий, причем чуть позже она стала работать с Unicode. Короче, я рискнул написать свою процедуру, убил целый день. Сначала нужно создать ImageList для элемента SysListView32, но компилятор ресурсов давится на этом элементе. Хорошо, создал ручками в программе. Но теперь компилятор подавился на вызове функции ImageListAddIcon. Сделал ручной вызов. На программе не видно ничего. Стал искать примеры и нашел, нужно всего лишь отправить сообщение окну.

#include <windows.h>
#include <winuser.h>
#include <commctrl.h>
#include <commoncontrols.h>

#define LVS_REPORT (1)
#define LVS_ICON (0)
#define SW_SHOWNORMAL (1)

HINSTANCE hInstance;
HINSTANCE libi;
HWND lv;
HIMAGELIST iml;

//https://www-user.tu-chemnitz.de/~heha/viewchm.php/hs/petzold.chm/petzoldi/ch11a.htm
int WINAPI DlgWinMain(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{
// static HWND hCtrlBlock ;
     switch (message)
     {
     case WM_INITDIALOG:
//      GetWindowRect(hDlg,&dr);
         lv = CreateWindowEx(0,"SysListView32", NULL, WS_CHILD|LVS_ICON|LVS_ICON, 0, 0, 280, 280, hDlg, NULL, hInstance, NULL);
    ShowWindow(lv,SW_SHOWNORMAL);
   
    iml=ImageList_Create(32,32,ILC_COLOR16|ILC_MASK,1,1);
    HICON it=LoadIcon(libi,1);
//    HICON it=LoadIcon(hInstance,100);
   
    HINSTANCE dllf=LoadLibrary("comctl32.dll");
    FARPROC handle=GetProcAddress(dllf,"ImageList_AddIcon");
    if (NULL != handle )
    {
    long c=(handle)(iml,it);
//    c=(handle)(iml,it);
    }
    //ImageList_AddIcon(iml,it);
    FreeLibrary(dllf);

    SendMessage(lv,LVM_SETIMAGELIST,LVSIL_NORMAL,iml);

    LV_ITEM lit;
    lit.mask=LVIF_IMAGE;//|LVIF_TEXT;
//    lit.pszText = "HELLO";
lit.iImage=0;
lit.iItem=0;
lit.iSubItem=0;
    SendMessage(lv,LVM_INSERTITEM,0,&lit);
          return TRUE;
     case WM_COMMAND:
          switch (LOWORD (wParam))
          {
          case IDOK:
               return TRUE ;

          case IDCANCEL:
               EndDialog (hDlg, FALSE) ;
               return TRUE ;
          }
          break ;
          
     }
     return FALSE ;
}

int main()
{
libi=LoadLibraryA("Shell32.dll");
InitCommonControls();
hInstance = GetModuleHandle(NULL);
DialogBoxParam(hInstance,1,NULL,DlgWinMain,NULL);
FreeLibrary(libi);
}

Результат на картинке, осталось доделать нумерацию всех значков у файлов. Блин, я уже переписал код на ассемблер, но кое-как добился результата. Устал конкретно.

Комментарии