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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView, ImageList, Icons 16-bit 
:(
    Опции темы
Alca
Дата 4.2.2013, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Сама функция. Все эти скрины сделаны при 16 битном цвете.

Битмап так загружаю
Код

HBITMAP load_bitmap(UINT id)
{
    HBITMAP hbitmap = NULL;

    hbitmap = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(id),
            IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION |
            LR_LOADTRANSPARENT | LR_SHARED);
    if (!hbitmap) {
        logf_err("LoadImage failed with %ld\n", GetLastError());
        return NULL;
    }

    return pre_multiple_rgb(hbitmap, 32);
}


Это сообщение отредактировал(а) Alca - 4.2.2013, 23:02

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  function.c 4,66 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 5.2.2013, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Alca, можете дать ваш тестовый проект, чтобы мне не катать сначала?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 5.2.2013, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

тестовый проект

Попробую его для начала сделать


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 5.2.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Alca, а так не пробовали:
Цитата

Create a bitmap with the desired color depth as the destination bitmap and copy the original image to it.

Взято отсюда: How to convert a bmp of 32bppargb to a bmp of 16bpp.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 5.2.2013, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Попробую его для начала сделать

fail

Добавлено через 1 минуту и 47 секунд
Цитата

Create a bitmap with the desired color depth as the destination bitmap and copy the original image to it.

А где там код?


--------------------
PM WWW ICQ Skype Jabber   Вверх
GremlinProg
Дата 5.2.2013, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alca @  5.2.2013,  19:18 Найти цитируемый пост)
А где там код?

А зачем он тебе? Просто загрузи 16-битный растр и скопируй его через BitBlt в 32-битный


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
artsb
Дата 5.2.2013, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(GremlinProg @  5.2.2013,  17:24 Найти цитируемый пост)
А зачем он тебе? Просто загрузи 16-битный растр и скопируй его через BitBlt в 32-битный 

ИМХО, наоборот smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 5.2.2013, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



http://www.dreamincode.net/forums/topic/28...ent-in-c-win32/

Код

HBITMAP MakeBitMapTransparent(HBITMAP hbmSrc)
{
    HDC hdcSrc, hdcDst;
    HBITMAP hbmOld, hbmNew;
    BITMAP bm;
    COLORREF clrTP, clrBK;

    if ((hdcSrc = CreateCompatibleDC(NULL)) != NULL) {
        if ((hdcDst = CreateCompatibleDC(NULL)) != NULL) {
            int nRow, nCol;
            GetObject(hbmSrc, sizeof(bm), &bm);
            hbmOld = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
            hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
            SelectObject(hdcDst, hbmNew);

                                
            BitBlt(hdcDst,0,0,bm.bmWidth, bm.bmHeight,hdcSrc,0,0,SRCCOPY);

            clrTP = GetPixel(hdcDst, 0, 0);// Get color of first pixel at 0,0
            clrBK = GetSysColor(COLOR_MENU);// Get the current background color of the menu

            for (nRow = 0; nRow < bm.bmHeight; nRow++)// work our way through all the pixels changing their color
                for (nCol = 0; nCol < bm.bmWidth; nCol++)// when we hit our set transparency color.
                    if (GetPixel(hdcDst, nCol, nRow) == clrTP)
                        SetPixel(hdcDst, nCol, nRow, clrBK);

            DeleteDC(hdcDst);
        }
        DeleteDC(hdcSrc);

    }
    return hbmNew;// return our transformed bitmap.
}



так??

Это сообщение отредактировал(а) Alca - 6.2.2013, 23:48


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 5.2.2013, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



По идее, так:
Код

