原创 【转】VC++显示JPG

2011-9-12 15:04 2431 6 6 分类: 软件与OS

一、创建对话框应用程序“显示JPG图像”

二、添加对话框资源并编辑之

0952a89a7ab672f3c8eaf45f.jpg



三、添加变量、函数

       1、添加变量

public:
     CEdit m_dir;

public:
    IPicture *m_picture;
     OLE_XSIZE_HIMETRIC m_width;
    OLE_YSIZE_HIMETRIC m_height;
     BOOL m_IsShow;

e88c89cf4b5efc7fb700c85f.jpg

9766a6f2bb0ac016342acc5f.jpg

      2、添加函数

1be17551b6a7ef1a1138c25f.jpg

144c5a5d95b57a05faf2c05f.jpg

四、添加代码(红色部分)

void CCShowDlg::OnPaint() 
{
if (IsIconic())
{
   CPaintDC dc(this); // device context for painting

   SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

   // Center icon in client rectangle
   int cxIcon = GetSystemMetrics(SM_CXICON);
   int cyIcon = GetSystemMetrics(SM_CYICON);
   CRect rect;
   GetClientRect(&rect);
   int x = (rect.Width() - cxIcon + 1) / 2;
   int y = (rect.Height() - cyIcon + 1) / 2;

   // Draw the icon
   dc.DrawIcon(x, y, m_hIcon);
}
else
{
   CDialog::OnPaint();
}
if (m_IsShow==TRUE)   
{
   CDC * dc= GetDC();                       
   int vpos = GetScrollPos(SB_VERT);
   int hpos = GetScrollPos(SB_HORZ);
   //dc->SetWindowOrg(0,pos);
   m_picture->Render(*dc,1-hpos,50-vpos,(int)(m_width/26.45),(int)(m_height/26.45)
    ,0,m_height,m_width,-m_height,NULL);    //重绘图像

}

}

void CCShowDlg::OnOK() 
{
// TODO: Add extra validation here
CFileDialog m_dlg(TRUE,"JPG",NULL,NULL,"JPG(*.jpg)|*.JPG|gif|*.gif",this);
if (m_dlg.DoModal()==IDOK)
{
   CString m_filename =m_dlg.GetPathName();
   m_dir.SetWindowText(m_filename);
   CFile m_file(m_filename,CFile::modeRead ); 
   DWORD m_filelen = m_file.GetLength(); //获取文件长度
   HGLOBAL m_hglobal = GlobalAlloc(GMEM_MOVEABLE,m_filelen); //在堆上分配指定大小空间
   LPVOID pvdata = NULL;   //锁定堆空间,获取指向堆空间的指针
   pvdata = GlobalLock(m_hglobal);//将文件数据读区到堆中
   m_file.ReadHuge(pvdata,m_filelen);
   IStream* m_stream;
   GlobalUnlock(m_hglobal);
   CreateStreamOnHGlobal(m_hglobal,TRUE,&m_stream);//在堆中创建流对象 
   OleLoadPicture(m_stream,m_filelen,TRUE,IID_IPicture,(LPVOID*)&m_picture); //利用流加载图像
   m_picture->get_Width(&m_width);
   m_picture->get_Height(&m_height); 
   CDC* dc = GetDC();
   m_IsShow = TRUE;
   CRect rect;
   GetClientRect(rect);
   SetScrollRange(SB_VERT,0,(int)(m_height/26.45)-rect.Height());
   SetScrollRange(SB_HORZ,0,(int)(m_width/26.45)-rect.Width());
   m_picture->Render(*dc,1,50,(int)(m_width/26.45),(int)(m_height/26.45),0,m_height,m_width,-m_height,NULL);
  
}
 
//CDialog::OnOK();
}

五、编译

六、运行

da942e101a9e9938cb80c45f.jpg

七、函数说明

       1、CFileDialog::CFileDialog函数声明

       explicit CFileDialog(BOOL bOPenFileDialog,LPCTSTR lpszDefExt=NULL,LPCTSTR lpszFile=NULL,DWORD dwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMP,LPCTSTR lpszFile=NULL,CWnd* pParentWnd=NULL,DWORD dwSize=0)

      bOpenfileDialog:设置TRUE则打开文件,设置FALSE则创建一个“另存为”对话框。

       lpszDefExt:默认的文件扩展名。

      lpszFileName:文件对话框内编辑框的初始文件名。设置为NULL,则无初始文件名。

      dwFlags:设置对话框风格。

       lpszFilter:选择对话框内显示的文件格式。

      pParentWnd:指向文件对话框父窗口的指针。

      dwSize:OPENFILENAME结构的大小。

      功能:创建一文件对话框。

      2、GlobalAlloc函数声明

       HGLOBAL GlobalAlloc(UINT uFlages,SIZE_T dwBytes)

       uFlags:内存空间分配方式。为GMEM_FIXED表示空间是固定的,为GMEM_MOVEABLE表示空间可以移动。

       dwBytes:分配空间的大小。

      功能:于堆上分配指定大小的空间。函数调用成功,返回新分配内存对象的句柄;否则返回NULL。

     3、GlobalLock函数声明

       LPVOID GlobalLock(HGLOBAL hMen)

        nMen:指向全局内存地址的句柄。

       功能:锁定一全局内存对象,同时获取指向该内存的指针。函数调用成功,返回内存对象的指针;否则返回NULL。

       4、CreateStreamOnHGlobal函数声明

      WINOLEAPI CreateStreamOnHGlobal(HGLOBAL hGlobal,BOOL fDelectOnRelease,LPSTREAM *ppstm)

       hGlobal:指向全局变量的句柄。

       fDeleteOnRelease:确定流对象释放时是否释放全局内存空间。

        ppstm:Istream接口指针。

      功能:创建一存储于堆的流对象。

       5、OleLoadPicture函数声明

       STDAPI OleLoadPicture(IStream* pStream,LONG lSize,BOOL fRunmode,REFIID riid,VOID ppvObj)

       pStream:流对象指针。

       lSize:从流中读取的数据的数量。

        fRunmode:确定是否采用与图像初始化属性相反的属性值。

       riid:接口指针的类型。

       ppvObj:与riid对应的图像对象指针。

        功能:按流对象内容创建一图像对象。函数调用成功,返回S_OK;参数pStream地址或ppvObj地址不存在,返回E_POINTER;系统不支持riid对应图像,返回E_NOINTFACE。

       6、IPicture::Render函数声明

       HRUESULT Render(HDC hdc,long x,long y,long cx,long cy,OLE_XPOS_HIMETRIC xSrc,OLE_XPOS_HIMETRIC ySrc,OLE_XPOS_HIMETRIC cxSrc,OLE_XPOS_HIMETRIC cySrc,LPCTSTR prcWBounds)

       hdc:指向设备上下文的句柄

       x:源图像的X坐标

       y:源图像的y坐标

       cx:目标图像的x坐标

       cy:目标图像的y坐标

       xSrc:源图横向偏置。

       ySrc:源图纵向偏置。

        cxSrc:源图纵向坐标

       cySrc:源图横向坐标

       prcWBounds:指向矩形的指针,此矩形包含目的位置。

       功能:将图像显示于指定画布。

       7、CFile::ReadHuge函数声明

       WORD ReadHuge(void* lpBuffer,DWORD dwCount)

        lpBuffer:指向内存地址的指针

        dwCount:读取文件的大小

        功能:读取文件至内存。函数调用成功,返回读取字数。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条