我创建了一个CDialogBar对象,这个对象所用的对话框模板中有一个普通的按钮,无论
我将这个按钮的属性设置为disable或者在程序中用EnableWindow函数将其设置为disable状态时都会失效,也就是说这个按钮总处于enable状态,而这个对话框中的其它窗口就不会这样,不知大家有没有遇到过这个问题,还请指教。

解决方案 »

  1.   

    把处理按钮的消息写在CMainFrm里就可以了,具体的如下:
    在CMainFrm.h里的修改:
    先加一个公有成员:
    CDialogBar m_bar1;
    改消息函数:
    protected:
    //{{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    //}}AFX_MSG
    afx_msg void OnDialogBarButton();//手工添加响应CDialogBar上的按钮消息函数
    DECLARE_MESSAGE_MAP()下面的是在CMainFrm.cpp里修改的:BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
    ON_COMMAND(IDC_BUTTON1,OnDialogBarButton)//手工添加处理CDialogBar上的按钮消息,其中IDC_BUTTON1是你在对话框资源中定义的按钮ID
    END_MESSAGE_MAP()在OnCreate里有创建CDialogBar的代码:
    if(!m_bar1.Create(this,IDD_DIALOG1,CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY,ID_MYDIALOGBAR1))//创建对话框
    {
    AfxMessageBox("对话框工具条创建出错!");
    return;
    }
    //启动对话框工具条的任意停泊特性
    EnableDocking(CBRS_ALIGN_ANY);
    m_bar1.EnableDocking(CBRS_ALIGN_ANY);
    //将对话框放置于窗口左边
    DockControlBar(&m_bar1);还有就是别忘了处理按钮的函数:
    void CMainFrame::OnDialogBarButton()
    {
    MessageBox("DialogBarButton down!!");
    }
      

  2.   

    首先谢谢你的答复,不过你好像没有看清我的问题,我并不是问如何建立Message Map,我是问为什么不能将DialogBar中的按钮设置成无效状态。
      

  3.   

    没有问题的,我不知道你的做法是什么样的,我的做法是
    CButton *m_Button=(CButton *)m_wnddlgbar.GetDlgItem(IDC_***);
    EnableWindow(...);
      

  4.   

    不好意思,是没看清,那就用楼上的方法就可以
    CButton *m_Button=(CButton *)m_wnddlgbar.GetDlgItem(IDC_***);//其中IDC_***指你在对话框编辑器里给button起的ID
      

  5.   

    你们用的方法我试过,我还用CButton类的对象SubClassWindow那个窗体句柄,然后再EnableWindow(FALSE)这种方法,但都无法使该按钮无效。
      

  6.   

    我也试了一下,结果是:
             button=(CButton*)m_bar.GetDlgItem(IDC_BUTTON1);
    button->SetWindowText("fsaa");
    上面这样是可以改变按钮上的文字的,而换成EnableWindow就不可以了:
    button=(CButton*)m_bar.GetDlgItem(IDC_BUTTON1);
    button->EnableWindow(FALSE);
    即使直接在资源里把按钮的disabled属性选上都不可以。
    后来我发现可能是按钮又重新被击活了,所以我用以下代码,果然发现是这样的:
    but=(CButton*)m_bar1.GetDlgItem(IDC_BUTTON1);
    for(int i=0;i<200000;i++){
    but->EnableWindow(false);
    }
    用上述代码会发现按钮有短暂的变灰状态。
    用下面的方法可以实现:
    先在MainFrm.h中加入一个变量:
    bool ENABLE;
    并手工加入一个消息函数声明:
    afx_msg void OnupdataButton(CCmdUI *pCmdUI);
    然后在MainFrm.cpp中:
    先在初始化中加入:
    ENABLE=true;
    手工加入一个消息映射:
    ON_UPDATE_COMMAND_UI(IDC_BUTTON1,OnupdataButton)
    再写函数的实现代码:
    void CMainFrame::OnupdataButton(CCmdUI *pCmdUI)
    {
    if(ENABLE){
    pCmdUI->Enable(0);
    }
    else{
    pCmdUI->Enable(1);
    }
    }
    在你想改变此按钮的是否禁用处只要写ENABLE=!ENABLE;就可以了,楼主试试吧,在我这儿是可以的。