www.pudn.com > mfc2.rar > mfc2View.cpp, change:2014-08-14,size:5644b


// mfc2View.cpp : Cmfc2View 类的实现 
// 
 
#include "stdafx.h" 
#include "mfc2.h" 
 
#include "mfc2Doc.h" 
#include "mfc2View.h" 
#include "osconfig.h" 
#include  "dctk.h" 
#include "dcmimage.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
 
 
// Cmfc2View 
 
IMPLEMENT_DYNCREATE(Cmfc2View, CView) 
 
BEGIN_MESSAGE_MAP(Cmfc2View, CView) 
	// 标准打印命令 
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
// Cmfc2View 构造/析构 
 
Cmfc2View::Cmfc2View() 
{ 
	// TODO: 在此处添加构造代码 
 
} 
 
Cmfc2View::~Cmfc2View() 
{ 
} 
 
BOOL Cmfc2View::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: 在此处通过修改 
	//  CREATESTRUCT cs 来修改窗口类或样式 
 
	return CView::PreCreateWindow(cs); 
} 
 
// Cmfc2View 绘制 
 
void Cmfc2View::OnDraw(CDC* /*pDC*/) 
{ 
	const char* FileName=""; 
	const char* id=""; 
	const char* abc; 
	const char*	bcd; 
	const char*	patientsex; 
 
	FileName="C:/TXT.dcm"; 
	CDC* pDC=GetDC(); 
	 
	Cmfc2Doc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if (!pDoc) 
		return; 
DcmFileFormat * pDicomFile=new DcmFileFormat(); 
OFCondition Fcond=pDicomFile->loadFile(FileName);//打开文件,此处可以根据具体路径进行更改 
if(Fcond.good()) 
pDC->TextOut(50,50,(CString )"load file success");  
else 
  pDC->TextOut(50,50,(CString)"load file error"); 
 DcmDataset * pDataset=pDicomFile->getDataset(); 
 
OFString  ofstr; 
  
//pDataset->findAndGetOFString(DCM_PatientID,ofstr); 
pDataset->findAndGetOFString(DCM_PatientID,ofstr); 
pDataset->findAndGetString(DCM_PatientsName,abc);  
pDataset->findAndGetString(DCM_PatientsSex,patientsex);  
 
pDataset->findAndGetString(DCM_PatientsBirthDate,bcd); 
 
E_TransferSyntax xfer=pDataset->getOriginalXfer(); 
 
DicomImage* pDicomImg=new DicomImage(FileName,0,1,1); 
//DicomImage* pDicomImg=new DicomImage(pDataset,xfer,0,0,5); 
 
pDicomImg->rotateImage(180);//实现图像翻转的,可以去掉 
 
void * pDicomDibits;//dib设备无关位图的指针 
 unsigned long iDataSize= pDicomImg->createWindowsDIB(pDicomDibits,0,0,8,1,1); 
  
//这个函数比较重要,产生dib的指针,后面的参数为表示产生第一帧的8位的dib位图。 
  
  
  
//有了这个dib指针,我们就可以使用VC++的函数直接来显示图像了,但是我们没有调色板,所以,首先还得构造调色板。下面是构造调试板的内容。构造8位的调色板,主要关注的内容是BitmapInfoHeader.biHeight,BitmapInfoHeader.biWidth这两个参数,其它的都是固定的,下面的代码可以直接写到view类都OnDraw()函数中使用就可以显示了。 
  
BITMAPINFOHEADER   BitmapInfoHeader;    
 BitmapInfoHeader.biBitCount=8; 
 BitmapInfoHeader.biClrImportant=0; 
 BitmapInfoHeader.biClrUsed=0; 
 BitmapInfoHeader.biCompression=BI_RGB; 
 BitmapInfoHeader.biPlanes=1; 
 BitmapInfoHeader.biHeight=pDicomImg->getHeight();//得到图像的高度 
 BitmapInfoHeader.biWidth=pDicomImg->getWidth();//得到图像的宽度 
 BitmapInfoHeader.biXPelsPerMeter=0; 
 BitmapInfoHeader.biYPelsPerMeter=0; 
 BitmapInfoHeader.biSize=sizeof(BITMAPINFOHEADER); 
 BitmapInfoHeader.biSizeImage=0; 
 ////////////////////////////////////// 
  
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 RGBQUAD pColorTable[256]; 
 for(int i=0;i<256;i++) 
 { 
  
  pColorTable[i].rgbBlue=i; 
  pColorTable[i].rgbGreen=i; 
  pColorTable[i].rgbRed=i; 
  pColorTable[i].rgbReserved=0; 
 } 
 //定义一个bmpinfo需要内存大小的内存 
 char p[sizeof(BITMAPINFOHEADER)+256*4]; 
 memcpy(p,&BitmapInfoHeader,sizeof(BITMAPINFOHEADER)); 
 memcpy(p+sizeof(BITMAPINFOHEADER),pColorTable,1024); 
 PBITMAPINFO BitmapInfo = (PBITMAPINFO)p; 
  
 //颜色表 
 int colorTableLng; 
 colorTableLng=256; 
  
 // 创建调色板 
 HPALETTE hPalette=0,hOldPal; 
 if (colorTableLng!=0) 
 { 
  //定义颜色表指针pColorTable,指向DIB的颜色表 
  //申请缓冲区,生成LOGPALETTE结构 
  LPLOGPALETTE pLogPal = (LPLOGPALETTE)new char[2*sizeof(WORD) 
   +colorTableLng * sizeof(PALETTEENTRY)]; 
  pLogPal->palVersion = 0x300; 
  pLogPal->palNumEntries =colorTableLng; 
  for(int i = 0; i < colorTableLng; i++)  
  { 
   pLogPal->palPalEntry[i].peRed= pColorTable[i].rgbRed; 
   pLogPal->palPalEntry[i].peGreen =pColorTable[i].rgbGreen; 
   pLogPal->palPalEntry[i].peBlue = pColorTable[i].rgbBlue; 
   pLogPal->palPalEntry[i].peFlags = 0; 
  } 
  // 
  //创建逻辑调色板 
  hPalette =::CreatePalette(pLogPal); 
  // 将调色板选入系统 
  hOldPal=::SelectPalette(pDC->GetSafeHdc(), hPalette, TRUE); 
  //实现调色板 
  pDC->RealizePalette(); 
  //释放缓冲区 
  delete []pLogPal; 
 } 
  
 // 
 //DIB显示所需要的模式 
 pDC->SetStretchBltMode(COLORONCOLOR); 
  
  
  
//显示DIB到显示器, 
 ::StretchDIBits(pDC->GetSafeHdc(), 0, 0,BitmapInfoHeader.biWidth ,BitmapInfoHeader.biHeight, 
  0,0, BitmapInfoHeader.biWidth,BitmapInfoHeader.biHeight,pDicomDibits,BitmapInfo, DIB_RGB_COLORS, SRCCOPY); 
	 
	 
	// TODO: 在此处为本机数据添加绘制代码 
} 
 
 
// Cmfc2View 打印 
 
BOOL Cmfc2View::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// 默认准备 
	return DoPreparePrinting(pInfo); 
} 
 
void Cmfc2View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: 添加额外的打印前进行的初始化过程 
} 
 
void Cmfc2View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: 添加打印后进行的清除过程 
} 
 
 
// Cmfc2View 诊断 
 
#ifdef _DEBUG 
void Cmfc2View::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void Cmfc2View::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
Cmfc2Doc* Cmfc2View::GetDocument() const // 非调试版本是内联的 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Cmfc2Doc))); 
	return (Cmfc2Doc*)m_pDocument; 
} 
#endif //_DEBUG 
 
 
// Cmfc2View 消息处理程序