导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

【请教】关于重载OnOpenDocument的问题

okaimee 2010-08-11 09:33:45
我要实现的功能是:1、修改打开文件对话框中的下拉菜单选项(已实现)2、重载OnOpenDocument(),在其中调用第三方类库打开文件。

对于第一个功能我做了如下修改:
void Cdicomtest1App::OnFileOpen()
{
//自定义打开文件对话框
static char szFilter_in[]="DICOM文件(*.DCM)|*.DCM|BMP位图(*.bmp)|*.bmp|所有类型(*.*)|*.*||";
CFileDialog FileDlg(TRUE,"DCM",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter_in);
FileDlg.DoModal();
}
以及
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
目前此功能已实现


对于第二个功能,我做了如下修改
BOOL Cdicomtest1Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

return TRUE;
}
编译没问题,但是我发现我重载的OnOpenDocument似乎根本没有被调用,我在其中设置了断点,没有被触发。

实在找不出错误在哪?是哪里做错了还是漏了什么步骤?
...全文
286 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2010-08-11
doc中要加OnOpenDocument的响应。
回复
schlafenhamster 2010-08-11
不客气,你碰上我正好休暑假(不是学生噢)
回复
okaimee 2010-08-11
很感谢今天一天你都在帮我调程序,你实在是太伟大啦,可惜我没法请你吃饭,那只好你自己晚上多吃点了哈,嘿嘿^_^
回复
okaimee 2010-08-11
哈哈,是我犯了个很弱的错误,图像出来了,实在是太感谢了
/kiss
回复
schlafenhamster 2010-08-11
显示是view的事。
回复
okaimee 2010-08-11
非常感谢,我对Serialize进行了重载,代码如下:

void Cdicomtest1Doc::Serialize(CArchive& ar)
{
CFile *pFile;
pFile=ar.GetFile();
CString m_FileName=pFile->GetFilePath();
CString filetype=m_FileName.Right(3);

if(filetype=="dcm")
{
CObject::Serialize(ar);
m_pDicom=new CDicom();
m_pDicom->LoadFile(m_FileName);
}
else
{
m_pDib->Serialize(ar);
}

if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}

通过设置断点进行跟踪,看到第三方类库已经读取了文件数据,并赋给了CDib对象,但是目前还没能显示出来,不知道什么地方出了问题,我的逻辑思路应该是没错的吧?
回复
schlafenhamster 2010-08-11
// 可以得到名的
void CxxxxDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here

CFile *pFile;
pFile=ar.GetFile();
m_FileLen=pFile->GetLength();
m_FileName=pFile->GetFileName();
m_fntSize=atoi((LPSTR)(LPCSTR)m_FileName.Right(m_FileName.GetLength()-3));
if(!m_FileLen) return;
回复
okaimee 2010-08-11
我需要调用的第三方类库来读DCM文件,同时还需要读取BMP文件,目的是把图像数据存储到CDib对象中。读取BMP文件是CDib重载了Serialize方法,通过CArchive& ar来获得图像数据的。而调用的第三方类库来读DCM文件时需要文件路径才能读取图像数据,如果我重载Serialize方法,虽然方便将图像数据存储到CDib对象,但是却不能获得文件路径参数,如果我重载OnOpenDocument,虽然很容易获得路径参数,但是,我却没法将图像数据存储到CDib对象,我尝试在OnOpenDocument中直接将读取的图像数据赋给CDib对象,但是程序运行时没有效果,而且,有个问题,即使可以成功赋给CDib对象,那在DOC类中就不应该重载Serialize方法了,否则在Serialize方法中,CDib对象会再次从CArchive& ar中获取文件数据啊。但如果不重载,那么读取BMP文件就会因为没有获取文件数据而失败
CDib类采用的就是通用范例中的代码,自己写的部分代码如下,代码有点长:

BOOL Cdicomtest1Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

CString strPath =(CString)lpszPathName;
CString filetype=strPath.Right(3);
if(filetype=="dcm")
{
m_pDicom=new CDicom();
m_pDicom->LoadFile(lpszPathName);
}

return TRUE;
}


LoadFile方法源代码:

BOOL CDicom::LoadFile(const char *fileName)
{

//通过DCMTK打开文件
OFCondition Fcond=pDicomFile->loadFile(fileName);

if(Fcond.good())
{
DcmDataset* pDataset=pDicomFile->getDataset();
E_TransferSyntax xfer=pDataset->getOriginalXfer();
pDicomImg=new DicomImage((DcmObject*)pDataset,xfer,(const unsigned long)0,(const unsigned long)0,(const unsigned long)0);
m_pDib->BuildDIB(pDicomImg);
return TRUE;
}
else
{
return false;
}

}


BuildDIB方法源代码:

BOOL CDib::BuildDIB(DicomImage* pBuildDicomImg)
{
void* pDicomDibits;
//产生DIB结构数据区,iDataSize指向生成的数据区,后面的参数为表示产生第一帧的8位的dib位图。
unsigned long iDataSize=pBuildDicomImg->createWindowsDIB(pDicomDibits,0,0,8,1,1);

if(iDataSize==0)
{
MessageBox(NULL,"文件无法通过DCMTK读取","提示",MB_OK);
return FALSE;
}

/*创建DIB*/
//定义BITMAPINFO
//定义BITMAPINFOHEADER
BITMAPINFOHEADER BitmapInfoHeader;
BitmapInfoHeader.biBitCount=8;
BitmapInfoHeader.biClrImportant=0;
BitmapInfoHeader.biClrUsed=256;
BitmapInfoHeader.biCompression=BI_RGB;
BitmapInfoHeader.biPlanes=1;
BitmapInfoHeader.biHeight=pBuildDicomImg->getHeight();//得到图像的高度
BitmapInfoHeader.biWidth=pBuildDicomImg->getWidth();//得到图像的宽度
BitmapInfoHeader.biXPelsPerMeter=0;
BitmapInfoHeader.biYPelsPerMeter=0;
BitmapInfoHeader.biSize=sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biSizeImage=((((pBuildDicomImg->getWidth() * 8) + 31) & ~31) >> 3) * pBuildDicomImg->getHeight();

//定义RGBQUAD
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;

}

//为DIB位图分配内存
char* p=new char[sizeof(BITMAPINFOHEADER)+256*4+iDataSize];
memcpy(p,&BitmapInfoHeader,sizeof(BITMAPINFOHEADER));
memcpy(p+sizeof(BITMAPINFOHEADER),pColorTable,1024);
memcpy(p+sizeof(BITMAPINFOHEADER)+1024,pDicomDibits,iDataSize);
LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)p;

BOOL bSuccess = Create((LPBYTE)lpbi);

delete []p;
delete pDicomDibits;
return bSuccess;
}
回复
schlafenhamster 2010-08-11
说说“保存到CArchive& ar中”干什么
回复
okaimee 2010-08-11
OK,文中的问题我自己解决了,呵呵,在Cdicomtest1App::OnFileOpen忘记OpenDocumentFile了。
现在我在这个方法中遇到了新的问题。
我在OnOpenDocument()中调用第三方控件的到我需要的图像文件,我该怎么做才能把它保存到CArchive& ar中呢?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……