Показать Win32 всплывающее меню с иконками PNG из ресурсов - PullRequest
3 голосов
/ 28 марта 2012

Прошло много времени с тех пор, как я имел дело с меню Win32. Мне нужно добавить несколько значков PNG в контекстное меню Win32. Естественно, я хочу сохранить прозрачность PNG и всю альфа на пиксель в процессе. Возможно ли это?

Я думал об использовании SetMenuItemBitmaps. Это путь?

Я импортировал свои PNG как ресурсы "PNG", но я не могу загрузить их ни с LoadBitmap, ни с LoadImage. Я нашел некоторые предложения по использованию Gdi+, но, очевидно, я не буду рисовать меню - система будет.

Кажется, есть способ получить HBITMAP от Gdi + Bitmap, но похоже, что вся альфа теряется в процессе. AFAIK, HBITMAP может с радостью принимать альфа-информацию.

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Вам нужен GDI + для загрузки PNG.Затем вам нужно создать 32-битное альфа-изображение правильного размера, создать графику на растровом изображении и использовать DrawImage для копирования PNG в растровое изображение.Это дает вам растровое изображение с альфа-каналом.

Примерно так:

Image*  pimgSrc = Image::FromFile("MyIcon.png"L, FALSE);
Bitmap* pbmpImage = new Bitmap(
    iWidth, iHeight, 
    PixelFormat32bppARGB
);
Graphics* pgraphics = Graphics::FromImage(bmpImage))
{
    // This draws the PNG onto the bitmap, scaling it if necessary.
    // You may want to set the scaling quality 
    graphics->DrawImage(
        imageSrc,
        Rectangle(0,0, bmpImage.Width, bmpImage.Height),
        Rectangle(0,0, imgSrc.Width, imgSrc.Height),
        GraphicsUnitPixel
    );
}
// You can now get the HBITMAP from the Bitmap object and use it.
// Don't forget to delete the graphics, image and bitmap when done.
1 голос
/ 28 марта 2012

Возможно, вы могли бы вместо этого использовать иконку?

Вот мои причины использования значков вместо PNG:

  1. Win32 API имеет хорошие иконки поддержки, и рисовать иконки относительно проще, поскольку GDI + не требуется.
  2. Иконки также поддерживают 8-битную прозрачность (как PNG).
  3. Иконки могут быть любого размера в пикселях (как PNG).
  4. Значки могут быть легко встроены в исполняемый файл как ресурс.
  5. Значки можно редактировать с помощью Visual Studio.

Чтобы загрузить значок из ресурса или файла, используйте:

LoadImage()

Чтобы нарисовать иконку, используйте:

DrawIcon() or DrawIconEx()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...