2401_87398956 2025-05-18 10:50 采纳率: 83.3%
浏览 16

用cfiledialog创建显示预览图片的对话框

我按照以下步骤操作 不知道为什么打开不了查找对话框 对话框不显示是什么原因 有人知道吗 详细步骤如下图两张 代码写在下面了,按教程说按道理按操作进行显示最后一张图的样子 但是就是不会显示 不知道哪里出了问题

img

img

void CCustomDlg::OnFileNameChange()

{

      CFileDialog::OnFileNameChange();

      

      CString exp;

      exp=GetFileExt();

      exp.MakeUpper(); //在比较扩展名时不区分大小写

      if(exp == "BMP") //显示位图

 {

            m_bitmap.SetIcon(NULL);

            m_bitmap.ModifyStyle(SS_ICON,SS_BITMAP);

            m_bitmap.SetBitmap((HBITMAP)LoadImage(NULL,GetPathName(),

                  IMAGE_BITMAP,100,100,LR_LOADFROMFILE));

 

            CFile file;

      if(!file.Open(GetPathName(),CFile::modeRead) )

            return;

 BITMAPFILEHEADER bmfHeader;

      //读位图文件头信息

      if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader)) != sizeof(bmfHeader))

            return;

 

      //读位图头信息

      BITMAPINFOHEADER bmiHeader; 

      if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) !=sizeof(bmiHeader))

            return ;

   //获得大小信息,并显示

      int bmWidth = bmiHeader.biWidth;

      int bmHeight = bmiHeader.biHeight;

      CString  swidth,sheight;

      swidth.Format("宽度:%d",bmWidth);

      sheight.Format("高度:%d",bmWidth);

      m_width.SetWindowText(swidth);

      m_height.SetWindowText(sheight);

      }

}

//在主窗体的“打开图片”按钮的单击事件中添加图片打开对话框的代码,实现代码如下:

void CBmpFileDlg::OnButton1() 

{

      CCustomDlg dlg(true,NULL,NULL,OFN_HIDEREADONLY | 

            OFN_OVERWRITEPROMPT|OFN_EXPLORER|OFN_ENABLETEMPLATE);

      dlg.DoModal();

}




img

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-05-18 11:31
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    根据你的描述和提供的代码,问题可能出现在以下几个方面:

    1. 对话框模板问题CCustomDlg 类可能没有正确加载对话框模板。
    2. 资源加载问题LoadImage 函数可能无法正确加载图片。
    3. 文件路径问题GetPathName() 返回的路径可能无效或不完整。
    4. 控件初始化问题:对话框中的控件(如 m_bitmapm_widthm_height)可能未正确初始化。

    以下是详细的解决方案步骤:

    解决方案步骤

    1. 确保对话框模板正确加载

      • 确保 CCustomDlg 的对话框模板资源 ID 正确设置,并且已经添加到资源文件中。
      • CCustomDlg 的构造函数中,确保调用了 DoModal() 前的初始化代码。
      CCustomDlg::CCustomDlg(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, 
                             LPCTSTR lpszFileName, DWORD dwFlags)
          : CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags,
                        NULL, NULL, TRUE)
      {
          // 加载对话框模板
          LoadTemplate(_T("IDD_CUSTOMDLG")); // 替换为实际的对话框资源 ID
      }
      
    2. 检查文件路径的有效性

      • 确保 GetPathName() 返回的路径是有效的。可以在调试时打印路径以确认。
      void CCustomDlg::OnFileNameChange()
      {
          CFileDialog::OnFileNameChange();
      
          CString path = GetPathName();
          TRACE(_T("Selected File Path: %s\n"), path); // 打印路径
      }
      
    3. 确保控件初始化正确

      • 确保对话框中的控件(如 m_bitmapm_widthm_height)已经通过 DDX_ControlGetDlgItem 初始化。
      void CCustomDlg::DoDataExchange(CDataExchange* pDX)
      {
          CFileDialog::DoDataExchange(pDX);
          DDX_Control(pDX, IDC_BITMAP, m_bitmap); // 替换为实际的控件 ID
          DDX_Control(pDX, IDC_WIDTH, m_width);
          DDX_Control(pDX, IDC_HEIGHT, m_height);
      }
      
    4. 检查 LoadImage 的返回值

      • LoadImage 可能返回 NULL,导致图片无法加载。需要检查返回值并处理错误。
      void CCustomDlg::OnFileNameChange()
      {
          CFileDialog::OnFileNameChange();
      
          CString exp;
          exp = GetFileExt();
          exp.MakeUpper();
      
          if (exp == "BMP") // 显示位图
          {
              m_bitmap.SetIcon(NULL);
              m_bitmap.ModifyStyle(SS_ICON, SS_BITMAP);
      
              HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, GetPathName(),
                                                   IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);
              if (!hBitmap)
              {
                  AfxMessageBox(_T("Failed to load image!"));
                  return;
              }
      
              m_bitmap.SetBitmap(hBitmap);
          }
      }
      
    5. 检查文件读取逻辑

      • 确保文件读取逻辑正确,特别是 BITMAPFILEHEADERBITMAPINFOHEADER 的读取。
      void CCustomDlg::OnFileNameChange()
      {
          CFileDialog::OnFileNameChange();
      
          CString exp;
          exp = GetFileExt();
          exp.MakeUpper();
      
          if (exp == "BMP") // 显示位图
          {
              m_bitmap.SetIcon(NULL);
              m_bitmap.ModifyStyle(SS_ICON, SS_BITMAP);
      
              HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, GetPathName(),
                                                   IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE);
              if (!hBitmap)
              {
                  AfxMessageBox(_T("Failed to load image!"));
                  return;
              }
      
              m_bitmap.SetBitmap(hBitmap);
      
              CFile file;
              if (!file.Open(GetPathName(), CFile::modeRead))
              {
                  AfxMessageBox(_T("Failed to open file!"));
                  return;
              }
      
              BITMAPFILEHEADER bmfHeader;
              if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
              {
                  AfxMessageBox(_T("Failed to read file header!"));
                  return;
              }
      
              BITMAPINFOHEADER bmiHeader;
              if (file.Read((LPSTR)&bmiHeader, sizeof(bmiHeader)) != sizeof(bmiHeader))
              {
                  AfxMessageBox(_T("Failed to read bitmap header!"));
                  return;
              }
      
              int bmWidth = bmiHeader.biWidth;
              int bmHeight = bmiHeader.biHeight;
      
              CString swidth, sheight;
              swidth.Format(_T("宽度:%d"), bmWidth);
              sheight.Format(_T("高度:%d"), bmHeight);
      
              m_width.SetWindowText(swidth);
              m_height.SetWindowText(sheight);
          }
      }
      
    6. 调试日志

      • 添加更多的调试日志来跟踪程序的执行流程。
      void CCustomDlg::OnFileNameChange()
      {
          TRACE(_T("OnFileNameChange called\n"));
      
          CFileDialog::OnFileNameChange();
      
          CString path = GetPathName();
          TRACE(_T("Selected File Path: %s\n"), path);
      
          CString ext = GetFileExt();
          ext.MakeUpper();
          TRACE(_T("File Extension: %s\n"), ext);
      
          if (ext == _T("BMP"))
          {
              TRACE(_T("Processing BMP file\n"));
              // 继续处理逻辑
          }
      }
      

    总结

    通过以上步骤,你应该能够找到并解决对话框无法显示的问题。如果问题仍然存在,请提供更多调试信息(如日志输出、崩溃堆栈等),以便进一步分析。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月18日