一、创建对话框应用程序“显示JPG图像”
二、添加对话框资源并编辑之
三、添加变量、函数
1、添加变量
public:
CEdit m_dir;
public:
IPicture *m_picture;
OLE_XSIZE_HIMETRIC m_width;
OLE_YSIZE_HIMETRIC m_height;
BOOL m_IsShow;
2、添加函数
四、添加代码(红色部分)
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();
}
五、编译
六、运行
七、函数说明
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:读取文件的大小
功能:读取文件至内存。函数调用成功,返回读取字数。
文章评论(0条评论)
登录后参与讨论