问3问题
在附件MapEdit 工程里的问题一:
在 void CBoxManMapEditerWnd::OnMenuAbout()ShellAbout(this->m_hWnd,TEXT("推箱子—编辑器"),TEXT("Version : WengTN"),NULL/*::LoadIcon(NULL,MAKEINTRESOURCE(IDR_MAINFRAME))*/);为什么这个函数最后一参数我设置了图标但不显示?问题二:
在 void CBoxManMapEditerWnd::OnMenuToolbar()我想改变菜单栏的 caption ,在帮助菜单里有“隐藏工具栏”,我希望点击后工具栏隐藏,并且菜单项的Caption 变成“显示工具栏”,要如何实现?还有点就是点工具栏上的“X”关闭我也希望菜单项相应变成“显示工具栏”,要如何实现?
问题三:
在 void CBoxMan_Edit::SaveMap(void)执行到下面两句会异常,为什么?
_fputts(strBuf, pFile);
_fputts(TEXT("\n"),pFile);bug 重现方法:随便画个地图,然后点“文件”--“保存”

解决方案 »

  1.   

    第一个这样改
    ShellAboutW(this->m_hWnd,TEXT("推箱子—编辑器"),TEXT("Version : WengTN"),::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)));
      

  2.   

    问题一:
    ShellAbout(this->m_hWnd,TEXT("推箱子—编辑器"),TEXT("Version : WengTN"),::LoadIcon(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)));
      

  3.   

    在CBoxManMapEditerWnd::OnCreate最后加入:
    this->SetIcon(::LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)), false);最好定义一个HICON成员变量,Load一次,多次使用。
      

  4.   

    那这编辑器主窗体上的图标(蓝色背景白线的)是哪段代码实现的?
    这个图标在资源文件Icon文件夹下都没看到这图标
      

  5.   

    问题二:
    void CBoxManMapEditerWnd::OnMenuToolbar()
    {
    MENUITEMINFO mii; mii.cbSize = sizeof(mii);
    mii.fMask = MIIM_STRING;
    if(m_bToolBarShow)
    {
    m_bToolBarShow = false;
    mii.dwTypeData = L"显示工具栏";
    }
    else
    {
    m_bToolBarShow =true;
    mii.dwTypeData = L"隐藏工具栏";
    }
    CMenu *mainMenu = this->GetMenu();
    CMenu *subMenu = mainMenu->GetSubMenu(2);
    subMenu->SetMenuItemInfo(0, &mii, true);
    this->DrawMenuBar();
    this->ShowControlBar(&this->m_wndToolBar, m_bToolBarShow, false);
    }
      

  6.   

    问题三:
    wmemset(strBuf,TEXT('0'),sizeof(strBuf));
    此行代码是宽字符操作,最后参数不能给sizeof,越界了,导致pFile被修改。
      

  7.   

    非常谢谢 cnzdgs 问题大部分都解决了在MapEdit.rc 里有 IDR_MAINFRAME           ICON                    "res\\BoxMan_Editer.ico"
    但我在资源视图里看到的 ID 为 IDR_MAINFRAME 的图标是(MFC 字样的),但实际显示在标题栏的却是(蓝色背景白线的)res\\BoxMan_Editer.ico 文件的图标而在 ShellAbout(this->m_hWnd,TEXT("推箱子—编辑器"),TEXT("Version : WengTN"),::LoadIcon(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME))); 这句语句作用下显示的又是(MFC 字样的)的图标这是为什么?还有问题二的,若工具栏是点“X”关闭的,要如何实现?问题三:
    我这么改为什么还不行?
    wmemset(strBuf,TEXT('0'),wcslen(strBuf));
    还有异常。
    谢谢! 
     
       
      

  8.   

    1、你的图标文件就是这样做的。一个图标文件中可以有多个图标,每个图标有不同的尺寸,在程序中有时需要16*16的,有时需要32*32的,如果图标文件中存在这样的图标就直接取对应的,如果不存在就利用存在的图标自动缩放。你重新做一个图标文件就可以了。
    2、这个似乎不太好处理,我想到的办法是自己派生一个类,替换调现在使用的CToolBar类,然后处理WM_WINDOWPOSCHANGED消息。记得把CBoxManMapEditerWnd::OnMenuToolbar中的menu部分代码都去掉,只保留ShowCtrlBar,以免重复。也许有其它更好的办法,不过我不清楚。
    3、strBuf未初始化,所以wcslen无法得到合理的值,wcslen是在字符串中查找'\0'的。你的这部分代码比较乱,wmemset是多余的,但后面的代码还有错。注意两点,一是字符串需要以'\0'结尾,二是字符串操作的长度单位需要是字符个数。你的m_tcMap中也都没有以'\0'结尾。另外提一下,这类情况的文件通常都用二进制格式保存。
      

  9.   

    非常谢谢   cnzdgs   还剩一个问题:就是那个图标MapEdit 工程资源视图里 Icon文件夹下的 IDR_MAINFRAME 文件的图标在编辑器里显示的是(MFC 字眼的),但在属性的Filename:res\BoxMan_Editer.ico 这对应的图标却是(蓝色背景白线的)这是为什么?
      

  10.   

    估计你是直接替换MFC图标文件的,貌似这里是有BUG,我也遇到过
    你重新添加一个ICON的资源,把res\BoxMan_Editer.ico放进去就可以了
    然后在LoadIcon(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));改成你相应的图标ID
      

  11.   

    估计你是直接替换MFC图标文件的,貌似这里是有BUG,我也遇到过
    你重新添加一个ICON的资源,把res\BoxMan_Editer.ico放进去就可以了
    然后在LoadIcon(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));改成你相应的图标ID
      

  12.   

    我在10楼已经回答了,再解释一下。
    你的BoxMan_Editer.ico文件中带有两个图标,一个是16*16的,就是蓝色背景白线的那个;另一个是32*32的,MFC那个。你在文件夹中切换查看方式(图标/列表)就可以看到这两个。
    你可以重新做一个ico文件,只要一个32*32的图标就可以。
      

  13.   

    非常感谢 cnzdgs 想问下,一个图标文件带有两图标。这种文件怎么做出来?还有就是他们的大小是怎么看出来的?我在两中查看方式下看到的属性都是 16 * 16 的
      

  14.   

    列表方式是用16*16的图标,图标方式是用32*32的图标。Windows资源管理器的属性可能是针对ico文件中的第1个图标的。