我尝试给一个软件换皮肤。直接用ON_COMMAND(ID_LOADSKIN, OnLoadskin)没有问题,其中ID_LOADSKIN是一个MENUITEM的ID(MENUITEM "&LoadSkin",ID_LOADSKIN), OnLoadskin()是负责换皮肤的method. 可当我改写ButtonPressed(CString m_ButtonName),并让相关button去做同样的事情时,

else if(m_ButtonName == "BUTTON_POP1")
{
   OnLoadskin();
}

程序会死掉,而debugger告诉我错在:
wincore.cpp
LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}我想大概是我有一些该清除/释放的东西没清除? 可我不是很懂。。 MENUITEM 与 BUTTON不该是一样的吗?为了这个突如其来的VC项目,我已经不断在试着看doc,书和源码,可两三个月的时间除了比较容易让人变得蓬头垢面老眼昏花,对我而言学好VC真的是不够。:p 帮帮忙吧。另外,msdn里说, 
ON_COMMAND( id, memberFxn )
...
It indicates which function will handle a command message from a command user-interface object such as a menu item or toolbar button. 
为什么我把ON_COMMAND(BUTTON_POP1, OnLoadskin)也加到BEGIN_MESSAGE_MAP里就什么反应都没有呢? 谢谢。

解决方案 »

  1.   

    你的按钮的Id与Name is not same
      

  2.   

    在.h文件中要加入相应函数声明
    afx_msg void OnLoadskin();
      

  3.   

    谢谢听风听雨,不过我的.h中声明了afx_msg void OnLoadskin();谢谢精灵,不过...
    UINT StringToID(CString m_ID)
    {
      struct ID
      {
        UINT m_ID;
        char* m_Name;
      } IDS[] = { BUTTON_PLAY, "BUTTON_PLAY",
                  BUTTON_MAXIMIZE, "BUTTON_MAXIMIZE",
         BUTTON_STOP, "BUTTON_STOP",
                  ...
                  BUTTON_POP1, "BUTTON_POP1",
         BUTTON_POP2, "BUTTON_POP2",
         ...};
      for(int i = 0; i < sizeof(IDS) / sizeof(ID); i++)
      {
        if(m_ID == IDS[i].m_Name)
          return IDS[i].m_ID;
      }
      return 0;
    }
    ID和name是一样的。Hmm, 怎么办呢?
      

  4.   

    顺便说一下,在我按下BUTTON_POP1后,可以选择档案,不过在真正换皮肤的时候会出问题... 可同样是call OnLoadskin(),用MENUITEM却完全正常。不明白..