一道作业题,对各位来说一定都easy至极.可是我努力了一个星期最后还是有3个error.我本身真的不太会用vc++,上课也没学懂.请各位帮帮我吧,感激不禁!工程类型:SDI工程。
 
功能:1。在菜单 “文件-〉打开”项被点击后,要能弹出一个文件选择对话框。要求该对话框的“文件类型”comobox控件只能选择“BMP(*.bmp)”和“JPG(*.jpg)”两种文件类型。不能有“*.*”的选项。
 
2.在选择确定了图像文件之后,可以在客户区显示出该图像
3.在主菜单上添加一个新的选项:“设置”。该“设置”菜单有一个子菜单“参数”。
4.点击“参数”菜单之后,弹出一个Dialog。该Dialog的字体设定成宋体9号字。
  6.根据x,y的输入,可以将图像分成4块。
 
7.“File->save”菜单可以将这4块图像碎片保存成4个图像bmp文件。

解决方案 »

  1.   

    感觉都不难,但是要一一说明,还是不好说(你在相应的地方改动)
    另外一点就是,针对不同文件格式有不同的处理函数1, char FilterString[]="WZQ file(*.wzq)|*.wzq"; CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    FilterString);
    2,
    BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
    {
     CFile file;
     CFileException fe;
     if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
     {
      AfxMessageBox("文件打不开");
      return FALSE;
      }//打开文件
     DeleteContents();//删除文挡
     BeginWaitCursor();
     BITMAPFILEHEADER bmfHeader;//定义位图文件头结构
     DWORD dwBitsSize;
     HANDLE hDIB;
     LPSTR pDIB;
     BITMAPINFOHEADER *bmhdr;//指向位图信息头结构的指针
     dwBitsSize = file.GetLength();//得到文件长度
     if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=
                 sizeof(bmfHeader))
      return FALSE;
      if (bmfHeader.bfType != 0x4d42) file://检查是否为BMP文件
       return FALSE;
       hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE | 
                     GMEM_ZEROINIT, dwBitsSize);
       file://申请缓冲区
       if (hDIB == 0)
       {
        return FALSE;
       }
       pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); 
       file://得到申请的缓冲区的指针
       if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
         dwBitsSize - sizeof(BITMAPFILEHEADER) )
       {
        ::GlobalUnlock((HGLOBAL)hDIB);
        hDIB=NULL;
        return FALSE;
        }//读数据,包括位图信息、位图颜色表、图像像素的灰度值
       bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针付值
       ::GlobalUnlock((HGLOBAL)hDIB);
       if ((*bmhdr).biBitCount!=8) file://验证是否为8bit位图
        return FALSE;
        m_hDIB=hDIB;
        InitDIBData(); 
        file://自定义函数,根据读入的数据得到位图的宽、高、颜色表
        file:// 来得到初始化视的尺寸、生成调色板
        EndWaitCursor();
        SetPathName(lpszPathName);//设置存储路径
        SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE
        return TRUE;
       }3,这个你看看书吧
    4,这个在Dialog 中有设置单击右键-〉properties->General->Font->Size中进行更改
    5,
    6,觉得没什么问题但是要得到图像文件的大小
    7,保存文件
    BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName)
    {
     CFile file;
     CFileException fe;
     BITMAPFILEHEADER bmfHdr; // 位图文件头结构
     LPBITMAPINFOHEADER lpBI; file://指向位图信息结构的指针
     DWORD dwDIBSize;
     if (!file.Open(lpszPathName, CFile::modeCreate |
       CFile::modeReadWrite | CFile::shareExclusive, &fe))
     {
      AfxMessageBox("文件打不开");
     }//打开文件
     BOOL bSuccess = FALSE;
     BeginWaitCursor();
     lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) m_hDIB);
     if (lpBI == NULL)
      return FALSE;
      dwDIBSize = *(LPDWORD)lpBI + 256*sizeof(RGBQUAD);
       // Partial Calculation
      DWORD dwBmBitsSize;//BMP文件信息结构所占的字节数
      dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))  *lpBI->biHeight;// 存储时位图所有像素所占的总字节数
      dwDIBSize += dwBmBitsSize; 
      lpBI->biSizeImage = dwBmBitsSize; // 位图所有像素所占的总字节数
      file://以下五句为文件头结构填充值
      bmfHdr.bfType =0x4d42; // 文件为"BMP"类型
      bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);//文件总长度
      bmfHdr.bfReserved1 = 0;
      bmfHdr.bfReserved2 = 0;
      bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize
                + 256*sizeof(RGBQUAD);
      file://位图数据距问件头的偏移量
      file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));//写文件头
      file.WriteHuge(lpBI, dwDIBSize);
      file://将位图信息(信息头结构、颜色表、像素数据)写入文件
      ::GlobalUnlock((HGLOBAL) m_hDIB);
      EndWaitCursor();
      SetModifiedFlag(FALSE); // back to unmodified
      return TRUE;
     }
      

  2.   

    真的十分感谢!!!能给我写这么多的东西,对我真是太好了,比班里的同学都好!!!
    虽然我们根本都不认识,你能这样帮助我,让我太是感动了!!!!!!!
    真是个好心的人!!!!
    Thank you very much~~~~~~~~~~~~~~~!!!!!!!!!!!!!!!