登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

win32 IPicture例子  

2009-12-18 10:12:37|  分类: DC|Gdi|Gdi+ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#include <windows.h>  // Windows SDK 要用到的  
#include <commdlg.h>  // 打开文件的窗口要包含这个头文件  
 
//用到了 IPicture 接口,要包含下面两个 头文件  
#include <ocidl.h>   
#include <olectl.h>   
 
// 声明窗口函数的原型  
LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM);  
 
// 声明显示图片的函数原型  
HRESULT ShowPic(char *lpstrFile,HWND hWnd) ;  
 
//图片文件名  
char lpstrFile[MAX_PATH]="";  
 
 
int WINAPI WinMain (HINSTANCE hThisInstance,  
                    HINSTANCE hPrevInstance,  
                    LPSTR lpszArgument,  
                    int nFunsterStil)  
                      
{  
    // 窗口类名  
    char szClassName[ ] = "ShowPicture";  
      
    WNDCLASSEX windclass;  
      
    //用描述主窗口的参数填充 WNDCLASSEX 结构  
    windclass.cbSize = sizeof(windclass);  //结构大小  
    windclass.hInstance = hThisInstance;   //实例句酚  
    windclass.lpszClassName = szClassName;  
    windclass.lpfnWndProc = MainWndProc;   //窗口函数指针  
    windclass.style = CS_DBLCLKS;          //捕获双击事件  
    windclass.cbSize = sizeof (WNDCLASSEX);  
      
    windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //使用预定义图标  
    windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //使用预定义类的小图标  
    windclass.hCursor = LoadCursor (NULL, IDC_ARROW); //使用预定义光标  
    windclass.lpszMenuName = NULL;                 //不指定主菜单  
    windclass.cbClsExtra = 0;                      //没有额外的类内存  
    windclass.cbWndExtra = 0;                      //没有额外的窗口内存  
      
    windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND; //使用预定义背景画刷  
      
    //注册这个窗口类,如果失败直接退出程序   
    if (!RegisterClassEx (&windclass))  
        return 0;  
      
    //创建主窗口  
    HWND hWnd = CreateWindowEx (  
        0,                   //dwExStyle, 扩展样式  
        szClassName,         //lpClassName, 类名  
        "显示图片 -- 鼠标双击浏览图片文件      -- Author:Unmi", //lpWindowName, 标题  
        WS_OVERLAPPEDWINDOW, //dwStyle, 窗口风格  
        CW_USEDEFAULT,       //X, 初始 X 坐标  
        CW_USEDEFAULT,       //Y, 初始 YX 坐标  
        640,                 //nWidth, 宽度  
        480,                 //nHeight, 高度  
        HWND_DESKTOP,        //hWndParent, 父窗口句柄  
        NULL,                //hMenu, 菜单句柄  
        hThisInstance,       //hInstance, 程序实例句柄  
        NULL                 //lpParam, 用户数据  
        );  
      
    //显示窗口,刷新窗口客户区  
    ShowWindow (hWnd, nFunsterStil);  
      
    // 从消息队列中取出消息,交给窗口函数处理  
    // 直到 GetMessage 取出的消息是 WM_QUIT,即FALSE,则结束消息循环  
    MSG messages;      
    while (GetMessage (&messages, NULL, 0, 0))  
    {  
        //转换键盘消息,把虚拟键转换为字符消息  
        TranslateMessage(&messages);  
          
        //将消息发送到相应的窗口函数  
        DispatchMessage(&messages);  
    }  
      
    // GetMessage 返回 FALSE,程序结束 PostQuitMessage() 发出这一消息  
    return messages.wParam;  
}  
 
 
// 窗口函数,消息由 DispatchMessage 派发  
LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  
{  
    switch (message) //处理消息  
    {  
    case WM_DESTROY:  
        //向消息队列投递一个 WM_QUIT 消息,促使 GetMessage 函数返回0,结束消息循环  
        PostQuitMessage (0);  
        break;  
    case WM_LBUTTONDBLCLK:  
        {  
            OPENFILENAME file = {0};  
            file.lStructSize = sizeof(file);  
            file.lpstrTitle = "请选择一个图片文件";  
            file.lpstrFile = lpstrFile;  
            file.nMaxFile = MAX_PATH;  
            file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)\0*.jpg;*.gif;*.bmp\0\0";  
            if(::GetOpenFileName(&file))  
            {         
                //清除原来的图像  
                HDC hdc=GetDC(hWnd);   
                RECT rect;  
                ::GetWindowRect(hWnd,&rect);  
                ::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND);  
                  
                ::SendMessage(hWnd,WM_PAINT,NULL,NULL);  
            }  
        }  
        break;  
    case WM_PAINT:  
        ShowPic(lpstrFile,hWnd);  
        break;  
    default:  
          
        //将我们不处理的消息交给系统 做默认处理  
        return DefWindowProc (hWnd, message, wParam, lParam);  
    }  
      
    return 0;  
}  
 
// 显示图片,此文的重点之所在了, lpstrFile 为图片文件名,hWnd 为窗口句柄  
HRESULT ShowPic(char *lpstrFile,HWND hWnd)   
{   
    HDC hDC_Temp=GetDC(hWnd);   
      
    IPicture *pPic;   
    IStream *pStm;   
      
    BOOL bResult;   
      
    HANDLE hFile=NULL;   
    DWORD dwFileSize,dwByteRead;   
      
    //打开图形文件   
    hFile=CreateFile(lpstrFile,GENERIC_READ,   
        FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);   
      
    if (hFile!=INVALID_HANDLE_VALUE)   
    {   
        dwFileSize=GetFileSize(hFile,NULL);//获取文件字节数   
          
        if (dwFileSize==0xFFFFFFFF)   
            return E_FAIL;   
    }   
    else   
    {   
        return E_FAIL;   
    }   
      
      
    //分配全局存储空间   
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);   
    LPVOID pvData = NULL;   
      
    if (hGlobal == NULL)   
        return E_FAIL;   
      
    if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块   
        return E_FAIL;   
      
    ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区   
      
    GlobalUnlock(hGlobal);   
      
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);   
      
    //装入图形文件   
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);   
      
    if(FAILED(bResult))   
        return E_FAIL;   
      
    OLE_XSIZE_HIMETRIC hmWidth; //图片的真实宽度, 单位为英寸  
    OLE_YSIZE_HIMETRIC hmHeight; //图片的真实高度, 单位为英寸  
    pPic->get_Width(&hmWidth);   
    pPic->get_Height(&hmHeight);   
      
    //转换hmWidth和hmHeight为pixels距离,1英寸=25.4毫米  
    int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);  
    int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);  
      
    //将图形输出到屏幕上(有点像BitBlt)   
    bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,   
        0,hmHeight,hmWidth,-hmHeight,NULL);   
      
    pPic->Release();   
      
    CloseHandle(hFile);//关闭打开的文件   
      
    if (SUCCEEDED(bResult))   
    {   
        return S_OK;   
    }   
    else   
    {   
        return E_FAIL;   
    }   

  评论这张
 
阅读(1318)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018