Mfc 按钮中的位图消失

Mfc 按钮中的位图消失,mfc,Mfc,我有一个CFormView SDI,它调用并打开一个CDialog。 在CDialog中,我有一个显示位图的按钮。 在我关闭CDialog之前,一切正常。 当我打开同一个CDialog(使用create函数)时,按钮出现,按钮的功能在那里,但是位图消失了 有人能告诉我为什么按钮上的位图在随后调用CDialog时消失吗 先谢谢你 代码如下: 在CFormView中,我有一个创建CDialog的按钮: void CTest4View::OnButton1() { m_dialog_c

我有一个CFormView SDI,它调用并打开一个CDialog。 在CDialog中,我有一个显示位图的按钮。 在我关闭CDialog之前,一切正常。 当我打开同一个CDialog(使用create函数)时,按钮出现,按钮的功能在那里,但是位图消失了

有人能告诉我为什么按钮上的位图在随后调用CDialog时消失吗

先谢谢你

代码如下: 在CFormView中,我有一个创建CDialog的按钮:

 void CTest4View::OnButton1() 
 {
     m_dialog_calculator.Create(IDD_DIALOG1, GetDesktopWindow());   
     m_dialog_calculator.ShowWindow(SW_SHOW);
 }
在CDDialog中,我将位图放在InitDialog的按钮上:

  BOOL CCalculator::OnInitDialog() 
  {
    CDialog::OnInitDialog();
    if(!bitmapNew.LoadBitmap(IDB_BITMAP_NEW)){
    MessageBox("problem in loadbitmap");
    }
    if(!m_button.SetBitmap(bitmapNew)){
    MessageBox("problem in SetBitmap");
    }
    bitmapOpen.LoadBitmap(IDB_BITMAP_OPEN);
    m_buttonOpen.SetBitmap(bitmapOpen);
    //==========================

    return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
    }
经过进一步调查,问题似乎出在:m_button.SetBitmap(bitmapNew)中,因为它返回FALSE。有人能帮我吗?

快速修复:

void CTest4View::OnButton1() 
{
    // only create the dialog once
    if (m_dialog_calculator.m_hWnd==NULL)
        m_dialog_calculator.Create(IDD_DIALOG1, GetDesktopWindow());   
    m_dialog_calculator.ShowWindow(SW_SHOW);    
}
补充资料1:

OP在他的问题/代码中提供的信息非常少,所以我实际上必须重新创建一个类似的测试项目来猜测丢失的位图有什么问题。我发现,当按下按钮时,CDialog和CBitmap会被创建多次,这会导致后续的创建api调用失败,而不是第一次创建调用。结果是出现了一些意想不到的行为,如您现在所见

由于创建失败,程序在调试模式下运行时应该会生成一些断言错误,但我猜OP是在发布模式下编译的,所以所有警告都被抑制了

出现此问题的原因是,与正常的DoModal激活方式相比,计算器对话框创建为无模式对话框。执行这种无模式对话框的通常方法是通过监视m_hWnd成员变量只创建一次对话框。当用户想要关闭对话框时,它只是被隐藏而不是被破坏。这将完全避免所有的多重创建问题


我猜目前,计算器对话框被假定为关闭并通过点击对话框右上角的“X”按钮来销毁,实际上它只是隐藏的,但没有通过默认的CDialog处理被销毁。因此,关闭无模式计算器对话框的正确方法是覆盖OnClose事件,使用ShowWindow(SW_hide)将其隐藏。要再次激活它,请使用ShowWindow(SW_SHOWNORMAL)

源代码中可能有问题。也许你可以展示一些?嗨,Coder123,我希望用户能够关闭对话框,然后如果他们想重新打开它。问题正在重新打开。Coder123的解决方案工作得非常好,那么问题在哪里呢?嗨,Coder123--谢谢!那很有效!还有一个问题:如果我想知道对话框窗口是显示还是隐藏的,你能告诉我怎么做吗?@user2859884-IsWindowVisible。