Текст, нарисованный с помощью DrawText () на определенных цветах фона (когда SetBkMode имеет значение ПРОЗРАЧНО), является неприемлемо пятнистым: как преодолеть? - PullRequest
0 голосов
/ 11 октября 2018

В устаревшем приложении MFC я пытаюсь нарисовать темно-красный цвет (255, 26, 26) на фоне темы «Углерод» (97, 107, 136) в диалоговом окне.Хотя я использую библиотеку BCGSoft MFC , чтобы обернуть код, который рисует текст, основной код, выполняющий рисование текста, следующий:

    // CODE THAT DRAWS THE TEXT

    // Copied from BCGSoft's 'BCGPStatic.cpp' text-drawing routine

    // clrText is RGB(255, 26, 26)
    COLORREF clrTextOld = pDC->SetTextColor (clrText);

    // background is RGB(97, 107, 136)
    pDC->SetBkMode (TRANSPARENT);

    pDC->DrawText (strText, rectClient, uiDTFlags);

Проблема заключается в следующем: текстотображается неприемлемо пятнистый:


BLOTCHY TEXT

Blotchy text!

Если изменить цвет (ибольше ничего) до светло-красного (255, 164, 164), текст отображается очень хорошо:


ХОРОШИЙ ТЕКСТ

Text is OK

Поскольку шрифт, вероятно, имеет значение, вот код, который устанавливает шрифт:

    // SETTING THE FONT

    CFont * currentFont = staticCtl.GetFont();
    LOGFONT lf;
    memset(&lf, 0, sizeof(LOGFONT));
    currentFont->GetLogFont(&lf);
    lf.lfHeight = 18;
    lf.lfWeight = FW_BOLD;

    // I have ALSO TRIED:
    // CLEARTYPE_QUALITY
    // ANTIALIASED_QUALITY
    // NONANTIALIASED_QUALITY
    // PROOF_QUALITY
    // ...and just leaving it unset
    lf.lfQuality = CLEARTYPE_NATURAL_QUALITY;

    m_staticFontRed.CreateFontIndirect(&lf);
    staticCtl.SetFont(&m_staticFontRed);

    // The following are specific to BCGSoft
    staticCtl.m_hFont = (HFONT)(m_staticFontRed.GetSafeHandle());
    staticCtl.m_clrText = RGB(255, 164, 164);

Я тщательно исследовал это и попытался использовать столько «обходных путей», сколько смогудумать о.В частности:

  • Используйте TextOut вместо DrawText
  • Установите SetBkMode(OPAQUE) и просто заполните фон FillRect перед рисованием текста
  • УдалитьFW_BOLD от шрифта
  • Как отмечено во фрагменте кода, попробуйте различные «качества» в LOGFONT (NONANTIALIASED_QUALITY и т. Д.)

Чтоможно сделать, используя MFC / WinAPI (очевидно, в C ++), чтобы заставить мой выбор цвета для текста и фона работать так, чтобы текст был неприемлемо пятнистым?


ADDENDUM

Основываясь на комментарии @ BarmakShemirani, я увеличил пиксели и обнаружил, что они КРАСНЫЕ (после создания снимка экрана в виде растрового изображения).Поэтому, наверняка, казалось бы, эти пиксели генерируются на мониторе как КРАСНЫЕ и просто так не воспринимаются глазом.)

Вот изображение увеличенной версии:

Blotchiness-gone-when-zoomed-in

... Красные пиксели присутствуют (пятно исчезло).

Теперь я подозреваю, что это проблема с монитором, ине так, как пиксели рисуются на экране или человеческим глазом.

Благодаря @BarmakShemirani!


ADDENDUM 2

Я использую свой монитор в портретном режиме, что нетипично.Я просто повернул монитор в альбомную ориентацию, и тот же скриншот в моем вопросе значительно менее пятнистый.Это заставляет меня поверить, что это в основном проблема с МОНИТОРОМ, а не проблема ОС или «человеческого глаза».

... Интересно, некоторые мониторы справляются с этой ситуацией лучше, чем другие, или это «встроено»?большинству мониторов по какой-либо (уважительной) причине?

...