Обновление текста в элементе управления C Win32 API STATIC, нарисованном с помощью WS_EX_TRANSPARENT - PullRequest
3 голосов
/ 01 декабря 2009

У меня есть окно с некоторыми СТАТИЧЕСКИМИ метками и КНОПКАМИ. Я делаю все ЭТИКЕТКИ прозрачным фоном, чтобы сделать фон КРАСНЫМ. В 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;
} 

Марк, спасибо, это работает.

1 Ответ

3 голосов
/ 01 декабря 2009

Используйте InvalidateRect для прямоугольника, занятого элементом управления.

RECT rect;
GetClientRect(hctrl, &rect);
InvalidateRect(hctrl, &rect, TRUE);
MapWindowPoints(hctrl, hwnd, (POINT *) &rect, 2);
RedrawWindow(hwnd, &rect, NULL, RDW_ERASE | RDW_INVALIDATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...