#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
это окно после установки нового текста.