HBITMAP MakeBitMapTransparent(HBITMAP hbmSrc)
{
    HDC hdcSrc, hdcDst;
    HBITMAP hbmOldSrc, hbmOldDst, hbmNew;
    BITMAP bm;

    if ((hdcSrc = CreateCompatibleDC(NULL)) != NULL) {
        if ((hdcDst = CreateCompatibleDC(NULL)) != NULL) {
            GetObject(hbmSrc, sizeof(bm), &bm);
            hbmOldSrc = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
            hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, 8, NULL);
            hbmOldDst = (HBITMAP)SelectObject(hdcDst, hbmNew);
                                
            BitBlt(hdcDst,0,0,bm.bmWidth, bm.bmHeight,hdcSrc,0,0,SRCCOPY);

            SelectObject(hdcDst, hbmOldDst);
            DeleteDC(hdcDst);
            SelectObject(hdcSrc, hbmOldSrc);
        }
        DeleteDC(hdcSrc);
    }
    return hbmNew;// return our transformed bitmap.
}


Добавлено через 5 минут и 59 секунд
А! Понял смысл вашего перебора. По сути, да, у вас правильно. Только не забывайте восстанавливать старые битмапы. И, наверное, не стоит брать левый верхний пиксел, как цвет прозрачности. Проверяйте именно альфа-канал: если он равен 0, то заменяйте этот пиксел на свой цвет прозрачности, иначе - ничего не делайте. Но как мне кажется, лучше эту операцию проделать с исходным изображением ещё до BitBlt().


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 5.2.2013, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Только вот так:
Код

hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, 8, NULL);



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 5.2.2013, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



да какая-то лажа с этой прозрачностью в 16 битном цвете  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 6.2.2013, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Попробую протестить. А что конкретно не так?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 6.2.2013, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Попробую протестить. А что конкретно не так?

http://forum.vingrad.ru/index.php?showtopi...t&p=2546325


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 6.2.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Желающим могу дать доступ через Team Viewer, в личку

Это сообщение отредактировал(а) Alca - 6.2.2013, 13:51


--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 6.2.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



А если так:
Код

HBITMAP MakeBitMapTransparent(HBITMAP hbmSrc)
{
    HDC hdcSrc, hdcDst, dcScreen;
    HBITMAP hbmOldSrc, hbmOldDst, hbmNew = NULL;
    BITMAP bm;
    COLORREF clrTP, clrBK;

    dcScreen = GetDC(GetDesktopWindow());

    if ((hdcSrc = CreateCompatibleDC(dcScreen)) != NULL)
    {
        if ((hdcDst = CreateCompatibleDC(dcScreen)) != NULL)
        {
            int nRow, nCol;
            GetObject(hbmSrc, sizeof(bm), &bm);

            hbmOldSrc = (HBITMAP)SelectObject(hdcSrc, hbmSrc);
//            hbmNew = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
            hbmNew = CreateCompatibleBitmap(dcScreen, bm.bmWidth, bm.bmHeight);

            if(hbmNew != NULL)
            {
                hbmOldDst = (HBITMAP)SelectObject(hdcDst, hbmNew);

                BitBlt(hdcDst,0,0,bm.bmWidth, bm.bmHeight,hdcSrc,0,0,SRCCOPY);

                clrTP = GetPixel(hdcDst, 0, 0);// Get color of first pixel at 0,0
                clrBK = GetSysColor(COLOR_MENU);// Get the current background color of the menu
                for (nRow = 0; nRow < bm.bmHeight; nRow++)// work our way through all the pixels changing their color
                {
                    for (nCol = 0; nCol < bm.bmWidth; nCol++)// when we hit our set transparency color.
                    {
                        if (GetPixel(hdcDst, nCol, nRow) == clrTP)
                        {
                            SetPixel(hdcDst, nCol, nRow, clrBK);
                        }
                    }
                }

                SelectObject(hdcDst, hbmOldDst);
                DeleteDC(hdcDst);
            }

            SelectObject(hdcSrc, hbmOldSrc);
        }
        DeleteDC(hdcSrc);
    }
    return hbmNew;// return our transformed bitmap.
}



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

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


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

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


 




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


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

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