1

(3 відповідей, залишених у C++)

Все, питання знято. Я розібрався.

ImageList_ReplaceIcon() повертала помилку -1, тому що у ImageList_Create() 3-й параметр на довжину списку не впливає.
Вона точно працює, але не створює масив з заданої кількості елементів. Тому елементи треба додавати, якщо ImageList_ReplaceIcon() то з другим параметром -1. Але і це ще не все. Навіть не думав і не очикував що мелкософт таке начаклує.

Список іконок має починатися обов'язково з 0. Тобто ресурсу IDC_MYICON в resource.h одразу можна задавати 0, та використовувати його замість змінної ImageListID. Це одне й те саме. Ресурс IDC_MYICON більше ніде не фігурує, тобто він формальний, але мелкософт вірогідно його використовує для себе. Тому і додає в проект по замовченюю.
Далі в файлі список іконок має продовжуватись (з 1!) та не розриватись. Першою іконкою треба ставити головну яка відображає іконку програми. Якщо цього не зробити, то системна іконка (16x16) створеної програми буде містити саме ту що стоїть першою. (В мене там одна іконка замість двох, одну з яких small воно саме робить).
Далі краще додати іконку яка буде використовуватись як заповнювач для розділювача BTNS_SEP, бо його все одно треба мати.
Далі з продовженням послідовної нумерації розташовуємо опис своїх іконок.

Потім в програмі робимо заповнення масиву. В нас попереду 3 елемента які треба заповнити:
1 - місто для іконки програми (яку я так розумію wcex.hIconSm потім і використовує як першу в ресурсі-списку IDC_MYICON),
2 - місто для іконки пустушки (яка в мене IDI_EMPTY і вона існує як файл (в мене Empty.ico) і прикріплена до проекту),
3 - місто для розділювача (не плутати з ресурсом номер 3)!
Тобто 3 рази:

ImageList_ReplaceIcon(hImageList, -1, LoadIconW(hInst, MAKEINTRESOURCEW(IDI_EMPTY)));

Весь блок:

    for (size_t i{}; i < 3; ++i) {
        ImageList_ReplaceIcon(hImageList, -1, LoadIconW(hInst, MAKEINTRESOURCEW(IDI_EMPTY)));
    }

    for (size_t i{}; i < numButtons; ++i) {
        ImageList_ReplaceIcon(hImageList, -1, LoadIconW(hInst, MAKEINTRESOURCEW(IDI_OPEN + i)));
    }

IDI_OPEN це ресурс з номером 3, з якого наприклад може починається блок основних іконок.

Отак це працює.

Ще є проблеми з підкладкою. Окантовка іконок на прозорому фоні які я використовую мають чорний фон на кнопках.

2

(3 відповідей, залишених у C++)

Отримати іконку можна і простіше:

ImageList_ReplaceIcon(hImageList, 0, LoadIconW(hInst, MAKEINTRESOURCEW(IDI_EXIT)));

Я ж кажу вже багато варіантів перепробував.
І так теж:

ImageList_ReplaceIcon((HIMAGELIST)&hImageList, 0, LoadIconW(hInst, MAKEINTRESOURCEW(IDI_EXIT)));

Але все не те.
Вони точно читаються, але або не перезаписуються, або список не чіпляється.

3

(3 відповідей, залишених у C++)

Підкажіть що я не доробив. Не замінює іконку на тулбарі. Все інше працює нормально. В ресурсі вона точно є.
Перепробував вже декілька методів завантаження іконок, міняв послідовність дзвінків, але результату немає.

Свої
HINSTANCE  hInst;
HIMAGELIST hImageList = NULL;

