Как сделать курсор с альфа-каналом, как, например, курсор wait в 7-ке? Пробовал 32-битные картинки использовать в качестве XOR-битмапы — обрезается ровно по точкам, в который альфа — ноль, т.е. антиалайзинг отсутсвует
Здравствуйте, CEMb, Вы писали:
CEM>Как сделать курсор с альфа-каналом, как, например, курсор wait в 7-ке? Пробовал 32-битные картинки использовать в качестве XOR-битмапы — обрезается ровно по точкам, в который альфа — ноль, т.е. антиалайзинг отсутсвует
Вроде бы в 32-битных иконках/курсорах для маски используется только альфа-канал самого изображения, xor-битмап только для совместимости и (возможно, я не проверял,) для режимов монитора 24 бита и ниже. Т.е. теоретически из 32-битного битмапа должна получится иконка/курсор с альфой.
Здравствуйте, Aniskin, Вы писали:
A>Здравствуйте, Aniskin, Вы писали:
A>>Т.е. теоретически из 32-битного битмапа должна получится иконка/курсор с альфой.
A>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.
Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается
Здравствуйте, CEMb, Вы писали:
A>>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.
CEM>Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается
Попробуй передать 32-битный битмап и 1-битную маску.
Здравствуйте, Aniskin, Вы писали:
A>>>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.
CEM>>Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается
A>Попробуй передать 32-битный битмап и 1-битную маску.
Ой, блин, моя ошибка, у меня у XOR-32 картинки "нечайно" точки, кто под маску попадал, получали 0xff в прозрачность. Если в двух словах: сливалось несколько картинок, надо было правильно слить альфа-канал, вот я и ошибся в этом месте...
А так работает всё, и 1-битные и 32-битные, всё ок
Здравствуйте, CEMb, Вы писали:
CEM>Здравствуйте, Aniskin, Вы писали:
A>>>>Т.е. в CreateIconIndirect передаем 32-битный битмап с альфой + 1-битную маску.
CEM>>>Ага, именно эта функция и 32-битный битмап передаю, а вот маска (and) у меня 32-битная тоже (чтоб с длиной строки не париться, ибо динамические размеры) в результате не получается
A>>Попробуй передать 32-битный битмап и 1-битную маску.
CEM>Ой, блин, моя ошибка, у меня у XOR-32 картинки "нечайно" точки, кто под маску попадал, получали 0xff в прозрачность. Если в двух словах: сливалось несколько картинок, надо было правильно слить альфа-канал, вот я и ошибся в этом месте...
CEM>А так работает всё, и 1-битные и 32-битные, всё ок
Код в студию плиз, хотелось бы очень взглянуть...
Здравствуйте, 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);