有两个VC程序,TestSource,TestDest,其中TestSource中有一个显示缩略图的控件,可以显示很多图像,在其中选中一个图像时,通知TestDest中的图像显示控件显示这个选中的图像,实现的方式如下:
我通过CDibImage类操作图像,该类的代码很多地方可以下载。
1、在TestSource中注册Windows消息:
const UINT WM_PACS_IAMGE_SELECTED=RegisterWindowMessage("WM_PACS_IAMGE_SELECTED");
2、在TestSource中选中缩略图消息中,将CDibImage中的图像复制到一块内存中,然后将内存区域的大小和地址发送给TestDest:
HDIB hDib=m_pCurDib->GetHDIB();
DWORD dwDibSize = GlobalSize(hDib);
ASSERT(dwDibSize);
LPSTR lpDib = (LPSTR) ::GlobalLock(hDib);
ASSERT(lpDib);
LPSTR lpBuff=new char[dwDibSize];
CopyMemory(lpBuff,lpDib,dwDibSize);
//PWnd指向TestDest的主窗口
pWnd->SendMessage(WM_PACS_IAMGE_SELECTED,(WPARAM)dwDibSize,(LPARAM)lpBuff);
delete lpBuff;
GlobalUnlock(hDib);
3、在TestDest中注册同样的消息,并增加消息处理函数:
const UINT WM_PACS_IAMGE_SELECTED=RegisterWindowMessage("WM_PACS_IAMGE_SELECTED");
4、在TestDest的消息处理函数中增加如下的代码:
long nBufferSize=(long)wParam; // 读取缓冲区大小
LPVOID lpAddress=(LPVOID)lParam; // 图像文件在TestDest中的内存地址
LPVOID lpBuffer=new char[nBufferSize];
int ProcessID=GetProcessID("TestSource.exe");
HANDLE hProcessPacs=OpenProcess(PROCESS_ALL_ACCESS|PROCESS_VM_READ,TRUE,ProcessID);
if(hProcessPacs)
{
DWORD dwReadBytes=0;
if(ReadProcessMemory(hProcessPacs,lpAddress,lpBuffer,nBufferSize,&dwReadBytes))
{
CThumbnailView * pView=(CThumbnailView *)this->m_wndThumbnailBar.m_pView;
pView->AddNewImage(lpBuffer,nBufferSize);
}
else
{
DWORD dwError=GetLastError();
CString sErrMsg="";
}
}
CloseHandle(hProcessPacs);
delete lpBuffer;
这样在TestDest的缩略图控件中就实现了图像的显示。
主要上面代码中有一个函数 int ProcessID=GetProcessID("TestSource.exe");其功能时通过枚举系统中所有的进程,找到名称为TestSource.exe的进程ID,其代码如下:
int GetProcessID(LPCTSTR strExeName)
{
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32* processInfo=new PROCESSENTRY32;
processInfo->dwSize=sizeof(PROCESSENTRY32);
int index=0;
int processID=0;
while(Process32Next(hSnapShot,processInfo)!=FALSE)
{
CString sName;
sName.Format("%s",processInfo->szExeFile);
if(sName.CompareNoCase(strExeName)==0)
{
processID=processInfo->th32ProcessID;
break;
}
}
CloseHandle(hSnapShot);
delete processInfo;
return processID;
}