HWND CreateToolbar(HWND hWndParent) {

    const int ImageListID = 0;
    const int numButtons  = 1;
    const int bitmapSize  = 64;

    const DWORD buttonStyles = BTNS_AUTOSIZE;

    HWND hWndToolbar = CreateWindowW(TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_WRAPABLE | TBSTYLE_LIST | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT, 0, 0, 0, 0, hWndParent, nullptr, hInst, nullptr);
    if (!hWndToolbar) return FALSE;

    hImageList = ImageList_Create(bitmapSize, bitmapSize, ILC_COLOR32 | ILC_MASK, numButtons, 0);
    if (!hImageList) return FALSE;

    HICON hIcon{};
    hIcon = (HICON)LoadImageW(hInst, MAKEINTRESOURCEW(IDI_EXIT), IMAGE_ICON, bitmapSize, bitmapSize, LR_COPYFROMRESOURCE);
    ImageList_ReplaceIcon(hImageList, 0, hIcon);
    DestroyIcon(hIcon);

    TBBUTTON tbButtons[numButtons] =
    {
        { MAKELONG(IDI_EXIT, ImageListID), IDM_EXIT, TBSTATE_ENABLED, buttonStyles, {0}, 0, (INT_PTR)L"Exit"}
    };

    SendMessageW(hWndToolbar, TB_SETIMAGELIST, (WPARAM)ImageListID, (LPARAM)hImageList);
    SendMessageW(hWndToolbar, TB_SETMAXTEXTROWS, 0, 0);
    SendMessageW(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessageW(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);
    SendMessageW(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar, TRUE);

    return hWndToolbar;
}

З системними іконками все працює як треба:

Системні
HINSTANCE  hInst;
HIMAGELIST hImageList = NULL;

HWND CreateToolbar(HWND hWndParent) {

    const int ImageListID = 0;
    const int numButtons  = 3;
    const int bitmapSize  = 24;

    const DWORD buttonStyles = BTNS_AUTOSIZE;

    HWND hWndToolbar = CreateWindowW(TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_WRAPABLE | TBSTYLE_FLAT, 0, 0, 0, 0, hWndParent, nullptr, hInst, nullptr);
    if (!hWndToolbar) return FALSE;

    hImageList = ImageList_Create(bitmapSize, bitmapSize, ILC_COLOR32 | ILC_MASK, numButtons, 0);
    if (!hImageList) return FALSE;

    SendMessageW(hWndToolbar, TB_SETIMAGELIST, (WPARAM)ImageListID, (LPARAM)hImageList);
    SendMessageW(hWndToolbar, TB_LOADIMAGES, (WPARAM)IDB_STD_LARGE_COLOR, (LPARAM)HINST_COMMCTRL);

    TBBUTTON tbButtons[numButtons] =
    {
        { MAKELONG(STD_FILENEW,  ImageListID), IDM_DBUPLOAD, TBSTATE_ENABLED, buttonStyles},
        { MAKELONG(STD_FILEOPEN, ImageListID), IDM_DBUNLOAD, TBSTATE_ENABLED, buttonStyles},
        { MAKELONG(STD_DELETE,   ImageListID), IDM_EXIT,     TBSTATE_ENABLED, buttonStyles}
    };

    SendMessageW(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    SendMessageW(hWndToolbar, TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)&tbButtons);
    SendMessageW(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar, TRUE);

    return hWndToolbar;
}

Гадаю щось з дзвінками. А там хто знає.

4

(30 відповідей, залишених у C++)

Ото я вам знайшов тему порозмовляти ))
Я ж ще далі вчу цю осучаснену за роки мову, тому не все ще знайшов, хоча вже не мало я думаю. Просто вчити треба з прикладами застосування. От я собі і знайшов завдання де багато можна обкатати. А ту стандартну фью я мабуть і не бачив, тому і не копіював. Якщо щось не знайшов, роблю своє. Намагаюсь робити якомога універсальніше. В мене вже все давно нормально працює. Це я просто вкотре перепроходжу, оптимізую код.
А чому С++? Бо це класика, з якої поки що треба починати. Все що я бачу далі: Go, Swift не далеко пішли і від деяких ідей там я не в захваті. Я думаю що треба взагалі поміняти і концепцію і синтаксис операторів, зробити реверс вказівнику, можна і transform з bind поєднати в одному операторі і багато шо ще. Цей інструментарій в принципі застарів, але має багато напрацювань. Тільки не треба ліпити просто швидше аби щось своє як це сьогодні відбувається. Що буде  в голові років через 20 після постійних переробок і адаптації до вічно нового. Але очей, ніг, рук все ще по два, ми чомусь не мутуємо так швидко. Тому і програмний інструментарій має розвиватись поетапно, а не як дріжджі кинули в лайно. Фірм трильйонщіків вже декілька і всі хто як хоче, так і ... А зробити щось спільне продумане все ніяк не дійде до них. Мабуть поки людство не освідомить що капіталізм, це просто ще одна ступеня до самоорганізації і відповідальності далі справжніх рухів не буде. Тільки кіпіш і контраст гаманців як сьогодні.

5

(30 відповідей, залишених у C++)

Все ж таки дивно, чому компіляторщикам складно це реалізувати.
Бо отака штучка працює нормально і більше універсальна:

template<typename Type>
inline void fill(
    const typename Type::const_iterator& B,
    const typename Type::const_iterator& E,
    Type& O) {
    if (B < E) {
        auto C{ B };
        while (C != E) {
            O.push_back(*(C++));
        }
    }
}

Може і зі строками з char-ами працювати і з векторами з різними типами. Ну що є.
Вважаючи що років через 15 допілили тип byte офіційно, то тут хоч є нюанси.

6

(30 відповідей, залишених у C++)

koala написав:

Насправді я школу в 1998-му закінчив, так що ви молодші за мене з adziri разом.

Років на 10 таки ви молодше, але це не погано ж. ;)

7

(30 відповідей, залишених у C++)

koala і adziri не кіпішуйте обидва )) Я ж подякував.
Але то не справжні програмери якщо вони просто заспокоїлись і лягли спати. Мабуть ви ще в школу ходили коли я думи думав і шукав рішення проблем без інтернету. Я ж не дарма про себе хоч троки написав.
І все ж таки воно працює. Просто треба було підказати компілятору тип повернення.
Виклик:

return getvector<std::string>(m_array[Block][Group].cbegin() + 1, m_array[Block][Group].cend());

Рішення koala теж працює і навіть краще, без підказок компілятору. В принципі це те що і було потрібно.
Ще раз дякую.

