找回密码
 加入
搜索
查看: 4444|回复: 8

[GUI管理] 求助高手帮忙能否将一小段VC转成AU3

  [复制链接]
发表于 2010-6-22 03:25:49 | 显示全部楼层 |阅读模式
本帖最后由 破帽遮颜 于 2010-6-22 19:08 编辑

BOOL CJPGRES2BMPView::JpgRes2Bmp(UINT ResourceName, LPCSTR ResourceType, HBITMAP *lphBmp)
{
    HGLOBAL        hGlobal = NULL;
    HRSRC        hSource = NULL;
    LPVOID        lpVoid  = NULL;
    int            nSize   = 0;

    IPicture* p_IPicture = NULL;
    OLE_HANDLE hJpegBmp = 0;
   

    // 1. 从资源中读取JPG文件数据
    hSource = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(ResourceName), ResourceType);
    if(hSource == NULL)
    {
        return(FALSE);
    }
   
    hGlobal = LoadResource(AfxGetResourceHandle(), hSource);
    if(hGlobal == NULL)
    {
        return(FALSE);
    }
   
    lpVoid = LockResource(hGlobal);
    if(lpVoid == NULL)
    {
        return(FALSE);
    }
   
    nSize = (UINT)SizeofResource(AfxGetResourceHandle(), hSource);

    // 2. 分配内存并拷贝数据
    HGLOBAL hGlobalMem = GlobalAlloc(GMEM_MOVEABLE, nSize);
    if(hGlobalMem == NULL)
    {
        return(FALSE);
    }
   
    void* pData = GlobalLock(hGlobalMem);
    memcpy(pData, (BYTE*)hGlobal, nSize);
    GlobalUnlock(hGlobalMem);
   

    // 3. 创建Stream
    IStream* pStream = NULL;
    if(CreateStreamOnHGlobal(hGlobalMem, TRUE, &pStream) == S_OK)
    {
        HRESULT hr;
        if(E_NOINTERFACE == (hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&p_IPicture)))
        {
            return(FALSE);
        }
        else // S_OK
        {
            pStream->Release();
            pStream = NULL;
        }
    }
   
    // MSDN:not necessary for Win32-based applications
    UnlockResource(hGlobal);
    FreeResource(hGlobal);
    FreeResource(hGlobalMem);

    // 4.得到图像句柄,拷贝
    if(p_IPicture != NULL)
    {
        // Get the handle to the image, and then copy it.
        if((p_IPicture->get_Handle(&hJpegBmp)) != S_OK)
        {
            p_IPicture->Release();
            p_IPicture = NULL;
            *lphBmp = 0;
            return(FALSE);
        }
        
        if((*lphBmp = (HBITMAP)CopyImage((HANDLE *) hJpegBmp, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)) == NULL)
        {
            p_IPicture->Release();
            p_IPicture = NULL;
            *lphBmp = 0;
            return(FALSE);
        }
        
        p_IPicture->Release();
        p_IPicture = NULL;

        return(TRUE);
    }
    else
    {
        p_IPicture->Release();
        p_IPicture = NULL;
        return(FALSE);
    }

}
发表于 2010-6-22 03:27:55 | 显示全部楼层
看过了,不会弄,在OleLoadPicture那里测试失败了。
发表于 2010-6-22 03:29:43 | 显示全部楼层
这回帖速度
 楼主| 发表于 2010-6-22 03:39:27 | 显示全部楼层
看过了,不会弄,在OleLoadPicture那里测试失败了。
pusofalse 发表于 2010-6-22 03:27



5555555~~~~~
实在找不到办法了~~~~~
发表于 2010-6-22 08:53:56 | 显示全部楼层
VC转AU3总是比较困难

AU3实现这个是否可以用别的途径来实现上面的要求?没写过这种代码,不清楚,不过我下面的思路是否可行?

1、用AU3自行读取资源文件的JPG数据
2、将JPG数据放入内存,返回内存中数据的起启位置
3、如何将内存的起启位置转成位图句柄?(没有思路)
发表于 2010-6-22 09:34:04 | 显示全部楼层
这是干哈呢,有哈用呢
 楼主| 发表于 2010-6-22 09:34:38 | 显示全部楼层
VC转AU3总是比较困难

AU3实现这个是否可以用别的途径来实现上面的要求?没写过这种代码,不清楚,不过我 ...
C.L 发表于 2010-6-22 08:53


这样能不能成功呢
将jpg或者png在内存中转为位图,再读取位图句柄?
这样避免了将jpg转成bmp位图临时文件再进行读取的繁琐。不需要产生垃圾文件。
但如果图片多的情况下,会不会产生占用内存多的问题?
发表于 2010-6-22 10:35:48 | 显示全部楼层
回复 7# 破帽遮颜

这样能不能成功呢
将jpg或者png在内存中转为位图,再读取位图句柄?
这样避免了将jpg转成bmp位图临时文件再进行读取的繁琐。不需要产生垃圾文件。
但如果图片多的情况下,会不会产生占用内存多的问题?


在内存中转换应该是可行,不过应该要自行处理将JPG头转换成BMP位图头,这个操作可是有点繁杂
如果图片多,占用内存肯定会很多。
 楼主| 发表于 2010-6-22 10:41:10 | 显示全部楼层
回复 8# C.L

希望各位大大帮忙解决!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 21:41 , Processed in 0.075715 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表