用PictureEx类实现内存图片数据直接显示于picture控件
2011-06-27 04:35
471 查看
PictureEx类能支持bmp、jpg、gif、png等格式图片的显示,同时也提供了3中导入图片数据的接口:
第一种:以文件名形式直接导入图片
// i.e. Load(_T("mypic.gif"));
BOOL Load(LPCTSTR szFileName);
第二种:从全局内存区导入图片
// loads a picture from a global memory block (allocated by GlobalAlloc)
// Warning: this function DOES NOT free the global memory, pointed to by hGlobal
BOOL Load(HGLOBAL hGlobal, DWORD dwSize);
第三中:从MFC等导入程序的资源中导入
// loads a picture from a program resource
// i.e. Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));
BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);
当然,这里我们选用第2种方式。
废话少说,大家看看,一起学习
发送端发送代码:
void SendData()
{
CFile file;
if(!file.Open(filename,CFile::modeRead | CFile::shareDenyWrite))
{
AfxMessageBox("打开文件失败");
return;
}
image.dwsize = dwSize = file.GetLength();
HGLOBAL hGlobal;
hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwSize); //分配内存区
if(!hGlobal)
{
GetError();
AfxMessageBox("分配内存空间失败");
file.Close();
return ;
}
//锁定分配内存块
char *pData = reinterpret_cast<char*>(GlobalLock(hGlobal)); //reinterpret_cast是强制类型转换
if(!pData)
{
GetError();
file.Close();
GlobalFree(hGlobal);
AfxMessageBox("锁内存失败");
return;
}
try
{
file.Read(pData,dwSize); //这个很重要哦
}catch(CFileException e)
{
GlobalFree(hGlobal);
file.Close();
AfxMessageBox("读取文件失败");
}
file.Close();
sendto(cltsocket,pData,dwSize,0,(SOCKADDR*)&srvaddr,sizeof(SOCKADDR));
GetError();
GlobalFree(hGlobal);
GlobalUnlock(hGlobal);
closesocket(cltsocket);
}
接收端接收线程:
UINT ThreadFun2(LPVOID pThreadParam)//用来接收数据
{
while(1)
{
CChBmpDlg *pdlg = (CChBmpDlg*)pThreadParam;
// pdlg->SetDlgItemText(IDC_STATIC_TIME,"收到图片数据");
// char recvbuf[55815];
// struct ChImage image;
char *pData;
SOCKADDR_IN cltaddr;
int len = sizeof(cltaddr);
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,45000);//分配内存空间(字节),类似于new、malloc
// pdlg->GetError();
pData = reinterpret_cast<char*>(GlobalLock(hGlobal));
recvfrom(srv_socket,pData,45000,0,(SOCKADDR*)&cltaddr,&len);
pdlg->SetDlgItemText(IDC_STATIC_TIME,"收到图片数据");
pdlg->m_Show.Load(hGlobal,45000);
pdlg->m_Show.Draw(1.0);
GlobalFree(hGlobal);
GlobalUnlock(hGlobal);
}
return 0;
}
第一种:以文件名形式直接导入图片
// i.e. Load(_T("mypic.gif"));
BOOL Load(LPCTSTR szFileName);
第二种:从全局内存区导入图片
// loads a picture from a global memory block (allocated by GlobalAlloc)
// Warning: this function DOES NOT free the global memory, pointed to by hGlobal
BOOL Load(HGLOBAL hGlobal, DWORD dwSize);
第三中:从MFC等导入程序的资源中导入
// loads a picture from a program resource
// i.e. Load(MAKEINTRESOURCE(IDR_MYPIC),_T("GIFTYPE"));
BOOL Load(LPCTSTR szResourceName,LPCTSTR szResourceType);
当然,这里我们选用第2种方式。
废话少说,大家看看,一起学习
发送端发送代码:
void SendData()
{
CFile file;
if(!file.Open(filename,CFile::modeRead | CFile::shareDenyWrite))
{
AfxMessageBox("打开文件失败");
return;
}
image.dwsize = dwSize = file.GetLength();
HGLOBAL hGlobal;
hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwSize); //分配内存区
if(!hGlobal)
{
GetError();
AfxMessageBox("分配内存空间失败");
file.Close();
return ;
}
//锁定分配内存块
char *pData = reinterpret_cast<char*>(GlobalLock(hGlobal)); //reinterpret_cast是强制类型转换
if(!pData)
{
GetError();
file.Close();
GlobalFree(hGlobal);
AfxMessageBox("锁内存失败");
return;
}
try
{
file.Read(pData,dwSize); //这个很重要哦
}catch(CFileException e)
{
GlobalFree(hGlobal);
file.Close();
AfxMessageBox("读取文件失败");
}
file.Close();
sendto(cltsocket,pData,dwSize,0,(SOCKADDR*)&srvaddr,sizeof(SOCKADDR));
GetError();
GlobalFree(hGlobal);
GlobalUnlock(hGlobal);
closesocket(cltsocket);
}
接收端接收线程:
UINT ThreadFun2(LPVOID pThreadParam)//用来接收数据
{
while(1)
{
CChBmpDlg *pdlg = (CChBmpDlg*)pThreadParam;
// pdlg->SetDlgItemText(IDC_STATIC_TIME,"收到图片数据");
// char recvbuf[55815];
// struct ChImage image;
char *pData;
SOCKADDR_IN cltaddr;
int len = sizeof(cltaddr);
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,45000);//分配内存空间(字节),类似于new、malloc
// pdlg->GetError();
pData = reinterpret_cast<char*>(GlobalLock(hGlobal));
recvfrom(srv_socket,pData,45000,0,(SOCKADDR*)&cltaddr,&len);
pdlg->SetDlgItemText(IDC_STATIC_TIME,"收到图片数据");
pdlg->m_Show.Load(hGlobal,45000);
pdlg->m_Show.Draw(1.0);
GlobalFree(hGlobal);
GlobalUnlock(hGlobal);
}
return 0;
}
相关文章推荐
- 将内存中的图片数据显示到Picture图片控件上
- VC中GDI+双缓冲实现Picture控件中显示png图片
- 用CImage在picture控件上显示外部图片,并获取各像素颜色数据
- MFC实现picture控件显示jpg图片文件
- VC中GDI+双缓冲实现Picture控件中显示png图片
- VC中GDI+双缓冲实现Picture控件中显示png图片
- MFC picture control控件不失真自适应图片显示
- 基于MFC控件STATIC显示图片数据
- Image实现鼠标的拖动(自己做的图片显示控件)
- VC下利用Picture控件实现png图片按钮(鼠标初始、按下、松开、获得焦点四种状态)
- Repeater控件实现一行显示多条数据 Asp.net
- DataBind包括三大方法,Repeater,DataList和DataGrid,这些控件都位于 System.Web.UI.WebControls 命名空间中,从 WebControl 基类中直接或间接派生出来的。这些方法都是通过HTML来显示数据的内
- 关于table控件直接显示数据
- 使用picture控件动态显示图片方法
- GridView控件实现数据的显示和删除(第8节)
- android 文字叠加显示在图片之上控件的实现 -- 充分利用TextView
- C#中如何实现数据拖动?(拖动图片,到TextBox,并显示)
- Windows编程 内存中加载图片并显示 Direct离屏表面的实现
- 利用Repeater控件实现数据分页显示
- ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.