8

(30 відповідей, залишених у C++)

Якщо ті хто мають більший досвід кажуть однозначно, що це неможливо, то буду вважати що це так.
Хоча зрозуміло, що це не костиль мови, а недоробка компіляторів. Поки що їхній AI більше схожий на IA як в того ослика.
Дякую всім хто відповів.

9

(30 відповідей, залишених у C++)

Вітаю.

Є невеличка проблемка. Хто зможе конкретно пояснити то прошу.
Трошки про себе, щоб розуміти мій рівень підготовки.

Чому функція працює, а шаблон ні?
Тобто в опису немає помилок, а в виклику, якщо шаблон то помилка.

Функція:

inline const std::vector<std::string> getvector(const std::vector<std::string>::const_iterator& B, const std::vector<std::string>::const_iterator& E) {
    std::vector<std::string> A{};
    if (B < E) {
        auto C{ B };
        while (C != E) {
            A.push_back(*(C++));
        }
    }
    return A;
}

Шаблон:

template<typename Type>
inline const  std::vector<Type> getvector(const typename std::vector<Type>::const_iterator& B, const typename std::vector<Type>::const_iterator& E) {
    std::vector<Type> A{};
    if (B < E) {
        auto C{ B };
        while (C != E) {
            A.push_back(*(C++));
        }
    }
    return A;
}

Виклик:

return getvector(m_array[Block][Group].cbegin() + 1, m_array[Block][Group].cend());

Дякую за увагу.

10

(629 відповідей, залишених у Обговорення)

Про себе

Мені вже на мало років, але я не дідусь і не дяділо з пузом )).
Починав займатись інформатикою ще з ПК "Львів" в 90-ті. Колись для себе вчив Асемблер і C++ ще по Страуструпу. Після того 1С був для мене як лєго. Зручно і швидко.
З 1997-го працював на промисловому підприємстві програмістом 1С. Готових конфігурацій тоді майже не було. Тим паче специфічних, наприклад економіки. Не було і Інтернету, то як зробиш так і буде не зробиш - розумієш що нафіг ти потрібен тоді.
В нульові застаріле підприємство закрилось. На 1С який вже тоді почав курвитися (v.8 і її стабільність) забив.
Став держслужбовцем, працював адміном. Попрацював з Windows Script Host. Теж зручно і швидко.
Потів війна і все. Інтелектуальна офіційна діяльність закінчилась. Не всі змогли переїхати. А жити в наметах взимку 2014-2015... Якщо ще є старенькі батьки, які якщо самі то ноги протягнуть, то тим паче. Зараз роботи немає. На бандюганів принципово не працюю.
Нещодавно вирішив згадати старе і повчив знов для себе C++, розібрався з MS VS 2019.
Пару місяців вистачило підтягнутись для нескладної роботи.
Написав клас роботи з ini-файлами. Спочатку на двомірному векторі, потім ще один на трьох-мірному. І ще три класи до нього для різник типів змінних (число/група/авто-нумерований блок), в основі string. Все написано в стилі з авто-переключанням мультібіт/юнікод (#ifdef _UNICODE).
То можна сказати, що це тепер хобі. Але то вже не я, якщо не почну шукати костилі. Про один з них, яким всі користуються і не замислюються планую на форумі написати.
В цілому програмування допомагає розвивати свідомість і тримати в активному стані. Без фанатизму це гарне хобі.
Маєш гарну стратегію може бути гарна тактика. Не робити непотрібні рухи це теж мистецтво.

З інтересів це прослуховування якісно справжньої музики, особливо класики, опери. Хоча маю багато і інших жанрів. Якось роки 2,5 качав музику кожен день навіть десятками альбоми і швидко вислухував. Втомився навіть. Накачав приблизно 8-9 тис. альбомів в lossless (класика окремо). З того всього залишив десь 10%. В тому що видалив музику не знайшов )). Чисті звуки, це ще не музика. Якось відкрив для себе арабську музику. Теж багато маю. Це великий світ. Останнім часом вона дуже спопсилася. Скоро всі будуть співати в загально-попсовому стилі але на своїх мовах. Національні колорити уходять.
Аудіофіл, але без філії в голові, а скоріше з аудіо-інженерним уклоном. Цією темою теж займався для себе. Перечитав багато і про звука-режисерську роботу. Маю преміальну апаратуру NAD, Focal, Beyerdynamic. Є думка написати на форумі про деякі речі на цю тему десь в загальному розділі.
Тим паче маю досвід завантаження голови і розвантаження її в кінці тижня. Так це проблема. Багато програмерів не вміють нормально відключатись від думок. Пересічні думають, що вони просто так розумно виглядають весь час. А вони просто задовбані і не переключені на відпочинок.
А музика як раз і допомагає переключатись в побутовий режим. Так, саме музика (а не бухло), але не будь яка і не будь як.
Не палю і не бухаю і іншим не раджу.

Якщо коротко то так.

11

(24 відповідей, залишених у Організація роботи форуму)

А це точно всі бачили? Там ще pdf і не тільки можна завантажити.