Получение растрового изображения для изменения цвета при достижении предела - PullRequest
0 голосов
/ 08 февраля 2012

Хорошо, у меня возникли проблемы с возможностью изменения растровых изображений, когда один параметр больше другого. Я большой новичок в этом, и мое кодирование не очень хорошее (вообще). У меня есть код, который читает пределы (параметры) и отображается в виде текста, который является следующим:

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).`

1 Ответ

2 голосов
/ 08 февраля 2012

Ну, я думаю, что ваш вопрос немного беспорядочный, но ...

Во втором фрагменте кода, который вы разместили (я полагаю, из метода 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);

Может быть, с более подробным вопросом мы сможем вам помочь больше.

...