У меня есть окно с некоторыми СТАТИЧЕСКИМИ метками и КНОПКАМИ.
Я делаю все ЭТИКЕТКИ прозрачным фоном, чтобы сделать фон КРАСНЫМ.
В CALLBACK я обрабатываю сообщение WM_CTLCOLORSTATIC, определяю идентификатор элемента управления с помощью GetDlgCtrlID () и затем:
SetBkMode((HDC)wParam, TRANSPARENT); // Make STATIC control Bkgd transparent
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);
Пока все хорошо. Форма нарисована, фон красный, а текст надписи нарисован сверху.
После взаимодействия с пользователем мне нужно изменить текст, поэтому я выдаю сообщение SetDlgItemText (), и новый текст рисуется. Проблема в том, что старый текст не стирается, а новый текст рисуется поверх него.
Прочитав сегодня немного, похоже, проблема в том, что родительский элемент управления (форма) отвечает за отрисовку фона. Это означает, что при изменении текста метки элемент управления перерисовывает новый текст, НО форма автоматически не перерисовывает фон.
Вопрос в том, КАК заставить форму перерисовать область прямоугольника элемента управления надписью (желательно без подклассов)?
ДОБАВЛЕНО:
Я пробовал следующее:
HWND hctrl;
hctrl = GetDlgItem(hwnd, ControlID);
RedrawWindow( hctrl, 0, 0,
RDW_UPDATENOW || RDW_ALLCHILDREN || RDW_FRAME || RDW_INVALIDATE || RDW_ERASE || RDW_INTERNALPAINT ); // RDW_UPDATENOW
и
Я вообще не обрабатываю сообщение WM_PAINT, только:
case WM_CTLCOLORSTATIC:
SetBkMode((HDC)wParam, TRANSPARENT);
return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);
int Library::SetControlTxt( int ControlID, string sText ) // Dialog Out
{
int RetVal;
RetVal = SetDlgItemText( hwnd, ControlID, sText.c_str() );
RECT rect;
HWND hctrl;
hctrl = GetDlgItem(hwnd, ControlID);
GetClientRect(hctrl, &rect);
MapWindowPoints(hctrl, hwnd, (POINT *)&rect, 2);
InvalidateRect(hwnd, &rect, TRUE);
return RetVal;
}
Марк, спасибо, это работает.