Опять курсоры
От: CEMb  
Дата: 04.10.11 16:49
Оценка:
Как сделать курсор с альфа-каналом, как, например, курсор wait в 7-ке? Пробовал 32-битные картинки использовать в качестве XOR-битмапы — обрезается ровно по точкам, в который альфа — ноль, т.е. антиалайзинг отсутсвует
Re: Опять курсоры
От: Aniskin  
Дата: 04.10.11 18:55
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Как сделать курсор с альфа-каналом, как, например, курсор wait в 7-ке? Пробовал 32-битные картинки использовать в качестве XOR-битмапы — обрезается ровно по точкам, в который альфа — ноль, т.е. антиалайзинг отсутсвует


Вроде бы в 32-битных иконках/курсорах для маски используется только альфа-канал самого изображения, xor-битмап только для совместимости и (возможно, я не проверял,) для режимов монитора 24 бита и ниже. Т.е. теоретически из 32-битного битмапа должна получится иконка/курсор с альфой.
Re[2]: Опять курсоры
От: Aniskin  
Дата: 04.10.11 21:48
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Т.е. теоретически из 32-битного битмапа должна получится иконка/курсор с альфой.


Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.
Re[3]: Опять курсоры
От: CEMb  
Дата: 05.10.11 01:59
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Здравствуйте, Aniskin, Вы писали:


A>>Т.е. теоретически из 32-битного битмапа должна получится иконка/курсор с альфой.


A>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.


Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается
Re[4]: Опять курсоры
От: Aniskin  
Дата: 05.10.11 04:49
Оценка:
Здравствуйте, CEMb, Вы писали:

A>>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.


CEM>Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается


Попробуй передать 32-битный битмап и 1-битную маску.
Re[5]: Опять курсоры
От: CEMb  
Дата: 05.10.11 07:57
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>>>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.


CEM>>Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается


A>Попробуй передать 32-битный битмап и 1-битную маску.


Ой, блин, моя ошибка, у меня у XOR-32 картинки "нечайно" точки, кто под маску попадал, получали 0xff в прозрачность. Если в двух словах: сливалось несколько картинок, надо было правильно слить альфа-канал, вот я и ошибся в этом месте...

А так работает всё, и 1-битные и 32-битные, всё ок
Re[6]: Опять курсоры
От: Carc Россия http://www.amlpages.com/home.php
Дата: 05.10.11 10:21
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Здравствуйте, Aniskin, Вы писали:


A>>>>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.


CEM>>>Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается


A>>Попробуй передать 32-битный битмап и 1-битную маску.


CEM>Ой, блин, моя ошибка, у меня у XOR-32 картинки "нечайно" точки, кто под маску попадал, получали 0xff в прозрачность. Если в двух словах: сливалось несколько картинок, надо было правильно слить альфа-канал, вот я и ошибся в этом месте...


CEM>А так работает всё, и 1-битные и 32-битные, всё ок

Код в студию плиз, хотелось бы очень взглянуть...
Aml Pages Home
Re[7]: Опять курсоры
От: CEMb  
Дата: 05.10.11 17:17
Оценка: 12 (1)
Здравствуйте, Carc, Вы писали:

CEM>>А так работает всё, и 1-битные и 32-битные, всё ок

C>Код в студию плиз, хотелось бы очень взглянуть...

Тестил, примерно, так (1 бит):

    BYTE *pbtAnd = new BYTE[32*32/8];
    memset(pbtAnd, 0x0f, 32*32/8);  // полосочки, в 32 бита не работают, только если снизу 32 на 24 поменять
    BITMAP bmAnd;
    memset(&bmAnd, 0, sizeof BITMAP);
    bmAnd.bmType  = 0;
    bmAnd.bmWidth = 32;
    bmAnd.bmHeight = 32;
    bmAnd.bmWidthBytes = 32/8;
    bmAnd.bmPlanes = 1;
    bmAnd.bmBitsPixel = 1;
    bmAnd.bmBits = pbtAnd;
    HBITMAP hBmpAnd = CreateBitmapIndirect(&bmAnd);


    BYTE *pbtXor = new BYTE[32*32 *4];
    memset(pbtXor, 0xaa, 32*32 *4);  // серый цвет и прозрачность в одном флаконе
    BITMAP bmXor;
    memset(&bmXor, 0, sizeof BITMAP);
    bmXor.bmType  = 0;
    bmXor.bmWidth = 32;
    bmXor.bmHeight = 32;
    bmXor.bmWidthBytes = 32 *4;
    bmXor.bmPlanes = 1;
    bmXor.bmBitsPixel = 32;
    bmXor.bmBits = pbtXor;
    HBITMAP hBmpXor = CreateBitmapIndirect(&bmXor);

    ICONINFO iconinfo = {0};
    iconinfo.fIcon        = FALSE;
    iconinfo.xHotspot       = 16;
    iconinfo.yHotspot       = 16;
    iconinfo.hbmMask        = hAndMaskBitmap;
    iconinfo.hbmColor       = hXorMaskBitmap;

    m_hCursor  = ::CreateIconIndirect(&iconinfo);

    delete[] pbtAnd;
    delete[] pbtXor;
    DeleteObject(hBmpAnd);
    DeleteObject(hBmpXor);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.