Продолжение мук с предыдущей разработкой. Я хотел добавить опцию выбора значка. Выяснилось, что для 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);
}
Результат на картинке, осталось доделать нумерацию всех значков у файлов. Блин, я уже переписал код на ассемблер, но кое-как добился результата. Устал конкретно.
Комментарии
Отправить комментарий