按钮ID是IDOK,想在按下时用EndDialog()传递参数,但好像失败了。。。。

时间:2022-09-14 19:12:34
想根据登陆者的权限,令菜单栏里的选项变灰和可选。但好像不行。是不是按钮ID不能用IDOK啊。。请高手帮帮忙。。
程序的部分代码如下:(1)在IDOK的单击响映函数下有:
if (rsUser.MyGetRecordCount() <= 0)
{
::MessageBox(NULL,"密码输入不正确,请重新登录!","登录错误",MB_ICONINFORMATION); pEditPass->SetWindowText("");
pEditPass->SetFocus();
return;
}
else
{
//表明用户和密码输入完全正确
//这时利用EndDialog函数的参数来返回用户的权限
if (rsUser.m_Authority == "超级用户")
{
this->EndDialog(IDSUPER);
}
if (rsUser.m_Authority == "签到用户")
{
this->EndDialog(IDCHECK);
}
}
(2)又在函数InitInstance()中  
int red = dlg.DoModal();
if(red == IDSUPER)      issuper = true;
if (red == IIDCHECK) return issuper false;
(3)并在类CMyView中创建UPDATE_COMMAND_UI消息响映,增加代码:pCmdUI->Enable(issuper);

16 个解决方案

#1


说一下是怎么失败的,有什么问题

#2


太烦了,要取权限,传指针进去取出就行了
class CDlgA : public CDialog
{
..........
public:
    UINT m_right;
..........
}

CDlgA::OnButton1()
{
    CDlgB dlg;
    dlg.m_pright = &m_right;
     
    dlg.DoModal();
     .........

}

class CDlgB : public CDialog
{
..........
public:
    UINT *m_pright;
..........
}

CDlgB::OnOK()
{
.................
   *m_pright = IDSUPER;
.................
}

#3


就是超级用户进去以后,和普通用户一样菜单栏的选项还是灰。

#4


int red = dlg.DoModal(); 
在这里加个断点,看一下返回了什么,还有,你最后的语句到底是什么
if (red == IIDCHECK) return issuper false

#5


不好意思!最后一行应该是if (red == IIDCHECK)  issuper=false; 

#6


设了断点,red的值是-858993460表示什么啊!

#7


在if(red == IDSUPER)      issuper = true; 处设了断点是超级用户按下确定red的值是1;所以说this- >EndDialog(IDSUPER)是没传过来的了,我设的IDSUPER的值是100。。。

#8


LZ不要用this->看看,直接用EndDialog()看看,而且下面那个IIDCHECK是不是打错了啊

#9


你是不是在OnOK的最后又调用CDialog::OnOK()

如果是这样那就可以理解了,因为调用EndDialog并不立即的返回,而上面的函数等同于EndDialog(IDOK);

#10


是调用了CDialog::OnOK();但如果不调用的话,按了确定不会跳转啊!

#11


EndDialog就会啊。

#12


楼上的可不可以说详细点啊!

#13


我把CDialog::OnOK()去掉了不行啊!不会跳转啊!也有EndDialog在啊!

#14


EndDialog()肯定能关闭Dialog的。

你可以做个试验啊,随便的摆个按钮,在click里面EndDialog(100);看看效果。

也有可能是你的EndDialog根本没有执行到,加个断点看看。

#15


From MSDN:
CDialog::EndDialog 

This member function returns nResult as the return value of DoModal. You must use the EndDialog function to complete processing whenever a modal dialog box is created.

You can call EndDialog at any time, even in OnInitDialog, in which case you should close the dialog box before it is shown or before the input focus is set.

EndDialog does not close the dialog box immediately. Instead, it sets a flag that directs the dialog box to close as soon as the current message handler returns.

也就是说,用EndDialog是正确的,但是它是在当前Messagge处理完毕以后,才会让DoModal()返回你传入的值.

#16


   你在初始化的时候 应该使issuper=false; 这样在你选择之前按钮都是灰的
    在你选择之后根据你选择的按钮的ID号返回对话框 你可以这样
void Cmydlg::onXuanze()
{
  EndDialog(ID_号);
}
//In this way the Mydlg can get the choice you have made
in the viewClass you should include the header of Cmydlg the codes are as follows:
void CmyView::Onmenu()
{
   Cmydlg dlg;
   switch(dlg.Domodal())
{
   case ID_号:
         pCmdUI->Enable( TRUE);
               
         break;
       ……
       

 

#1


说一下是怎么失败的,有什么问题

#2


太烦了,要取权限,传指针进去取出就行了
class CDlgA : public CDialog
{
..........
public:
    UINT m_right;
..........
}

CDlgA::OnButton1()
{
    CDlgB dlg;
    dlg.m_pright = &m_right;
     
    dlg.DoModal();
     .........

}

class CDlgB : public CDialog
{
..........
public:
    UINT *m_pright;
..........
}

CDlgB::OnOK()
{
.................
   *m_pright = IDSUPER;
.................
}

#3


就是超级用户进去以后,和普通用户一样菜单栏的选项还是灰。

#4


int red = dlg.DoModal(); 
在这里加个断点,看一下返回了什么,还有,你最后的语句到底是什么
if (red == IIDCHECK) return issuper false

#5


不好意思!最后一行应该是if (red == IIDCHECK)  issuper=false; 

#6


设了断点,red的值是-858993460表示什么啊!

#7


在if(red == IDSUPER)      issuper = true; 处设了断点是超级用户按下确定red的值是1;所以说this- >EndDialog(IDSUPER)是没传过来的了,我设的IDSUPER的值是100。。。

#8


LZ不要用this->看看,直接用EndDialog()看看,而且下面那个IIDCHECK是不是打错了啊

#9


你是不是在OnOK的最后又调用CDialog::OnOK()

如果是这样那就可以理解了,因为调用EndDialog并不立即的返回,而上面的函数等同于EndDialog(IDOK);

#10


是调用了CDialog::OnOK();但如果不调用的话,按了确定不会跳转啊!

#11


EndDialog就会啊。

#12


楼上的可不可以说详细点啊!

#13


我把CDialog::OnOK()去掉了不行啊!不会跳转啊!也有EndDialog在啊!

#14


EndDialog()肯定能关闭Dialog的。

你可以做个试验啊,随便的摆个按钮,在click里面EndDialog(100);看看效果。

也有可能是你的EndDialog根本没有执行到,加个断点看看。

#15


From MSDN:
CDialog::EndDialog 

This member function returns nResult as the return value of DoModal. You must use the EndDialog function to complete processing whenever a modal dialog box is created.

You can call EndDialog at any time, even in OnInitDialog, in which case you should close the dialog box before it is shown or before the input focus is set.

EndDialog does not close the dialog box immediately. Instead, it sets a flag that directs the dialog box to close as soon as the current message handler returns.

也就是说,用EndDialog是正确的,但是它是在当前Messagge处理完毕以后,才会让DoModal()返回你传入的值.

#16


   你在初始化的时候 应该使issuper=false; 这样在你选择之前按钮都是灰的
    在你选择之后根据你选择的按钮的ID号返回对话框 你可以这样
void Cmydlg::onXuanze()
{
  EndDialog(ID_号);
}
//In this way the Mydlg can get the choice you have made
in the viewClass you should include the header of Cmydlg the codes are as follows:
void CmyView::Onmenu()
{
   Cmydlg dlg;
   switch(dlg.Domodal())
{
   case ID_号:
         pCmdUI->Enable( TRUE);
               
         break;
       ……