0

我有一个 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。有人可以帮帮我吗?

4

1 回答 1

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

于 2013-10-24T21:42:51.260 回答