昨天我发过一个帖子,是同样的问题,我以为自己已经解决了,但是今天下课回来调程序发现问题并没有解决。昨天想在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到底是从哪儿来的呢?

解决方案 »

  1.   


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

  2.   

    首先先谢谢你能回答我的问题,不过因为我后面还需要DrawIcon这个函数将ICon画到窗口中,所以不能换做位图,我还是想知道这个问题到底是哪儿出错了,假如用ICon的话,怎么解决。
      

  3.   

    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);
    }
      

  4.   

    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);
    }
      

  5.   

    失误写错了:pcbmp = CBitmap::FromHandle(GreenIconInfo.hbmMask);楼上跟这个是一样的,你自己看清楚。