我只是想在项目中(单文档或多文档都可以)点击菜单项“打开”,弹出一个选择文件的对话框,选择一张图片,并在文档中打开。
我的代码是这样的,可以通过编译,但是运行报错(在打开文件选择框,选择完文件后,点击“打开”,出错,也没有显示出图片)
void CYtrytView::OnFileReopen() 
{
     char szFilter[] = "Bitmap(*.BMP)|*.BMP||";
     CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter);
     if(dlg.DoModal() == IDOK)
      {
         CString filename = dlg.GetPathName();
         HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL,filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
         m_pBmp = new CBitmap();
         m_pBmp->Attach(hBitmap);
      }
 CDC* pDC;
 OnDraw1(pDC);
}
void CYtrytView::OnDraw(CDC* pDC)
{
     CYtrytDoc* pDoc = GetDocument();
     ASSERT_VALID(pDoc);
     CDC dcMemory;
     CBitmap* pOldBmp;
     dcMemory.CreateCompatibleDC(pDC);
     pOldBmp = dcMemory.SelectObject(m_pBmp);
     pDC->BitBlt(0,0,100,100,
         &dcMemory,0,0,SRCCOPY);
     dcMemory.SelectObject(pOldBmp);
}

解决方案 »

  1.   

    其中OnFileReopen是建立的一个class wizard
      

  2.   

    无论什么方法,只要能在Document上显示位图就行,不是我的这段代码也行
      

  3.   

    可以去看看MSDN中的DIBLOOK例子
      

  4.   

    void CTestView::OnLoadimg() 
    {
    Invalidate();
            UpdateWindow();
    CDC *dc = GetDC();
    CDC THDC;
            HBITMAP THBM;
            BITMAP bmp;
    CFileDialog dlg(TRUE, NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL);
    if(dlg.DoModal() == IDOK)
    {
    OldFile = dlg.GetPathName();
    THBM=(HBITMAP)LoadImage(NULL,OldFile,IMAGE_BITMAP,0,0,
    LR_LOADFROMFILE|LR_CREATEDIBSECTION);//载入位图 
    GetObject(THBM,sizeof(bmp),&bmp);
    if(THDC == NULL)
    {
    THDC.CreateCompatibleDC(dc);
    }
    else
    {
    AfxMessageBox("图像处理出错,请关闭程序重新打开!");
    }
    GetObject(THBM,sizeof(bmp),&bmp);//取得位图信息 
    SelectObject(THDC,THBM);//选入位图至内存DC 
    dc->BitBlt(0,0,bmp.bmWidth, bmp.bmHeight,&THDC,0,0,SRCCOPY);
    DeleteObject(THBM);//删除位图 
    }
    ReleaseDC(dc);
    DeleteDC(THDC);

    }
    可以重复打开.
      

  5.   

    CDC MemDC;  

    MemDC.CreateCompatibleDC(&ClientDC);
    if(m_cs_path.GetLength() != 0)
    {
    m_Bitmap.m_hObject = ::LoadImage(AfxGetInstanceHandle(),m_cs_path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    MemDC.SelectObject(m_Bitmap.m_hObject);
    ::GetObject(m_Bitmap.m_hObject,sizeof(m_BM),&m_BM);
    ClientDC.PlgBlt(p,&MemDC,0,0,m_BM.bmWidth,m_BM.bmHeight,m_Bitmap1,0,0);

    MemDC.DeleteDC();
    m_Bitmap.DeleteObject();
    p是这样定义的
    p[0].x = 0;
    p[0].y = 0;
    p[1].x = 宽值;
    p[1].y = 0;
    p[2].x = 0;
    p[2].y = 高值;
    point p
      

  6.   

    谢谢yzh_510同志,我用了你的代码,已经通过了,并且显示了,谢谢你!!!
      

  7.   

    同时也非常感谢smartdrvsky同志的代码,但是我没有运行出来,可能是其中的参数我定义的不太准确,不过,我也不知道该怎样定义那个 p