【问题标题】:Displaying image in MFC method that is not ONPaint在不是 ONPaint 的 MFC 方法中显示图像
【发布时间】:2011-11-25 23:34:19
【问题描述】:

我正在尝试在对话框中动态显示图像,如果我将代码放在 on paint 方法中并从那里使用 dc,它就没有问题,虽然我需要在窗口之后显示,但我不能这样做显示,我正在使用的代码如下,我正在获取客户端窗口的 dc,从资源创建位图并“尝试”在窗口中显示它但没有显示,有什么建议可能是错误的吗?

void CProcessSteps::OnShowWindow(BOOL bShow, UINT nStatus) 
{
    CDialog::OnShowWindow(bShow, nStatus);  

    SetupInstructions();<-----------------Call To Method
}




void CProcessSteps::OnPaint() 
{   
    CPaintDC dc(this);
}

void CProcessSteps::SetupInstructions()
{
    CDC *pDC = new CDC();<------------------------------Problem starts here
    CFontUtil cfu;
    cfu.SetFont(&LineFont,30);

    CDC memDC;
    memDC.CreateCompatibleDC(pDC);

    int stepTop = 10;
    int stepEnd = 230;
    int imageLeft = 30;
    STEP_STRUCT* step;

    CBitmap iconImage;
    iconImage.LoadBitmap ( IDB_TID_CHECK );

    memDC.SelectObject(&iconImage);

    CRect iconRect;
    BITMAP bmInfo;
    iconImage.GetObject ( sizeof ( bmInfo ), &bmInfo );
    iconRect.SetRect ( imageLeft, stepTop, imageLeft+bmInfo.bmWidth, stepTop+bmInfo.bmHeight );

    pDC = this->GetDC();
    pDC->BitBlt(imageLeft, stepTop, imageLeft+bmInfo.bmWidth, stepTop+bmInfo.bmHeight, &memDC, 0, 0, SRCCOPY);

    //RedrawWindow();<-------- tried this here no luck

    int stepCount = m_pageStructure->PageSteps.GetCount();<----------------------------Bellow this works correctly

    POSITION pos = m_pageStructure->PageSteps.GetHeadPosition();
    while (pos)
    {
        step = m_pageStructure->PageSteps.GetNext(pos);

        CStatic *label = new CStatic;
        label->Create(_T( step->StepInstruction ),WS_CHILD | WS_VISIBLE, CRect(80, stepTop, 480, stepEnd), this);
        label->SetFont(&LineFont, true);


        label->GetWindowRect(rect);
        ScreenToClient(rect);

        pDC = label->GetDC();
        pDC->SelectObject(&LineFont);
        pDC->DrawText(step->StepInstruction, &rect, DT_CALCRECT|DT_WORDBREAK); 
        label->ReleaseDC(pDC);
        label->MoveWindow(rect);    

        stepTop += rect.Height();
        stepTop += 30;
        stepEnd += rect.Height();
    }
}

【问题讨论】:

  • 你应该使用 OnPaint,就是这样。
  • 注意你在OnShowWindow()调用中使用的过程,它在窗口显示和隐藏时都会被调用。

标签: c++ image mfc device


【解决方案1】:

您不能使用 OnPaint() 的原因尚不清楚。

当某个事件需要重绘全部或部分窗口时,通常的策略是调用InvalidateRect()

Windows 会依次向您的应用发送WM_PAINT(由您的OnPaint() 方法处理),指定应重绘窗口的哪个部分。

【讨论】:

    【解决方案2】:

    我认为 BeginPaint 功能不仅仅是为您提供 CDC。并且 BeginPaint 只能从 OnPaint 方法中调用。

    要解决您的问题,请使用 Invalidate-functions 从您的“SetupInstructions”方法中强制重新绘制。然后在 OnPaint 函数中进行绘图。

    【讨论】:

      【解决方案3】:

      我想CProcessSteps 是从CWnd 派生的,也许是一个 CDialog?

      如果您想在 CWnd 派生类的客户区中绘图,您必须使用 CWnd GetDC 方法获取 DC。我不明白你为什么要创建自己的CDC,你应该在SetupInstructions 的开头获取CWnd DC,并在任何地方使用这个DC,也可以创建你的memDC

      此外,如果您不为此变量调用 delete,则在分配内存(新 CStatic)时应小心,您将有内存泄漏。如果您确实需要动态创建此 CStatics,则必须保留指向所有这些 CStatics 的指针,以便在关闭对话框/视图之前删除它们。

      正如人们所建议的那样,我认为您使用 OnShowWindow 进行绘图的方式并不正确。你应该使用 OnPaint 来制作你的绘图东西,如果你不想在窗口完全初始化之前绘制图像,你应该使用窗口的成员变量(例如 bool)在构造函数中初始化为 false 并设置它当您准备好绘制图像时设置为 true。然后调用 Invalidate 将绘制图像。比如:

      在.h中:

      class CProcessSteps : CDialog
      {
         ...
      
      private:
         bool m_bReadyToDraw;
      }; 
      

      在.cpp中:

      CProcessSteps::CProcessSteps() : CDialog()
      { 
         m_bReadyToDraw = false;
      }
      
      BOOL CProcessSteps::OnInitDialog() 
      {
         CDialog:OnInitDialog();
      
         m_bReadyToDraw = true;
      
         return TRUE;
      }
      void CProcessSteps::OnPaint() 
      {   
          CPaintDC dc(this);
      
          if(m_bReadyToDraw)
          {
             CFontUtil cfu;
             cfu.SetFont(&LineFont,30);
      
             CDC memDC;
             memDC.CreateCompatibleDC(&dc);        
      
             ...
      
          }
      }
      

      希望对你有帮助。

      哈维尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多