dicom 图像动态调整center with
void CMyDicomViewerView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if(beginX != 0 && beginY != 0)
{
int xCount = point.x - beginX;
int yCount = point.y - beginY;
if(abs(xCount) > 10 || abs(yCount) > 10)
{
beginX = point.x;
beginY = point.y;
CFrameWnd * mainFrame = (CFrameWnd *)AfxGetMainWnd();
if(!mainFrame)
{
return;
}
BOOL CMyDicomViewerDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
DcmFileFormat dfile;
OFCondition cond = dfile.loadFile(lpszPathName);
if (cond.bad()) {
AfxMessageBox(_T("上传文件有问题,请联系管理人员!"));
return FALSE;
}
m_dcmDataset = dfile.getDataset();
E_TransferSyntax xfer = m_dcmDataset ->getOriginalXfer();
di = new DicomImage(m_dcmDataset,xfer,CIF_AcrNemaCompatibility,1,2);
return MakeFile();
}
bool CMyDicomViewerDoc::MakeFile()
{
if(m_newCenter == 0 && m_newWidth == 0)
{
di->setHistogramWindow();
di->getWindow(m_defaultCenter,m_defaultWidth);
double minV = 0, maxV = 0;
double windowW = 0, windowC = 0;
DcmTagKey tagKeyC(0x0028, 0x1050);
DcmTagKey tagKeyW(0x0028, 0x1051);
const char * ww = NULL, * wc = NULL;
m_dcmDataset->findAndGetString(tagKeyC, wc, TRUE);
m_dcmDataset->findAndGetString(tagKeyW, ww, TRUE);
if(ww)
{
windowW = atol(ww);
}
if(wc)
{
windowC = atol(wc);
}
if(windowW == 0 && windowC == 0)
{
di->getMinMaxValues(minV, maxV, 0);
windowW = maxV - minV;
windowC = minV + ((long)windowW >> 1);
}
m_defaultCenter = windowC;
m_defaultWidth = windowW;
di->setWindow(m_defaultCenter,m_defaultWidth);
}else
{
di->setWindow(m_newCenter,m_newWidth);
}
DicomImage * dinow;
if(m_newfactor != 0)
{
dinow = di->createScaledImage(m_newfactor,0,1,1);
}else
{
if(di->getWidth() < 775)
{
dinow = di->createScaledImage((double)1,0,1,1);
}else
{
dinow = di->createScaledImage((const unsigned long)650,0,1,1);
}
}
if(dinow==NULL)
{
AfxMessageBox(_T("此DICOM图内没有图片,打开失败!"));
return FALSE;
}
if (dinow->getStatus() != EIS_Normal)
{
AfxMessageBox(DicomImage::getString(dinow->getStatus()));
return FALSE;
}
unsigned long fCount = dinow->getFrameCount();
m_images->RemoveAll();
for(unsigned long i = 0;i<fCount;i++)
{
ImageInfo* info = new ImageInfo;
void * bufferpic;
dinow->createWindowsDIB(bufferpic,0,0,24,1,1);
info->image = bufferpic;
BITMAPINFO m_bmiCurrentImage;
SIZE_T size = sizeof(m_bmiCurrentImage);
memset(&m_bmiCurrentImage, 0, size);
m_bmiCurrentImage.bmiHeader.biSize = sizeof(m_bmiCurrentImage.bmiHeader);
m_bmiCurrentImage.bmiHeader.biWidth = dinow->getWidth();;
m_bmiCurrentImage.bmiHeader.biHeight = dinow->getHeight();;
m_bmiCurrentImage.bmiHeader.biPlanes = 1;
m_bmiCurrentImage.bmiHeader.biBitCount = 24;
m_bmiCurrentImage.bmiHeader.biCompression = BI_RGB;
info->header = m_bmiCurrentImage;
m_images->AddTail(*info);
memset(&m_bmiCurrentImage, 0, size);
info = NULL;
}
delete dinow;
dinow = NULL;
return TRUE;
}
CFrameWnd * subFrame = (CFrameWnd *)mainFrame->GetActiveFrame();
if(!subFrame)
{
return;
}
CDocument * activeDoc = subFrame->GetActiveDocument();
if(!activeDoc)
{
return;
}
if(activeDoc->IsKindOf(RUNTIME_CLASS(CMyDicomViewerDoc)))
{
CMyDicomViewerDoc * mydoc = ((CMyDicomViewerDoc *)activeDoc);
if(mydoc->m_newCenter == 0 && mydoc->m_newWidth == 0)
{
mydoc->m_newCenter = mydoc->m_defaultCenter + xCount*10;
mydoc->m_newWidth = mydoc->m_defaultWidth + yCount*10;
}else
{
mydoc->m_newCenter += xCount*10;
mydoc->m_newWidth += yCount*10;
}
mydoc->MakeFile();
activeDoc->UpdateAllViews(NULL);
}
}
}
CScrollView::OnMouseMove(nFlags, point);
![](http://www.cnblogs.com/images/cnblogs_com/nanshouyong326/90398/o_20080126(020).jpg)