Как очистить заголовок этикетки?

#c #mfc

Вопрос:

Я использую метку с OnCtrlcolor событием:

Я установил цвет фона метки таким же, как у формы,

   if (iD == IDCmylabel)
      {
        pDC->SetTextColor(blue);
        COLORREF normal = RGB(245, 245, 245);
        pDC->SetBkColor(normal);
        return (HBRUSH)GetStockObject(NULL_BRUSH);
      }
 

Поэтому я подумал использовать toogle:

 SetWindowTextW("abc..."); // will show the color as expected.
SetWindowTextW(nullptr);  // will remove the text color.
 

Однако это не работает для меня (подпись не перерисовывалась, потому что она все еще там).

Как мне это исправить?

Комментарии:

1. Вам нужно будет добавить еще несколько деталей. Но почему вы пытаетесь изменить текст в OnCtlColor() обработчике?

2. Привет @AdrianMole, я использую OnCtrlcolor для изменения цвета текста. это просто моя пометка на бланке. в каком-то случае мое значение=0, поэтому мне нужно это очистить.

3. 1. "abc" не широк. 2. Используйте пустую строку вместо nullptr .

4. Привет @zdf, я пытался "", L"", " " , но, похоже, он игнорирует нуль или какой-то пробел. мое текущее решение-использовать много места, чтобы удалить его следующим образом: L" " . Я надеюсь найти лучший способ …

Ответ №1:

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

Если вам нужен элемент управления с определенным цветом фона, независимо от размера отображаемого текста, вам придется предоставить кисть сплошного цвета.

Самый простой способ сделать это-вернуть a DC_BRUSH с сопровождающим вызовом SetDCBrushColor , чтобы запросить цвет, т. е.

 if (iD == IDCmylabel) {
    pDC->SetTextColor(blue);
    COLORREF normal = RGB(245, 245, 245);
    // Still required so that the text background matches that of the rest
    pDC->SetBkColor(normal);
    // Request brush color for the control background
    pDC->SetDCBrushColor(normal);
    // Note: Stock objects do not need to be freed by client code
    return (HBRUSH)GetStockObject(DC_BRUSH);
}
 

С помощью этого вы можете вызывать SetWindowText с произвольными параметрами и получать желаемый результат.

Комментарии:

1. Привет, это действительно работает для меня вместо использования wstring(50,’ ‘).c_str(); спасибо вам!

Ответ №2:

Кому-то нужно стереть фон под старым текстом.

Вы возвращаетесь NULL_BRUSH , поэтому «стереть фон» ничего не делает.

Верните сплошную кисть цвета RGB(245, 245, 245) . Вам также может потребоваться вызвать Invalidate это окно после установки нового текста.