按钮中的位图消失

时间:2013-10-23 18:42:25

标签: mfc

我有一个CFormView SDI,可以调用并打开一个CDialog。 在CDialog中,我有一个显示位图的按钮。 一切顺利,直到我关闭CDialog。 当我打开相同的CDialog(使用创建功能)时,会出现按钮,按钮的功能就在那里,但位图会消失。

有人可以告诉我为什么后续调用CDialog时按钮上的位图会消失吗?

提前谢谢。

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

 void CTest4View::OnButton1() 
 {
     m_dialog_calculator.Create(IDD_DIALOG1, GetDesktopWindow());   
     m_dialog_calculator.ShowWindow(SW_SHOW);
 }

在CDialog中,我将位图放在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。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

快速修复:

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)。