【问题标题】:How do you draw an icon inside a window in C++ WINAPI?如何在 C++ WINAPI 中的窗口内绘制图标?
【发布时间】:2016-02-06 12:46:06
【问题描述】:

我想做的是通过 WINAPI 在 C++ 中创建国际象棋游戏,由于我从未在学校学习过它们,所以我遇到了一些问题(在线文档非常糟糕,我无法找到如何做到这一点的任何示例)在我的窗口内打印具有透明度的 .ico 文件。我已经设法用位图图像来做到这一点,但我的 Photoshop 不允许我保存带有 alpha 通道的 .bmp 文件,我必须使用 WINAPI 支持并允许透明度的东西(因此是 .ico)。

我的问题是,如何在我的窗口中绘制一个透明的 .ico 文件?

谢谢!

【问题讨论】:

  • @Jonathan Potter 你能举个例子吗?我已经找到了该功能,但无法弄清楚它是如何工作的。谢谢!
  • 你知道怎么画棋盘吗?如果您设法做到这一点,那么您就会知道设备上下文是什么。在您的情况下,为了响应 WM_PAINT,您必须使用函数 DrawIconEx。您只需将您从 BeginPaint 获得的 HDC 传递给它,并协调您想要放置图标的位置。
  • @AlwaysLearningNewStuff:是的,我已经画好了我的棋盘,问题是放置所有的棋子。我得到的实际解决方案很糟糕,我必须为白色和黑色位置的所有部分获取位图,而且我不知道如何在不显示这些东西的情况下为它们设置动画,所以我想制作一个透明的背景图像,但是画不出来!

标签: winapi icons transparency draw alpha


【解决方案1】:

我知道怎么做,我会发布代码:

hIcon = (HICON) LoadImage( // returns a HANDLE so we have to cast to HICON
      NULL,             // hInstance must be NULL when loading from a file
    "favicon.ico",   // the icon file name
    IMAGE_ICON,       // specifies that the file is an icon
    0,                // width of the image (we'll specify default later on)
    0,                // height of the image
    LR_LOADFROMFILE|  // we want to load a file (as opposed to a resource)
    LR_DEFAULTSIZE|   // default metrics based on the type (IMAGE_ICON, 32x32)
    LR_SHARED         // let the system release the handle when it's no longer used
    );

    DrawIconEx( hdc, 100, 200,hIcon, 72, 78, 0, NULL, DI_NORMAL);

但现在我遇到了另一个问题:我的图标超过了 32x32 的两倍(它是 72x78),而且我的图片出现了锯齿。有没有办法解决这个问题? 谢谢!

【讨论】:

  • 试试ExtractIconEx而不是LoadImage
  • @milevyo:我会尽快尝试并通知您,提前谢谢!
  • @milevyo:这并没有完全消除锯齿,但仍然比以前更好。谢谢!
  • 同一个图标文件中可能有多个图标,系统会选择 32x32 图标。您可以指定宽度/高度,删除LR_DEFAULTSIZE 等。此外,您必须在DrawIconEx 之后调用DestroyIcon,否则会导致资源泄漏。要么在堆上创建HICON,以便它只创建一次。
  • @BarmakShemirani:非常有用的答案,这正是我需要的,你让我度过了愉快的一天!谢谢!
【解决方案2】:

如果您使用资源文件 (resource.rc) 中的图标,您可以使用 LoadIcon 加载图标,然后获取对话框窗口的设备内容,然后使用 DrawIconEx 将其绘制到您想要的任何位置,例如 (x,y) = (10,10)

 HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCEA(IDI_ICON)); // Load Icon from resource file
 HDC hDcDlg = GetDC(hwndDlg); // get device context of the Dialog Window by using its handle
 DrawIconEx (hDcDlg , 10, 10, hIcon, 0, 0, 0, NULL, DI_NORMAL); // draw it

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多