【问题标题】:Getting a bitmap to change colour when a limit is reached达到限制时获取位图以更改颜色
【发布时间】:2012-02-08 11:23:23
【问题描述】:

好的,当某个参数大于另一个参数时,我无法更改位图。我是这个的新手,我的编码不是很好(根本)。我有读取限制(参数)并显示为文本的代码:

CFont* def_font = argDC->SelectObject(&m_Font);
   CString csText;
   int StartPos = WindowRect.Width()/5;
   CRect TextRect(StartPos, WindowRect.top + 5, StartPos + 100, WindowRect.top + 35);
   csText.Format(_T("%.2ft"), argSystemDataPtr->GetMaxSWL());
   int32_t iSWLDigits = csText.GetLength();
   if (iSWLDigits < m_SWLDigitsNum)
   {
      m_RedPanelBitmap.LoadBitmapW(IDB_BITMAP_PANEL_RED);
      //argDC->FillSolidRect(TextRect, RGB(255, 255, 255));
   }
   m_SWLDigitsNum = iSWLDigits;
   argDC->DrawText(csText, TextRect, DT_LEFT);

通常显示的位图是绿色的,但如果像上面那样违反限制,那么我希望位图更改为红色。这是我为绿色的。

CRect PanelRect1, PanelRect2;

         CRect PanelsRect(WindowRect);

         const int BarHeight = 30;
         PanelsRect.OffsetRect(0,m_bShowTitleBar?BarHeight:-BarHeight);
         PanelsRect.DeflateRect(0,m_bShowTitleBar?BarHeight*-1:BarHeight);


         m_GreenPanelBitmap.Detach();


         m_GreenPanelBitmap.LoadBitmapW(IDB_BITMAP_PANEL_GREEN);

         CBitmap* pOld = memDC.SelectObject(&m_GreenPanelBitmap);

         BITMAP bits;

         m_GreenPanelBitmap.GetObject(sizeof(BITMAP),&bits);

         PanelRect1.SetRect(0,PanelsRect.top, PanelsRect.right /2 , PanelsRect.Height()/3);
         PanelRect2.SetRect(0,PanelsRect.top+PanelRect1.Height(), PanelsRect.right /2 ,(PanelsRect.Height()/3) + PanelRect1.Height());


         //Now draw the Panels
         if (pOld != NULL)
         {

            argDC->StretchBlt(PanelRect1.left ,PanelRect1.top,PanelRect1.Width(),PanelRect1.Height(),
            &memDC,0,0,bits.bmWidth-1, bits.bmHeight-1, SRCCOPY);

            argDC->StretchBlt(PanelRect2.left,PanelRect2.top,PanelRect2.Width(),PanelRect2.Height(),
            &memDC,0,0,bits.bmWidth-1, bits.bmHeight-1, SRCCOPY);


            memDC.SelectObject(pOld);

我将非常感谢任何帮助,我知道可能有一个简单的答案,但我一直在摸索,似乎无法在其他任何地方找到关于如何将 m_GreenPanelBitmap 更改为 m_RedPanelBitmap 的答案陈述是正确的。

 `if (iSWLDigits < m_SWLDigitsNum).`

【问题讨论】:

  • 如何让位图更改为另一个? if (iSWLDigits

标签: c++ visual-c++ mfc bitmap


【解决方案1】:

嗯,我确实认为你的问题有点混乱,但是......

在您发布的第二个代码 sn-p 上(我想是通过对话框中的 OnPaint 方法),您正在使用 StretchBlt 显示绿色位图。 如果您的问题是您需要根据条件显示一个位图或另一个位图,您应该加载两个图像(也许您可以在其他地方执行此操作以避免每次绘制对话框时都加载图像),然后显示您真正需要的基于健康)状况。类似的东西:

bool bCondition = /*whatever*/

m_GreenPanelBitmap.LoadBitmapW(IDB_BITMAP_PANEL_GREEN);
m_RedPanelBitmap.LoadBitmapW(IDB_BITMAP_PANEL_RED);

CBitmap* pBitmapToDisplay = bCondition ? &m_GreenPanelBitmap : &m_RedPanelBitmap;

CBitmap* pOld = memDC.SelectObject(pBitmapToDisplay);

BITMAP bits;
pBitmapToDisplay->GetObject(sizeof(BITMAP),&bits);

PanelRect1.SetRect(0,PanelsRect.top, PanelsRect.right /2 , PanelsRect.Height()/3);
PanelRect2.SetRect(0,PanelsRect.top+PanelRect1.Height(), PanelsRect.right /2, PanelsRect.Height()/3) + PanelRect1.Height());

argDC->StretchBlt(PanelRect1.left ,PanelRect1.top,PanelRect1.Width(),PanelRect1.Height(),
            &memDC,0,0,bits.bmWidth-1, bits.bmHeight-1, SRCCOPY);

memDC.SelectObject(pOld);

也许有一个更详细的问题,我们可以为您提供更多帮助。

【讨论】:

  • 非常感谢。我很困惑会是什么条件。像指甲一样粗的道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多