关于VS2010中读取ICON尺寸的问题

wananwen 2012-09-03 07:31:16
昨天我发过一个帖子,是同样的问题,我以为自己已经解决了,但是今天下课回来调程序发现问题并没有解决。

昨天想在VS2010中创建一个16x16的ICon,但是无论创建的是16x16的还是32x32或则是其他的,载入程序后读取的尺寸都是一样的,代码如下

HICON hGreenIcon = AfxGetApp()->LoadIcon(IDI_Green_Icon);//IDI_Green_Icon是创建的ICon的ID
ICONINFO GreenIconInfo;
GetIconInfo(hGreenIcon, &GreenIconInfo);
CString str;
str.Format(_T("x = %d, y = %d"),GreenIconInfo.xHotspot, GreenIconInfo.yHotspot);
MessageBox(str);

无论是创建多少尺寸的ICon,读取的结果都是x = 20, y = 20;
为什么呢,这个20到底是从哪儿来的呢?
...全文
380 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
壹瓶子不满 2015-03-18
  • 打赏
  • 举报
回复
我也遇到这个问题 我的是16*16的 显示是32*32的 不知道怎么回事 好几天了没解决呢
wananwen 2012-09-04
  • 打赏
  • 举报
回复
谢谢两位的回答,是我没看清代码
「已注销」 2012-09-04
  • 打赏
  • 举报
回复
失误写错了:
pcbmp = CBitmap::FromHandle(GreenIconInfo.hbmMask);
楼上跟这个是一样的,你自己看清楚。
Eleven 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
首先先谢谢你能回答我的问题,不过因为我后面还需要DrawIcon这个函数将ICon画到窗口中,所以不能换做位图,我还是想知道这个问题到底是哪儿出错了,假如用ICon的话,怎么解决。
[/Quote]
没有换位图,你要认真看上面的代码~
「已注销」 2012-09-04
  • 打赏
  • 举报
回复
ICONINFO 中的 xHotspot、yHotspot 指光标文件(.cur)的热点,如果你传递的是图标,那么这个取这个值是没意义的。LoadIcon 加载的是系统默认的标准图标尺寸(GetSystemMetrics 传递 SM_CXICON 和 SM_CYICON 可以取得),在 96 DPI 下是 32 像素。如果你需要加载 16 像素的图标,用 LoadImage 函数即可。不需要两个图标,只要一个图标文件含有不同尺寸,它就可以加载。
HICON hGreenIcon = ::LoadImage(AfxGetInstanceHandle(), (LPTSTR)IDI_Green_Icon, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
HICON hGreenIconSm = ::LoadImage(AfxGetInstanceHandle(), (LPTSTR)IDI_Green_Icon, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);

如果你只是想取得图标句柄所代表的图标的大小,可以这样:
CBitmap *pcbmp;
BITMAP bitmap;
CString str;
ICONINFO GreenIconInfo;
GetIconInfo(hGreenIcon, &GreenIconInfo);
pcbmp = FromHandle(GreenIconInfo.hbmMask);
if (pcbmp->GetBitmap(&bitmap)) {
str.Format(_T("x = %d, y = %d"), bitmap.bmWidth, bitmap.bmHeight);
MessageBox(str);
}
「已注销」 2012-09-04
  • 打赏
  • 举报
回复
ICONINFO 中的 xHotspot、yHotspot 指光标文件(.cur)的热点,如果你传递的是图标,那么这个取这个值是没意义的。LoadIcon 加载的是系统默认的标准图标尺寸(GetSystemMetrics 传递 SM_CXICON 和 SM_CYICON 可以取得),在 96 DPI 下是 32 像素。如果你需要加载 16 像素的图标,用 LoadImage 函数即可。不需要两个图标,只要一个图标文件含有不同尺寸,它就可以加载。
HICON hGreenIcon = ::LoadImage(AfxGetInstanceHandle(), (LPTSTR)IDI_Green_Icon, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
HICON hGreenIconSm = ::LoadImage(AfxGetInstanceHandle(), (LPTSTR)IDI_Green_Icon, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);

如果你只是想取得图标句柄所代表的图标的大小,可以这样:
CBitmap *pcbmp;
BITMAP bitmap;
CString str;
ICONINFO GreenIconInfo;
GetIconInfo(hGreenIcon, &GreenIconInfo);
pcbmp = FromHandle(GreenIconInfo.hbmMask);
if (pcbmp->GetBitmap(&bitmap)) {
str.Format(_T("x = %d, y = %d"), bitmap.bmWidth, bitmap.bmHeight);
MessageBox(str);
}
wananwen 2012-09-03
  • 打赏
  • 举报
回复
首先先谢谢你能回答我的问题,不过因为我后面还需要DrawIcon这个函数将ICon画到窗口中,所以不能换做位图,我还是想知道这个问题到底是哪儿出错了,假如用ICon的话,怎么解决。
Eleven 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
昨天我发过一个帖子,是同样的问题,我以为自己已经解决了,但是今天下课回来调程序发现问题并没有解决。

昨天想在VS2010中创建一个16x16的ICon,但是无论创建的是16x16的还是32x32或则是其他的,载入程序后读取的尺寸都是一样的,代码如下

HICON hGreenIcon = AfxGetApp()->LoadIcon(IDI_Green……
[/Quote]

HBITMAP hBitmap = GreenIconInfo.hbmMask;
BITMAP bmp;
GetObject(hBitmap, sizeof(bmp), &bmp);
CString str;
str.Format(_T("%d, %d"), bmp.bmWidth, bmp.bmHeight);
AfxMessageBox(str);

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