按钮中的位图消失

  • 本文关键字:消失 位图 按钮 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。有人可以帮我吗?

快速修复:

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) 将其隐藏。要再次激活它,请使用显示窗口(SW_SHOWNORMAL)。

最新更新