В настоящее время я рисую текст из текстового поля в моем окне. Я успешно получил текст, который мне нужно нарисовать, и он рисует текст. Все нормально.
Вот проблема: когда я пишу что-то еще в поле ввода и снова рисую текст (нажатием кнопки), новый текст рисуется прямо поверх предыдущего текста, как и ожидалось.
Я новичок во всем этом, и я не могу найти способ очистить предыдущий текст, прежде чем рисовать новый текст.
Вот мой код:
void DrawMyText(HWND hwnd) {
int iTextLength = GetWindowTextLength(hDrawInput) + 1;
char cDrawText[1000] = "";
HDC wdc = GetWindowDC(hwnd);
RECT canvas;
canvas.left = 168;
canvas.top = 108;
canvas.right = 500;
canvas.bottom = 500;
GetWindowText(hDrawInput, cDrawText, iTextLength);
SetTextColor(wdc, 0x00FF0066);
SetBkMode(wdc,TRANSPARENT);
DrawText(wdc, cDrawText, -1, &canvas, DT_LEFT);
DeleteDC(wdc);
}
Любые советы о том, как это сделать? Я с удовольствием предоставлю любую дополнительную информацию, если это необходимо. Заранее спасибо!
DrawText больше похож на аэрозольный баллончик — он наносит поверх того, что уже есть. Я бы порекомендовал перейти на SetWindowText. Разница в том, что DrawText больше похож на вызов рендеринга Canvas, и он не учитывает тип элемента управления, на который он рисует. SetWindowText — это явное «установить текст этого окна на это конкретное значение», и оно специфично для текстовых элементов управления. Более того, он заменит текущий текст новым текстовым значением.
Если вам абсолютно необходимо сделать это с DrawText (т.е. вы предпочитаете холст-подход, как описано выше), то вам придется вручную очистить текстовую область с помощью чего-то вроде InvalidateRect () (используя RECT текстовой области). Или путем рисования прямоугольника, равного по размеру текстовой области и того же цвета, что и фон. Дайте мне знать, если это не достаточно подробно.
Если какое-то другое окно закрывает, а затем раскрывает место, где вы нарисовали текст, оно исчезнет! Иллюзия, что окна могут сидеть друг на друге, разрушена! Windows предоставляет схему для преодоления этой проблемы, но вы не сотрудничаете со схемой.
Нарисуйте свой текст только в ответ на сообщение WM_PAINT, используя вызовы API BeginPaint и EndPaint. При нажатии кнопки просто вызовите InvalidateRect, который попросит Windows отправить вам WM_PAINT. BeginPaint стирает ваше окно перед тем, как вы начнете рисовать. Таким образом, поместив код рисования в нужное место — обработчик WM_PAINT — вы решаете две проблемы: он стирает любой старый текст и перерисовывает всякий раз, когда открывается ваше окно.